From 91e87f086fa3c00f10ba883087a4324a9d198f86 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Mon, 9 Sep 2024 14:49:36 -0400 Subject: [PATCH 01/45] feat: add cases_started migration --- ...9_09_181717_create_cases_started_table.php | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 database/migrations/2024_09_09_181717_create_cases_started_table.php diff --git a/database/migrations/2024_09_09_181717_create_cases_started_table.php b/database/migrations/2024_09_09_181717_create_cases_started_table.php new file mode 100644 index 0000000000..b7b85ecf5f --- /dev/null +++ b/database/migrations/2024_09_09_181717_create_cases_started_table.php @@ -0,0 +1,44 @@ +unsignedInteger('case_number')->primary(); + $table->unsignedInteger('user_id'); + $table->string('case_title', 255); + $table->string('case_title_formatted', 255); + $table->string('case_status', 20); + $table->json('processes'); + $table->json('requests'); + $table->json('request_tokens'); + $table->json('tasks'); + $table->json('participants'); + $table->timestamp('initiated_at')->nullable(); + $table->timestamp('completed_at')->nullable(); + $table->timestamps(); + $table->text('keywords'); + + $table->foreign('user_id')->references('id')->on('users'); + $table->index(['user_id', 'case_status', 'created_at']); + $table->index(['user_id', 'case_status', 'updated_at']); + $table->index(['case_title']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cases_started'); + } +}; From 794c160d3c0c3af2197e750e31ac6909e2b0b433 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Mon, 9 Sep 2024 16:22:16 -0400 Subject: [PATCH 02/45] feat: add cases started model --- ProcessMaker/Models/CaseStarted.php | 45 +++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 ProcessMaker/Models/CaseStarted.php diff --git a/ProcessMaker/Models/CaseStarted.php b/ProcessMaker/Models/CaseStarted.php new file mode 100644 index 0000000000..ebb5556292 --- /dev/null +++ b/ProcessMaker/Models/CaseStarted.php @@ -0,0 +1,45 @@ + AsArrayObject::class, + 'requests' => AsArrayObject::class, + 'request_tokens' => AsArrayObject::class, + 'tasks' => AsArrayObject::class, + 'participants' => AsArrayObject::class, + 'initiated_at' => 'datetime', + 'completed_at' => 'datetime', + ]; + + /** + * Get the user that owns the case. + */ + public function user() + { + return $this->belongsTo(User::class); + } +} From 55d771c037faf39d33bcccbaa8c95e5c6157c12c Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 11 Sep 2024 15:19:15 -0400 Subject: [PATCH 03/45] feat: add new get_all_cases endpoint --- .../Controllers/Api/V1_1/CaseController.php | 200 ++++++++++++++++++ .../Http/Requests/GetAllCasesRequest.php | 34 +++ .../Http/Resources/V1_1/CaseResource.php | 34 +++ ProcessMaker/Models/CaseStarted.php | 10 + database/factories/CaseStartedFactory.php | 80 +++++++ ...9_09_181717_create_cases_started_table.php | 5 +- routes/v1_1/api.php | 8 + 7 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php create mode 100644 ProcessMaker/Http/Requests/GetAllCasesRequest.php create mode 100644 ProcessMaker/Http/Resources/V1_1/CaseResource.php create mode 100644 database/factories/CaseStartedFactory.php diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php new file mode 100644 index 0000000000..db95aa009f --- /dev/null +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -0,0 +1,200 @@ +get('pageSize', 15); + + $query = CaseStarted::select($this->defaultFields); + + $this->filters($request, $query); + + $pagination = CaseResource::collection($query->paginate($pageSize)); + + return [ + 'data' => $pagination->items(), + 'meta' => [ + 'total' => $pagination->total(), + 'perPage' => $pagination->perPage(), + 'currentPage' => $pagination->currentPage(), + 'lastPage' => $pagination->lastPage(), + ], + ]; + } + + /** + * Apply filters to the query. + * + * @param Request $request + * @param Builder $query + * + * @return void + */ + private function filters(Request $request, Builder $query): void + { + if ($request->has('userId')) { + $query->where('user_id', $request->get('userId')); + } + + if ($request->has('status')) { + $query->where('case_status', $request->get('status')); + } + + $this->search($request, $query); + $this->filterBy($request, $query); + $this->sortBy($request, $query); + } + + /** + * Sort the query. + * + * @param Request $request: Query parameter format: sortBy=field:asc,field2:desc,... + * @param Builder $query + * + * @return void + */ + private function sortBy(Request $request, Builder $query): void + { + $sort = explode(',', $request->get('sortBy')); + + foreach ($sort as $value) { + if (!preg_match('/^[a-zA-Z_]+:(asc|desc)$/', $value)) { + continue; + } + + $sort = explode(':', $value); + $field = $sort[0]; + $order = $sort[1] ?? 'asc'; + + if (in_array($field, $this->sortableFields)) { + $query->orderBy($field, $order); + } + } + } + + /** + * Filter the query. + * + * @param Request $request: Query parameter format: filterBy[field]=value&filterBy[field2]=value2&... + * @param Builder $query + * @param array $dateFields List of date fields in current model + * + * @return void + */ + private function filterBy(Request $request, Builder $query): void + { + if ($request->has('filterBy')) { + $filterByValue = $request->get('filterBy'); + + foreach ($filterByValue as $key => $value) { + if (!in_array($key, $this->filterableFields)) { + continue; + } + + if (in_array($key, $this->dateFields)) { + $query->whereDate($key, $value); + continue; + } + + $query->where($key, $value); + } + } + } + + /** + * Search by case number or case title. + + * @param Request $request: Query parameter format: search=keyword + * @param Builder $query + * + * @return void + */ + private function search(Request $request, Builder $query): void + { + if ($request->has('search')) { + $search = $request->get('search'); + + $query->where(function ($q) use ($search) { + foreach ($this->searchableFields as $field) { + if ($field === 'case_number') { + $q->orWhere($field, 'like', "%$search%"); + } else { + $q->orWhereFullText($field, $search . '*', ['mode' => 'boolean']); + } + } + }); + } + } +} diff --git a/ProcessMaker/Http/Requests/GetAllCasesRequest.php b/ProcessMaker/Http/Requests/GetAllCasesRequest.php new file mode 100644 index 0000000000..99365a71bb --- /dev/null +++ b/ProcessMaker/Http/Requests/GetAllCasesRequest.php @@ -0,0 +1,34 @@ +|string> + */ + public function rules(): array + { + return [ + 'userId' => 'sometimes|integer', + 'status' => 'sometimes|in:in_progress,completed', + 'sortBy' => 'sometimes|string', + 'filterBy' => 'sometimes|array', + 'search' => 'sometimes|string', + 'pageSize' => 'sometimes|integer|min:1', + 'page' => 'sometimes|integer|min:1', + ]; + } +} diff --git a/ProcessMaker/Http/Resources/V1_1/CaseResource.php b/ProcessMaker/Http/Resources/V1_1/CaseResource.php new file mode 100644 index 0000000000..993a4a0184 --- /dev/null +++ b/ProcessMaker/Http/Resources/V1_1/CaseResource.php @@ -0,0 +1,34 @@ +$field; + } + + return $data; + } +} diff --git a/ProcessMaker/Models/CaseStarted.php b/ProcessMaker/Models/CaseStarted.php index ebb5556292..41019b5c6b 100644 --- a/ProcessMaker/Models/CaseStarted.php +++ b/ProcessMaker/Models/CaseStarted.php @@ -2,11 +2,16 @@ namespace ProcessMaker\Models; +use Database\Factories\CaseStartedFactory; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Casts\AsArrayObject; +use Illuminate\Database\Eloquent\Factories\Factory; use ProcessMaker\Models\ProcessMakerModel; class CaseStarted extends ProcessMakerModel { + use HasFactory; + protected $table = 'cases_started'; protected $fillable = [ @@ -35,6 +40,11 @@ class CaseStarted extends ProcessMakerModel 'completed_at' => 'datetime', ]; + protected static function newFactory(): Factory + { + return CaseStartedFactory::new(); + } + /** * Get the user that owns the case. */ diff --git a/database/factories/CaseStartedFactory.php b/database/factories/CaseStartedFactory.php new file mode 100644 index 0000000000..a6597a9669 --- /dev/null +++ b/database/factories/CaseStartedFactory.php @@ -0,0 +1,80 @@ + + */ +class CaseStartedFactory extends Factory +{ + protected $model = CaseStarted::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'case_number' => fake()->unique()->randomNumber(), + 'user_id' => fake()->randomElement([1, 3]), + 'case_title' => fake()->words(3, true), + 'case_title_formatted' => fake()->words(3, true), + 'case_status' => fake()->randomElement(['in_progress', 'completed']), + 'processes' => array_map(function() { + return [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(2, true), + ]; + }, range(1, 3)), + 'requests' => [ + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(2, true), + 'parent_request' => fake()->randomNumber(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(3, true), + 'parent_request' => fake()->randomNumber(), + ], + ], + 'request_tokens' => fake()->randomElement([fake()->randomNumber(), fake()->randomNumber(), fake()->randomNumber()]), + 'tasks' => [ + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(4, true), + ], + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(3, true), + ], + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(2, true), + ], + ], + 'participants' => [ + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + ], + 'initiated_at' => fake()->dateTime(), + 'completed_at' => fake()->dateTime(), + 'keywords' => '', + ]; + } +} diff --git a/database/migrations/2024_09_09_181717_create_cases_started_table.php b/database/migrations/2024_09_09_181717_create_cases_started_table.php index b7b85ecf5f..e3dafd2112 100644 --- a/database/migrations/2024_09_09_181717_create_cases_started_table.php +++ b/database/migrations/2024_09_09_181717_create_cases_started_table.php @@ -28,9 +28,12 @@ public function up(): void $table->text('keywords'); $table->foreign('user_id')->references('id')->on('users'); + $table->index(['user_id', 'case_status', 'created_at']); $table->index(['user_id', 'case_status', 'updated_at']); - $table->index(['case_title']); + + $table->fullText('case_title'); + $table->fullText('keywords'); }); } diff --git a/routes/v1_1/api.php b/routes/v1_1/api.php index fe1b6a01c7..f15b2d8f77 100644 --- a/routes/v1_1/api.php +++ b/routes/v1_1/api.php @@ -1,6 +1,7 @@ name('show.interstitial'); }); + + // Cases Endpoints + Route::name('cases.')->prefix('cases')->group(function () { + // Route to list all cases + Route::get('get_all_cases', [CaseController::class, 'getAllCases']) + ->name('cases.all_cases'); + }); }); From 2fc73d7c81c0a3ef6913ec1195a9c2485a0dcf90 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 12 Sep 2024 11:12:35 -0400 Subject: [PATCH 04/45] fix cr observations --- .../Controllers/Api/V1_1/CaseController.php | 10 +++++--- .../Http/Requests/GetAllCasesRequest.php | 5 ++-- .../Http/Resources/V1_1/CaseResource.php | 3 +++ ProcessMaker/Rules/SortBy.php | 25 +++++++++++++++++++ database/factories/CaseStartedFactory.php | 2 +- ...9_09_181717_create_cases_started_table.php | 2 +- 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 ProcessMaker/Rules/SortBy.php diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php index db95aa009f..301457724e 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -4,7 +4,6 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; -use Illuminate\Http\Response; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Requests\GetAllCasesRequest; use ProcessMaker\Http\Resources\V1_1\CaseResource; @@ -12,6 +11,9 @@ class CaseController extends Controller { + /** + * Default fields used in the query select statement. + */ protected $defaultFields = [ 'case_number', 'user_id', @@ -58,6 +60,8 @@ class CaseController extends Controller 'updated_at', ]; + const DEFAULT_SORT_DIRECTION = 'asc'; + /** * Get a list of all started cases. * @@ -136,7 +140,7 @@ private function sortBy(Request $request, Builder $query): void $sort = explode(':', $value); $field = $sort[0]; - $order = $sort[1] ?? 'asc'; + $order = $sort[1] ?? self::DEFAULT_SORT_DIRECTION; if (in_array($field, $this->sortableFields)) { $query->orderBy($field, $order); @@ -189,7 +193,7 @@ private function search(Request $request, Builder $query): void $query->where(function ($q) use ($search) { foreach ($this->searchableFields as $field) { if ($field === 'case_number') { - $q->orWhere($field, 'like', "%$search%"); + $q->orWhere($field, $search); } else { $q->orWhereFullText($field, $search . '*', ['mode' => 'boolean']); } diff --git a/ProcessMaker/Http/Requests/GetAllCasesRequest.php b/ProcessMaker/Http/Requests/GetAllCasesRequest.php index 99365a71bb..500cb15bf7 100644 --- a/ProcessMaker/Http/Requests/GetAllCasesRequest.php +++ b/ProcessMaker/Http/Requests/GetAllCasesRequest.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Http\Requests; use Illuminate\Foundation\Http\FormRequest; +use ProcessMaker\Rules\SortBy; class GetAllCasesRequest extends FormRequest { @@ -23,8 +24,8 @@ public function rules(): array { return [ 'userId' => 'sometimes|integer', - 'status' => 'sometimes|in:in_progress,completed', - 'sortBy' => 'sometimes|string', + 'status' => 'sometimes|in:IN_PROGRESS,COMPLETED', + 'sortBy' => ['sometimes', 'string', new SortBy], 'filterBy' => 'sometimes|array', 'search' => 'sometimes|string', 'pageSize' => 'sometimes|integer|min:1', diff --git a/ProcessMaker/Http/Resources/V1_1/CaseResource.php b/ProcessMaker/Http/Resources/V1_1/CaseResource.php index 993a4a0184..c483ecda30 100644 --- a/ProcessMaker/Http/Resources/V1_1/CaseResource.php +++ b/ProcessMaker/Http/Resources/V1_1/CaseResource.php @@ -6,6 +6,9 @@ class CaseResource extends ApiResource { + /** + * Default fields that will be included in the response. + */ protected static $defaultFields = [ 'case_number', 'user_id', diff --git a/ProcessMaker/Rules/SortBy.php b/ProcessMaker/Rules/SortBy.php new file mode 100644 index 0000000000..2fb3398141 --- /dev/null +++ b/ProcessMaker/Rules/SortBy.php @@ -0,0 +1,25 @@ + fake()->randomElement([1, 3]), 'case_title' => fake()->words(3, true), 'case_title_formatted' => fake()->words(3, true), - 'case_status' => fake()->randomElement(['in_progress', 'completed']), + 'case_status' => fake()->randomElement(['IN_PROGRESS', 'COMPLETED']), 'processes' => array_map(function() { return [ 'id' => fake()->randomNumber(), diff --git a/database/migrations/2024_09_09_181717_create_cases_started_table.php b/database/migrations/2024_09_09_181717_create_cases_started_table.php index e3dafd2112..2f9d32efe5 100644 --- a/database/migrations/2024_09_09_181717_create_cases_started_table.php +++ b/database/migrations/2024_09_09_181717_create_cases_started_table.php @@ -15,7 +15,7 @@ public function up(): void $table->unsignedInteger('case_number')->primary(); $table->unsignedInteger('user_id'); $table->string('case_title', 255); - $table->string('case_title_formatted', 255); + $table->text('case_title_formatted'); $table->string('case_status', 20); $table->json('processes'); $table->json('requests'); From d1313a26495b999872b23b81fb670b46151751f9 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 12 Sep 2024 13:51:37 -0400 Subject: [PATCH 05/45] feat: add cases_participated migration --- ...172734_create_cases_participated_table.php | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 database/migrations/2024_09_12_172734_create_cases_participated_table.php diff --git a/database/migrations/2024_09_12_172734_create_cases_participated_table.php b/database/migrations/2024_09_12_172734_create_cases_participated_table.php new file mode 100644 index 0000000000..0e28554f63 --- /dev/null +++ b/database/migrations/2024_09_12_172734_create_cases_participated_table.php @@ -0,0 +1,48 @@ +unsignedInteger('user_id'); + $table->unsignedInteger('case_number'); + $table->string('case_title', 255); + $table->text('case_title_formatted'); + $table->string('case_status', 20); + $table->json('processes'); + $table->json('requests'); + $table->json('request_tokens'); + $table->json('tasks'); + $table->json('participants'); + $table->timestamp('initiated_at')->nullable(); + $table->timestamp('completed_at')->nullable(); + $table->timestamps(); + $table->text('keywords'); + + $table->primary(['user_id', 'case_number']); + $table->foreign('user_id')->references('id')->on('users'); + + $table->index(['user_id', 'case_status', 'created_at']); + $table->index(['user_id', 'case_status', 'completed_at']); + + $table->fullText('case_title'); + $table->fullText('keywords'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cases_participated'); + } +}; From 9d58af062932ce1761ec6ccf4e5ed5bcef1f4c4f Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 12 Sep 2024 14:27:09 -0400 Subject: [PATCH 06/45] feat: add cases_participated model, factory --- ProcessMaker/Models/CaseParticipated.php | 55 +++++++++++++ .../factories/CaseParticipatedFactory.php | 77 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 ProcessMaker/Models/CaseParticipated.php create mode 100644 database/factories/CaseParticipatedFactory.php diff --git a/ProcessMaker/Models/CaseParticipated.php b/ProcessMaker/Models/CaseParticipated.php new file mode 100644 index 0000000000..60b076d795 --- /dev/null +++ b/ProcessMaker/Models/CaseParticipated.php @@ -0,0 +1,55 @@ + AsArrayObject::class, + 'requests' => AsArrayObject::class, + 'request_tokens' => AsArrayObject::class, + 'tasks' => AsArrayObject::class, + 'participants' => AsArrayObject::class, + 'initiated_at' => 'datetime', + 'completed_at' => 'datetime', + ]; + + protected static function newFactory(): Factory + { + return CaseParticipatedFactory::new(); + } + + /** + * Get the user that owns the case. + */ + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/database/factories/CaseParticipatedFactory.php b/database/factories/CaseParticipatedFactory.php new file mode 100644 index 0000000000..99157967f3 --- /dev/null +++ b/database/factories/CaseParticipatedFactory.php @@ -0,0 +1,77 @@ + + */ +class CaseParticipatedFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'user_id' => fake()->randomElement([1, 3]), + 'case_number' => fake()->unique()->randomNumber(), + 'case_title' => fake()->words(3, true),, + 'case_title_formatted' => fake()->words(3, true),, + 'case_status' => fake()->randomElement(['IN_PROGRESS', 'COMPLETED']), + 'processes' => array_map(function() { + return [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(2, true), + ]; + }, range(1, 3)), + 'requests' => [ + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(2, true), + 'parent_request' => fake()->randomNumber(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->words(3, true), + 'parent_request' => fake()->randomNumber(), + ], + ], + 'request_tokens' => fake()->randomElement([fake()->randomNumber(), fake()->randomNumber(), fake()->randomNumber()]), + 'tasks' => [ + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(4, true), + ], + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(3, true), + ], + [ + 'id' => fake()->numerify('node_####'), + 'name' => fake()->words(2, true), + ], + ], + 'participants' => [ + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + [ + 'id' => fake()->randomNumber(), + 'name' => fake()->name(), + ], + ], + 'initiated_at' => fake()->dateTime(), + 'completed_at' => fake()->dateTime(), + 'keywords' => fake(), + ]; + } +} From 1b66edfd7582d4652f092d5e3f514fb2f820e499 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 13 Sep 2024 10:10:27 -0400 Subject: [PATCH 07/45] feat: add get_in_progress, get_completed endpoints --- .../Controllers/Api/V1_1/CaseController.php | 71 +++++++++++++++++++ .../factories/CaseParticipatedFactory.php | 9 ++- routes/v1_1/api.php | 8 +++ 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php index 301457724e..a6333d048d 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -3,10 +3,12 @@ namespace ProcessMaker\Http\Controllers\Api\V1_1; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Requests\GetAllCasesRequest; use ProcessMaker\Http\Resources\V1_1\CaseResource; +use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; class CaseController extends Controller @@ -60,8 +62,12 @@ class CaseController extends Controller 'updated_at', ]; + const DEFAULT_PAGE_SIZE = 15; + const DEFAULT_SORT_DIRECTION = 'asc'; + public function __construct(private Request $request) {} + /** * Get a list of all started cases. * @@ -98,6 +104,52 @@ public function getAllCases(GetAllCasesRequest $request): array ]; } + public function getInProgress(GetAllCasesRequest $request): array + { + // CaseParticipated::factory()->count(1000)->create(); + + $pageSize = $request->get('pageSize', 15); + + $query = CaseParticipated::select($this->defaultFields) + ->where('case_status', 'IN_PROGRESS'); + + $this->filters($request, $query); + + $pagination = CaseResource::collection($query->paginate($pageSize)); + + return [ + 'data' => $pagination->items(), + 'meta' => [ + 'total' => $pagination->total(), + 'perPage' => $pagination->perPage(), + 'currentPage' => $pagination->currentPage(), + 'lastPage' => $pagination->lastPage(), + ], + ]; + } + + public function getCompleted(GetAllCasesRequest $request): array + { + $pageSize = $request->get('pageSize', 15); + + $query = CaseParticipated::select($this->defaultFields) + ->where('case_status', 'COMPLETED'); + + $this->filters($request, $query); + + $pagination = CaseResource::collection($query->paginate($pageSize)); + + return [ + 'data' => $pagination->items(), + 'meta' => [ + 'total' => $pagination->total(), + 'perPage' => $pagination->perPage(), + 'currentPage' => $pagination->currentPage(), + 'lastPage' => $pagination->lastPage(), + ], + ]; + } + /** * Apply filters to the query. * @@ -201,4 +253,23 @@ private function search(Request $request, Builder $query): void }); } } + + /** + * Handle pagination and return JSON response. + */ + private function paginateResponse($query): JsonResponse + { + $pageSize = $this->request->get('pageSize', self::DEFAULT_PAGE_SIZE); + $pagination = CaseResource::collection($query->paginate($pageSize)); + + return response()->json([ + 'data' => $pagination->items(), + 'meta' => [ + 'total' => $pagination->total(), + 'perPage' => $pagination->perPage(), + 'currentPage' => $pagination->currentPage(), + 'lastPage' => $pagination->lastPage(), + ], + ]); + } } diff --git a/database/factories/CaseParticipatedFactory.php b/database/factories/CaseParticipatedFactory.php index 99157967f3..c10c8b27e8 100644 --- a/database/factories/CaseParticipatedFactory.php +++ b/database/factories/CaseParticipatedFactory.php @@ -3,12 +3,15 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; +use ProcessMaker\Models\CaseParticipated; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\ProcessMaker\Models\CaseParticipated> */ class CaseParticipatedFactory extends Factory { + protected $model = CaseParticipated::class; + /** * Define the model's default state. * @@ -19,8 +22,8 @@ public function definition(): array return [ 'user_id' => fake()->randomElement([1, 3]), 'case_number' => fake()->unique()->randomNumber(), - 'case_title' => fake()->words(3, true),, - 'case_title_formatted' => fake()->words(3, true),, + 'case_title' => fake()->words(3, true), + 'case_title_formatted' => fake()->words(3, true), 'case_status' => fake()->randomElement(['IN_PROGRESS', 'COMPLETED']), 'processes' => array_map(function() { return [ @@ -71,7 +74,7 @@ public function definition(): array ], 'initiated_at' => fake()->dateTime(), 'completed_at' => fake()->dateTime(), - 'keywords' => fake(), + 'keywords' => '', ]; } } diff --git a/routes/v1_1/api.php b/routes/v1_1/api.php index f15b2d8f77..99623048d8 100644 --- a/routes/v1_1/api.php +++ b/routes/v1_1/api.php @@ -33,5 +33,13 @@ // Route to list all cases Route::get('get_all_cases', [CaseController::class, 'getAllCases']) ->name('cases.all_cases'); + + // Route to list all in-progress cases + Route::get('get_in_progress', [CaseController::class, 'getInProgress']) + ->name('cases.in_progress'); + + // Route to list all completed cases + Route::get('get_completed', [CaseController::class, 'getCompleted']) + ->name('cases.completed'); }); }); From c2ee0112b5baec228f1fbfafd80ba8e0998a0203 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 13 Sep 2024 15:07:05 -0400 Subject: [PATCH 08/45] feat: add case repository --- .../Contracts/CaseRepositoryInterface.php | 62 +++++ .../Controllers/Api/V1_1/CaseController.php | 245 +++--------------- ...llCasesRequest.php => CaseListRequest.php} | 2 +- ProcessMaker/Repositories/CaseRepository.php | 207 +++++++++++++++ 4 files changed, 309 insertions(+), 207 deletions(-) create mode 100644 ProcessMaker/Contracts/CaseRepositoryInterface.php rename ProcessMaker/Http/Requests/{GetAllCasesRequest.php => CaseListRequest.php} (95%) create mode 100644 ProcessMaker/Repositories/CaseRepository.php diff --git a/ProcessMaker/Contracts/CaseRepositoryInterface.php b/ProcessMaker/Contracts/CaseRepositoryInterface.php new file mode 100644 index 0000000000..77ada71955 --- /dev/null +++ b/ProcessMaker/Contracts/CaseRepositoryInterface.php @@ -0,0 +1,62 @@ +caseRepository = $caseRepository; + } + /* The comment block you provided is a PHPDoc block. It is used to document the purpose and usage of a method in PHP + code. In this specific block: */ /** * Get a list of all started cases. * @@ -83,181 +37,60 @@ public function __construct(private Request $request) {} * * @return array */ - public function getAllCases(GetAllCasesRequest $request): array - { - $pageSize = $request->get('pageSize', 15); - - $query = CaseStarted::select($this->defaultFields); - - $this->filters($request, $query); - - $pagination = CaseResource::collection($query->paginate($pageSize)); - - return [ - 'data' => $pagination->items(), - 'meta' => [ - 'total' => $pagination->total(), - 'perPage' => $pagination->perPage(), - 'currentPage' => $pagination->currentPage(), - 'lastPage' => $pagination->lastPage(), - ], - ]; - } - - public function getInProgress(GetAllCasesRequest $request): array - { - // CaseParticipated::factory()->count(1000)->create(); - - $pageSize = $request->get('pageSize', 15); - - $query = CaseParticipated::select($this->defaultFields) - ->where('case_status', 'IN_PROGRESS'); - - $this->filters($request, $query); - - $pagination = CaseResource::collection($query->paginate($pageSize)); - - return [ - 'data' => $pagination->items(), - 'meta' => [ - 'total' => $pagination->total(), - 'perPage' => $pagination->perPage(), - 'currentPage' => $pagination->currentPage(), - 'lastPage' => $pagination->lastPage(), - ], - ]; - } - - public function getCompleted(GetAllCasesRequest $request): array + public function getAllCases(CaseListRequest $request): JSonResponse { - $pageSize = $request->get('pageSize', 15); - - $query = CaseParticipated::select($this->defaultFields) - ->where('case_status', 'COMPLETED'); - - $this->filters($request, $query); - - $pagination = CaseResource::collection($query->paginate($pageSize)); - - return [ - 'data' => $pagination->items(), - 'meta' => [ - 'total' => $pagination->total(), - 'perPage' => $pagination->perPage(), - 'currentPage' => $pagination->currentPage(), - 'lastPage' => $pagination->lastPage(), - ], - ]; + $query = $this->caseRepository->getAllCases($request); + return $this->paginateResponse($query); } /** - * Apply filters to the query. + * Get a list of all started cases. * * @param Request $request - * @param Builder $query - * - * @return void - */ - private function filters(Request $request, Builder $query): void - { - if ($request->has('userId')) { - $query->where('user_id', $request->get('userId')); - } - - if ($request->has('status')) { - $query->where('case_status', $request->get('status')); - } - - $this->search($request, $query); - $this->filterBy($request, $query); - $this->sortBy($request, $query); - } - - /** - * Sort the query. * - * @param Request $request: Query parameter format: sortBy=field:asc,field2:desc,... - * @param Builder $query + * @queryParam userId int Filter by user ID. + * @queryParam sortBy string Sort by field:asc,field2:desc,... + * @queryParam filterBy array Filter by field=value&field2=value2&... + * @queryParam search string Search by case number or case title. + * @queryParam pageSize int Number of items per page. + * @queryParam page int Page number. * - * @return void + * @return array */ - private function sortBy(Request $request, Builder $query): void + public function getInProgress(CaseListRequest $request): JSonResponse { - $sort = explode(',', $request->get('sortBy')); - - foreach ($sort as $value) { - if (!preg_match('/^[a-zA-Z_]+:(asc|desc)$/', $value)) { - continue; - } - - $sort = explode(':', $value); - $field = $sort[0]; - $order = $sort[1] ?? self::DEFAULT_SORT_DIRECTION; - - if (in_array($field, $this->sortableFields)) { - $query->orderBy($field, $order); - } - } + $query = $this->caseRepository->getInProgressCases($request); + return $this->paginateResponse($query); } /** - * Filter the query. + * Get a list of all started cases. * - * @param Request $request: Query parameter format: filterBy[field]=value&filterBy[field2]=value2&... - * @param Builder $query - * @param array $dateFields List of date fields in current model + * @param Request $request * - * @return void - */ - private function filterBy(Request $request, Builder $query): void - { - if ($request->has('filterBy')) { - $filterByValue = $request->get('filterBy'); - - foreach ($filterByValue as $key => $value) { - if (!in_array($key, $this->filterableFields)) { - continue; - } - - if (in_array($key, $this->dateFields)) { - $query->whereDate($key, $value); - continue; - } - - $query->where($key, $value); - } - } - } - - /** - * Search by case number or case title. - - * @param Request $request: Query parameter format: search=keyword - * @param Builder $query + * @queryParam userId int Filter by user ID. + * @queryParam sortBy string Sort by field:asc,field2:desc,... + * @queryParam filterBy array Filter by field=value&field2=value2&... + * @queryParam search string Search by case number or case title. + * @queryParam pageSize int Number of items per page. + * @queryParam page int Page number. * - * @return void + * @return array */ - private function search(Request $request, Builder $query): void + public function getCompleted(CaseListRequest $request): JSonResponse { - if ($request->has('search')) { - $search = $request->get('search'); - - $query->where(function ($q) use ($search) { - foreach ($this->searchableFields as $field) { - if ($field === 'case_number') { - $q->orWhere($field, $search); - } else { - $q->orWhereFullText($field, $search . '*', ['mode' => 'boolean']); - } - } - }); - } + $query = $this->caseRepository->getCompletedCases($request); + return $this->paginateResponse($query); } /** * Handle pagination and return JSON response. + * + * @param Builder $query + * + * @return JsonResponse */ - private function paginateResponse($query): JsonResponse + private function paginateResponse(Builder $query): JsonResponse { $pageSize = $this->request->get('pageSize', self::DEFAULT_PAGE_SIZE); $pagination = CaseResource::collection($query->paginate($pageSize)); diff --git a/ProcessMaker/Http/Requests/GetAllCasesRequest.php b/ProcessMaker/Http/Requests/CaseListRequest.php similarity index 95% rename from ProcessMaker/Http/Requests/GetAllCasesRequest.php rename to ProcessMaker/Http/Requests/CaseListRequest.php index 500cb15bf7..c55e944406 100644 --- a/ProcessMaker/Http/Requests/GetAllCasesRequest.php +++ b/ProcessMaker/Http/Requests/CaseListRequest.php @@ -5,7 +5,7 @@ use Illuminate\Foundation\Http\FormRequest; use ProcessMaker\Rules\SortBy; -class GetAllCasesRequest extends FormRequest +class CaseListRequest extends FormRequest { /** * Determine if the user is authorized to make this request. diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php new file mode 100644 index 0000000000..532e5bff0b --- /dev/null +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -0,0 +1,207 @@ +defaultFields); + $this->applyFilters($request, $query); + return $query; + } + + /** + * Get all cases in progress + * + * @param Request $request + * + * @return Builder + */ + public function getInProgressCases(Request $request): Builder + { + $query = CaseParticipated::select($this->defaultFields) + ->where('case_status', 'IN_PROGRESS'); + $this->applyFilters($request, $query); + return $query; + } + + /** + * Get all completed cases + * + * @param Request $request + * + * @return Builder + */ + public function getCompletedCases(Request $request): Builder + { + $query = CaseParticipated::select($this->defaultFields) + ->where('case_status', 'COMPLETED'); + $this->applyFilters($request, $query); + return $query; + } + + /** + * Apply filters to the query. + * + * @param Request $request + * @param Builder $query + * + * @return void + */ + protected function applyFilters(Request $request, Builder $query): void + { + if ($request->has('userId')) { + $query->where('user_id', $request->get('userId')); + } + + if ($request->has('status')) { + $query->where('case_status', $request->get('status')); + } + + $this->search($request, $query); + $this->filterBy($request, $query); + $this->sortBy($request, $query); + } + + /** + * Search by case number or case title. + + * @param Request $request: Query parameter format: search=keyword + * @param Builder $query + * + * @return void + */ + public function search(Request $request, Builder $query): void + { + if ($request->has('search')) { + $search = $request->get('search'); + + $query->where(function ($q) use ($search) { + foreach ($this->searchableFields as $field) { + if ($field === 'case_number') { + $q->where($field, $search); + } else { + $q->orWhereFullText($field, $search . '*', ['mode' => 'boolean']); + } + } + }); + } + } + + /** + * Filter the query. + * + * @param Request $request: Query parameter format: filterBy[field]=value&filterBy[field2]=value2&... + * @param Builder $query + * @param array $dateFields List of date fields in current model + * + * @return void + */ + public function filterBy(Request $request, Builder $query): void + { + if ($request->has('filterBy')) { + $filterByValue = $request->get('filterBy'); + + foreach ($filterByValue as $key => $value) { + if (!in_array($key, $this->filterableFields)) { + continue; + } + + if (in_array($key, $this->dateFields)) { + $query->whereDate($key, $value); + continue; + } + + $query->where($key, $value); + } + } + } + + /** + * Sort the query. + * + * @param Request $request: Query parameter format: sortBy=field:asc,field2:desc,... + * @param Builder $query + * + * @return void + */ + public function sortBy(Request $request, Builder $query): void + { + $sort = explode(',', $request->get('sortBy')); + + foreach ($sort as $value) { + $sort = explode(':', $value); + $field = $sort[0]; + $order = $sort[1] ?? self::DEFAULT_SORT_DIRECTION; + + if (in_array($field, $this->sortableFields)) { + $query->orderBy($field, $order); + } + } + } +} From 5e23427b579b88aefdbea2f76243b807063217c1 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 13 Sep 2024 17:25:48 -0400 Subject: [PATCH 09/45] feat: add validation exception --- .../Exception/CaseValidationException.php | 20 +++++++++++++++ ProcessMaker/Repositories/CaseRepository.php | 25 +++++++++++-------- 2 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 ProcessMaker/Exception/CaseValidationException.php diff --git a/ProcessMaker/Exception/CaseValidationException.php b/ProcessMaker/Exception/CaseValidationException.php new file mode 100644 index 0000000000..dc070dbf51 --- /dev/null +++ b/ProcessMaker/Exception/CaseValidationException.php @@ -0,0 +1,20 @@ +json([ + 'message' => $this->getMessage(), + ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY); + } +} diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 532e5bff0b..89520985dc 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use ProcessMaker\Contracts\CaseRepositoryInterface; +use ProcessMaker\Exception\CaseValidationException; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; @@ -143,10 +144,10 @@ public function search(Request $request, Builder $query): void $query->where(function ($q) use ($search) { foreach ($this->searchableFields as $field) { - if ($field === 'case_number') { - $q->where($field, $search); - } else { + if ($field === 'case_title') { $q->orWhereFullText($field, $search . '*', ['mode' => 'boolean']); + } else { + $q->where($field, $search); } } }); @@ -169,7 +170,7 @@ public function filterBy(Request $request, Builder $query): void foreach ($filterByValue as $key => $value) { if (!in_array($key, $this->filterableFields)) { - continue; + throw new CaseValidationException("Filter by field $key is not allowed."); } if (in_array($key, $this->dateFields)) { @@ -192,14 +193,18 @@ public function filterBy(Request $request, Builder $query): void */ public function sortBy(Request $request, Builder $query): void { - $sort = explode(',', $request->get('sortBy')); + if ($request->has('sortBy')) { + $sort = explode(',', $request->get('sortBy')); + + foreach ($sort as $value) { + $sort = explode(':', $value); + $field = $sort[0]; + $order = $sort[1] ?? self::DEFAULT_SORT_DIRECTION; - foreach ($sort as $value) { - $sort = explode(':', $value); - $field = $sort[0]; - $order = $sort[1] ?? self::DEFAULT_SORT_DIRECTION; + if (!in_array($field, $this->sortableFields)) { + throw new CaseValidationException("Sort by field $field is not allowed."); + } - if (in_array($field, $this->sortableFields)) { $query->orderBy($field, $order); } } From dfb39d46795817a94da4d93935dfccac8b5bb396 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Mon, 16 Sep 2024 15:46:22 -0700 Subject: [PATCH 10/45] Update enterprise package --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6d22dd102b..4b197732b7 100644 --- a/composer.json +++ b/composer.json @@ -146,7 +146,7 @@ "package-ab-testing": "1.3.0", "package-actions-by-email": "1.19.0", "package-advanced-user-manager": "1.11.0", - "package-ai": "1.11.3", + "package-ai": "1.11.4", "package-analytics-reporting": "1.9.0", "package-auth": "1.21.0", "package-cdata": "1.4.5", From 7b3b940bfc7a16138240fd950d4f75fb88ba73e2 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Mon, 16 Sep 2024 15:46:58 -0700 Subject: [PATCH 11/45] Version 4.11.2-RC3 Build #e7c830d1 --- composer.json | 4 ++-- composer.lock | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 4b197732b7..6cdd5bb090 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.11.2-RC2", + "version": "4.11.2-RC3", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -104,7 +104,7 @@ "Gmail" ], "processmaker": { - "build": "d06a75a1", + "build": "e7c830d1", "custom": { "package-ellucian-ethos": "1.16.0", "package-plaid": "1.6.0", diff --git a/composer.lock b/composer.lock index a1458e62af..40fd7d401e 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": "bd0f60c2fc41245aab41bb5afce5d829", + "content-hash": "85fc87377bdb72d6952020ce0e023eb1", "packages": [ { "name": "aws/aws-crt-php", diff --git a/package-lock.json b/package-lock.json index 8686f29861..025fe272ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2-RC2", + "version": "4.11.2-RC3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.11.2-RC2", + "version": "4.11.2-RC3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index d1289e6bc4..ce009872a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2-RC2", + "version": "4.11.2-RC3", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", From c2415e6fd07b534d837344109d8338db14d15e2b Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Tue, 17 Sep 2024 00:46:51 -0700 Subject: [PATCH 12/45] Version 4.11.2 Build #f15ff287 --- composer.json | 4 ++-- composer.lock | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 6cdd5bb090..db0b537d9d 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.11.2-RC3", + "version": "4.11.2", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -104,7 +104,7 @@ "Gmail" ], "processmaker": { - "build": "e7c830d1", + "build": "f15ff287", "custom": { "package-ellucian-ethos": "1.16.0", "package-plaid": "1.6.0", diff --git a/composer.lock b/composer.lock index 40fd7d401e..c7d0bf5d92 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": "85fc87377bdb72d6952020ce0e023eb1", + "content-hash": "70bf1a923f33238c42db388cf5145377", "packages": [ { "name": "aws/aws-crt-php", diff --git a/package-lock.json b/package-lock.json index 025fe272ad..0bfcceb26a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2-RC3", + "version": "4.11.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.11.2-RC3", + "version": "4.11.2", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ce009872a5..c7192c567d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2-RC3", + "version": "4.11.2", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", From 0936002b4646e8fd8d5e96578f9a27d73760f415 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Mon, 16 Sep 2024 16:18:20 -0400 Subject: [PATCH 13/45] tests: case controller ep tests --- ...ace.php => CaseApiRepositoryInterface.php} | 2 +- .../Controllers/Api/V1_1/CaseController.php | 4 +- ...seRepository.php => CaseApiRepository.php} | 4 +- routes/v1_1/api.php | 6 +- tests/Feature/Api/V1_1/CaseControllerTest.php | 237 ++++++++++++++++++ 5 files changed, 245 insertions(+), 8 deletions(-) rename ProcessMaker/Contracts/{CaseRepositoryInterface.php => CaseApiRepositoryInterface.php} (97%) rename ProcessMaker/Repositories/{CaseRepository.php => CaseApiRepository.php} (97%) create mode 100644 tests/Feature/Api/V1_1/CaseControllerTest.php diff --git a/ProcessMaker/Contracts/CaseRepositoryInterface.php b/ProcessMaker/Contracts/CaseApiRepositoryInterface.php similarity index 97% rename from ProcessMaker/Contracts/CaseRepositoryInterface.php rename to ProcessMaker/Contracts/CaseApiRepositoryInterface.php index 77ada71955..b71ffdd0d2 100644 --- a/ProcessMaker/Contracts/CaseRepositoryInterface.php +++ b/ProcessMaker/Contracts/CaseApiRepositoryInterface.php @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; -interface CaseRepositoryInterface +interface CaseApiRepositoryInterface { /** * Get all cases diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php index e606de9ad2..ffa3056358 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -8,7 +8,7 @@ use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Requests\CaseListRequest; use ProcessMaker\Http\Resources\V1_1\CaseResource; -use ProcessMaker\Repositories\CaseRepository; +use ProcessMaker\Repositories\CaseApiRepository; class CaseController extends Controller { @@ -16,7 +16,7 @@ class CaseController extends Controller const DEFAULT_PAGE_SIZE = 15; - public function __construct(private Request $request, CaseRepository $caseRepository) { + public function __construct(private Request $request, CaseApiRepository $caseRepository) { $this->caseRepository = $caseRepository; } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseApiRepository.php similarity index 97% rename from ProcessMaker/Repositories/CaseRepository.php rename to ProcessMaker/Repositories/CaseApiRepository.php index 89520985dc..ccc6b14b92 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseApiRepository.php @@ -4,12 +4,12 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; -use ProcessMaker\Contracts\CaseRepositoryInterface; +use ProcessMaker\Contracts\CaseApiRepositoryInterface; use ProcessMaker\Exception\CaseValidationException; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; -class CaseRepository implements CaseRepositoryInterface +class CaseApiRepository implements CaseApiRepositoryInterface { /** * Default fields used in the query select statement. diff --git a/routes/v1_1/api.php b/routes/v1_1/api.php index 99623048d8..1c722ad5cb 100644 --- a/routes/v1_1/api.php +++ b/routes/v1_1/api.php @@ -32,14 +32,14 @@ Route::name('cases.')->prefix('cases')->group(function () { // Route to list all cases Route::get('get_all_cases', [CaseController::class, 'getAllCases']) - ->name('cases.all_cases'); + ->name('all_cases'); // Route to list all in-progress cases Route::get('get_in_progress', [CaseController::class, 'getInProgress']) - ->name('cases.in_progress'); + ->name('in_progress'); // Route to list all completed cases Route::get('get_completed', [CaseController::class, 'getCompleted']) - ->name('cases.completed'); + ->name('completed'); }); }); diff --git a/tests/Feature/Api/V1_1/CaseControllerTest.php b/tests/Feature/Api/V1_1/CaseControllerTest.php new file mode 100644 index 0000000000..f002e69643 --- /dev/null +++ b/tests/Feature/Api/V1_1/CaseControllerTest.php @@ -0,0 +1,237 @@ +create([ + 'username' => $username, + 'password' => Hash::make($password), + 'status' => $status, + ]); + } + + private function createCasesStartedForUser(int $userId, int $count = 1, $data = []) + { + return CaseStarted::factory()->count($count)->create(array_merge(['user_id' => $userId], $data)); + } + + private function createCasesParticipatedForUser(int $userId, int $count = 1, $data = []) + { + return CaseParticipated::factory()->count($count)->create(array_merge(['user_id' => $userId], $data)); + } + + public function test_get_all_cases(): void + { + $userA = $this->createUser('user_a'); + $cases = $this->createCasesStartedForUser($userA->id, 10); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases')); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + } + + public function test_get_in_progress(): void + { + $userA = $this->createUser('user_a'); + $cases = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + + $response = $this->apiCall('GET', route('api.1.1.cases.in_progress')); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonFragment(['case_status' => 'IN_PROGRESS']); + $response->assertJsonMissing(['case_status' => 'COMPLETED']); + } + + public function test_get_completed(): void + { + $userA = $this->createUser('user_a'); + $cases = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + + $response = $this->apiCall('GET', route('api.1.1.cases.completed')); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonFragment(['case_status' => 'COMPLETED']); + $response->assertJsonMissing(['case_status' => 'IN_PROGRESS']); + } + + public function test_get_all_cases_by_users(): void + { + $userA = $this->createUser('user_a'); + $userB = $this->createUser('user_b'); + + $casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesB = $this->createCasesStartedForUser($userB->id, 6, ['case_status' => 'COMPLETED']); + $casesC = $this->createCasesStartedForUser($userA->id, 4, ['case_status' => 'IN_PROGRESS']); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases')); + + $total = $casesA->count() + $casesB->count() + $casesC->count(); + $response->assertStatus(200); + $response->assertJsonCount($total, 'data'); + + $totalUserA = $casesA->count() + $casesC->count(); + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['userId' => $userA->id])); + $response->assertStatus(200); + $response->assertJsonCount($totalUserA, 'data'); + $response->assertJsonMissing(['user_id' => $userB->id]); + + $totalUserB = $casesB->count(); + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['userId' => $userB->id])); + $response->assertStatus(200); + $response->assertJsonCount($totalUserB, 'data'); + $response->assertJsonMissing(['user_id' => $userA->id]); + } + + public function test_get_all_cases_by_status(): void + { + $userA = $this->createUser('user_a'); + $userB = $this->createUser('user_b'); + + $casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + $casesB = $this->createCasesStartedForUser($userB->id, 6, ['case_status' => 'IN_PROGRESS']); + $casesC = $this->createCasesStartedForUser($userA->id, 4, ['case_status' => 'COMPLETED']); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['status' => 'IN_PROGRESS'])); + $response->assertStatus(200); + $response->assertJsonCount($casesB->count(), 'data'); + + $totalCompleted = $casesA->count() + $casesC->count(); + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['status' => 'COMPLETED'])); + $response->assertStatus(200); + $response->assertJsonCount($totalCompleted, 'data'); + } + + public function test_get_in_progress_by_user(): void + { + $userA = $this->createUser('user_a'); + $userB = $this->createUser('user_b'); + $userC = $this->createUser('user_c'); + $casesA = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesB = $this->createCasesParticipatedForUser($userB->id, 6, ['case_status' => 'IN_PROGRESS']); + $casesC = $this->createCasesParticipatedForUser($userC->id, 4, ['case_status' => 'IN_PROGRESS']); + + $response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userA->id])); + $response->assertStatus(200); + $response->assertJsonCount($casesA->count(), 'data'); + + $response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userB->id])); + $response->assertStatus(200); + $response->assertJsonCount($casesB->count(), 'data'); + + $response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userC->id])); + $response->assertStatus(200); + $response->assertJsonCount($casesC->count(), 'data'); + } + + public function test_search_all_cases_by_case_number(): void + { + $userA = $this->createUser('user_a'); + $this->createCasesStartedForUser($userA->id, 5); + $caseNumber = 123456; + $this->createCasesStartedForUser($userA->id, 1, ['case_number' => $caseNumber]); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases')); + $response->assertStatus(200); + $response->assertJsonCount(6, 'data'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['search' => $caseNumber])); + $response->assertStatus(200); + $response->assertJsonCount(1, 'data'); + } + + public function test_get_all_cases_sort_by_case_number(): void + { + $userA = $this->createUser('user_a'); + $cases = $this->createCasesStartedForUser($userA->id, 10); + $casesSorted = $cases->sortBy('case_number'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'case_number:asc'])); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonPath('data.0.case_number', $casesSorted->first()->case_number); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'case_number:desc'])); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonPath('data.0.case_number', $casesSorted->last()->case_number); + } + + public function test_get_all_cases_sort_by_completed_at(): void + { + $userA = $this->createUser('user_a'); + $cases = $this->createCasesStartedForUser($userA->id, 10); + $casesSorted = $cases->sortBy('completed_at'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:asc'])); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonPath('data.0.completed_at', $casesSorted->first()->completed_at->format('Y-m-d\TH:i:s.u\Z')); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:desc'])); + $response->assertStatus(200); + $response->assertJsonCount($cases->count(), 'data'); + $response->assertJsonPath('data.0.completed_at', $casesSorted->last()->completed_at->format('Y-m-d\TH:i:s.u\Z')); + } + + public function test_get_all_cases_sort_by_invalid_field(): void + { + $invalidField = 'invalid_field'; + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => $invalidField])); + $response->assertStatus(422); + $response->assertJsonPath('message', 'The sortBy must be a comma-separated list of field:asc|desc.'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => "$invalidField:asc"])); + $response->assertStatus(422); + $response->assertJsonFragment(['message' => "Sort by field $invalidField is not allowed."]); + } + + public function test_get_all_cases_filter_by(): void + { + $userA = $this->createUser('user_a'); + $casesA = $this->createCasesStartedForUser($userA->id, 5); + $caseNumber = 123456; + $casesB = $this->createCasesStartedForUser($userA->id, 1, ['case_number' => $caseNumber, 'case_status' => 'IN_PROGRESS']); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases')); + $response->assertStatus(200); + $response->assertJsonCount(6, 'data'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => ['case_number' => $caseNumber]])); + $response->assertStatus(200); + $response->assertJsonCount(1, 'data'); + $response->assertJsonFragment(['case_number' => $caseNumber]); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => ['case_status' => 'IN_PROGRESS']])); + $response->assertStatus(200); + $total = $casesA->where('case_status', 'IN_PROGRESS')->count() + $casesB->where('case_status', 'IN_PROGRESS')->count(); + $response->assertJsonCount($total, 'data'); + $response->assertJsonFragment(['case_status' => 'IN_PROGRESS']); + $response->assertJsonMissing(['case_status' => 'COMPLETED']); + } + + public function test_get_all_cases_filter_by_invalid_field(): void + { + $invalidField = 'invalid_field'; + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => ''])); + $response->assertStatus(422); + $response->assertJsonPath('message', 'The Filter by field must be an array.'); + + $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => [$invalidField => 'value']])); + $response->assertStatus(422); + $response->assertJsonPath('message', "Filter by field $invalidField is not allowed."); + } +} From 840dd241e20554522e5bf337fa1871e83bfd1352 Mon Sep 17 00:00:00 2001 From: Eleazar Resendez Date: Wed, 18 Sep 2024 08:37:29 -0600 Subject: [PATCH 14/45] Set elementDestination to null for 'taskSource' case --- ProcessMaker/Models/ProcessRequestToken.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index 9ff29b4770..1b88fe7ca6 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -1234,7 +1234,7 @@ private function getElementDestination($elementDestinationType, $elementDestinat ]); break; case 'taskSource': - $elementDestination = $elementDestinationType; + $elementDestination = null; break; default: $elementDestination = null; From 1763205ec513a273b4a02697047ecae3925c2779 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Wed, 18 Sep 2024 19:47:48 -0700 Subject: [PATCH 15/45] Version 4.11.3 Build #821f14eb --- composer.json | 4 ++-- composer.lock | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index db0b537d9d..f591ce30a8 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.11.2", + "version": "4.11.3", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -104,7 +104,7 @@ "Gmail" ], "processmaker": { - "build": "f15ff287", + "build": "821f14eb", "custom": { "package-ellucian-ethos": "1.16.0", "package-plaid": "1.6.0", diff --git a/composer.lock b/composer.lock index c7d0bf5d92..810e0e5350 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": "70bf1a923f33238c42db388cf5145377", + "content-hash": "cfd04a0f3ee33c659f5333738092adeb", "packages": [ { "name": "aws/aws-crt-php", diff --git a/package-lock.json b/package-lock.json index 0bfcceb26a..6212cd5ec4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2", + "version": "4.11.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.11.2", + "version": "4.11.3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index c7192c567d..9e92914283 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.11.2", + "version": "4.11.3", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", From 4e7ee52685b331a14afe59e0f127ebace669d070 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 19 Sep 2024 17:08:32 -0400 Subject: [PATCH 16/45] feat: populate case started main flow --- .../Contracts/CaseRepositoryInterface.php | 32 ++++ .../Http/Controllers/Api/TaskController.php | 7 +- ProcessMaker/Jobs/CaseStore.php | 32 ++++ ProcessMaker/Jobs/CaseUpdate.php | 33 ++++ ProcessMaker/Jobs/CaseUpdateStatus.php | 32 ++++ ProcessMaker/Models/CaseParticipated.php | 23 ++- ProcessMaker/Models/CaseStarted.php | 25 ++- ProcessMaker/Repositories/CaseRepository.php | 147 ++++++++++++++++++ .../ExecutionInstanceRepository.php | 8 + ProcessMaker/Repositories/TokenRepository.php | 4 + 10 files changed, 326 insertions(+), 17 deletions(-) create mode 100644 ProcessMaker/Contracts/CaseRepositoryInterface.php create mode 100644 ProcessMaker/Jobs/CaseStore.php create mode 100644 ProcessMaker/Jobs/CaseUpdate.php create mode 100644 ProcessMaker/Jobs/CaseUpdateStatus.php create mode 100644 ProcessMaker/Repositories/CaseRepository.php diff --git a/ProcessMaker/Contracts/CaseRepositoryInterface.php b/ProcessMaker/Contracts/CaseRepositoryInterface.php new file mode 100644 index 0000000000..9ad880cb1b --- /dev/null +++ b/ProcessMaker/Contracts/CaseRepositoryInterface.php @@ -0,0 +1,32 @@ +input('user_id'); $task->reassign($userToAssign, $request->user()); - return new Resource($task->refresh()); + $taskRefreshed = $task->refresh(); + + CaseUpdate::dispatch($task->processRequest, $taskRefreshed); + + return new Resource($taskRefreshed); } else { return abort(422); } diff --git a/ProcessMaker/Jobs/CaseStore.php b/ProcessMaker/Jobs/CaseStore.php new file mode 100644 index 0000000000..04aeaa289a --- /dev/null +++ b/ProcessMaker/Jobs/CaseStore.php @@ -0,0 +1,32 @@ +create($this->instance); + } +} diff --git a/ProcessMaker/Jobs/CaseUpdate.php b/ProcessMaker/Jobs/CaseUpdate.php new file mode 100644 index 0000000000..005d347aff --- /dev/null +++ b/ProcessMaker/Jobs/CaseUpdate.php @@ -0,0 +1,33 @@ +update($this->instance, $this->token); + } +} diff --git a/ProcessMaker/Jobs/CaseUpdateStatus.php b/ProcessMaker/Jobs/CaseUpdateStatus.php new file mode 100644 index 0000000000..225408f6e1 --- /dev/null +++ b/ProcessMaker/Jobs/CaseUpdateStatus.php @@ -0,0 +1,32 @@ +updateStatus($this->instance); + } +} diff --git a/ProcessMaker/Models/CaseParticipated.php b/ProcessMaker/Models/CaseParticipated.php index 60b076d795..29ce39e7b0 100644 --- a/ProcessMaker/Models/CaseParticipated.php +++ b/ProcessMaker/Models/CaseParticipated.php @@ -3,7 +3,7 @@ namespace ProcessMaker\Models; use Database\Factories\CaseParticipatedFactory; -use Illuminate\Database\Eloquent\Casts\AsArrayObject; +use Illuminate\Database\Eloquent\Casts\AsCollection; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\HasFactory; use ProcessMaker\Models\ProcessMakerModel; @@ -31,13 +31,20 @@ class CaseParticipated extends ProcessMakerModel ]; protected $casts = [ - 'processes' => AsArrayObject::class, - 'requests' => AsArrayObject::class, - 'request_tokens' => AsArrayObject::class, - 'tasks' => AsArrayObject::class, - 'participants' => AsArrayObject::class, - 'initiated_at' => 'datetime', - 'completed_at' => 'datetime', + 'processes' => AsCollection::class, + 'requests' => AsCollection::class, + 'request_tokens' => AsCollection::class, + 'tasks' => AsCollection::class, + 'participants' => AsCollection::class, + ]; + + protected $dates = [ + 'initiated_at', + 'completed_at', + ]; + + protected $attributes = [ + 'keywords' => '', ]; protected static function newFactory(): Factory diff --git a/ProcessMaker/Models/CaseStarted.php b/ProcessMaker/Models/CaseStarted.php index 41019b5c6b..00cd9f8e61 100644 --- a/ProcessMaker/Models/CaseStarted.php +++ b/ProcessMaker/Models/CaseStarted.php @@ -4,7 +4,7 @@ use Database\Factories\CaseStartedFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Casts\AsArrayObject; +use Illuminate\Database\Eloquent\Casts\AsCollection; use Illuminate\Database\Eloquent\Factories\Factory; use ProcessMaker\Models\ProcessMakerModel; @@ -14,6 +14,8 @@ class CaseStarted extends ProcessMakerModel protected $table = 'cases_started'; + protected $primaryKey = 'case_number'; + protected $fillable = [ 'case_number', 'user_id', @@ -31,13 +33,20 @@ class CaseStarted extends ProcessMakerModel ]; protected $casts = [ - 'processes' => AsArrayObject::class, - 'requests' => AsArrayObject::class, - 'request_tokens' => AsArrayObject::class, - 'tasks' => AsArrayObject::class, - 'participants' => AsArrayObject::class, - 'initiated_at' => 'datetime', - 'completed_at' => 'datetime', + 'processes' => AsCollection::class, + 'requests' => AsCollection::class, + 'request_tokens' => AsCollection::class, + 'tasks' => AsCollection::class, + 'participants' => AsCollection::class, + ]; + + protected $dates = [ + 'initiated_at', + 'completed_at', + ]; + + protected $attributes = [ + 'keywords' => '', ]; protected static function newFactory(): Factory diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php new file mode 100644 index 0000000000..2e73792a29 --- /dev/null +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -0,0 +1,147 @@ +checkIfCaseStartedExist($instance->case_number)) { + return; + } + + try { + $process = [ + 'id' => $instance->process->id, + 'name' => $instance->process->name, + ]; + + $request = [ + 'id' => $instance->id, + 'name' => $instance->name, + 'parent_request_id' => $instance->parentRequest->id ?? 0, + ]; + + CaseStarted::create([ + 'case_number' => $instance->case_number, + 'user_id' => $instance->user_id, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'processes' => [$process], + 'requests' => [$request], + 'request_tokens' => [], + 'tasks' => [], + 'participants' => [], + 'initiated_at' => $instance->initiated_at, + 'completed_at' => null, + ]); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + } + } + + public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void + { + try { + $case = CaseStarted::where('case_number', $instance->case_number)->first(); + $user = $token->user; + + $this->updateRequestTokens($case, $token); + $this->updateTasks($case, $token); + $this->updateParticipants($case, $user); + + $case->saveOrFail(); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + dd($e->getMessage()); + } + } + + public function updateStatus(ExecutionInstanceInterface $instance): void + { + try { + $data = [ + 'case_status' => $instance->status, + ]; + + if ($instance->status === 'COMPLETED') { + $data['completed_at'] = Carbon::now(); + } + + CaseStarted::where('case_number', $instance->case_number)->update($data); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + dd($e->getMessage()); + } + } + + private function updateRequestTokens(CaseStarted $case, TokenInterface $token) + { + $requestTokenExists = $case->request_tokens->contains($token->getKey()); + + if (!$requestTokenExists) { + $case->request_tokens->push($token->getKey()); + } + } + + private function updateTasks(CaseStarted $case, TokenInterface $token) + { + $taskExists = $case->tasks->contains(function ($task) use ($token) { + return $task['id'] === $token->element_id; + }); + + if (!$taskExists) { + $case->tasks->push([ + 'id' => $token->element_id, + 'name' => $token->element_name, + ]); + } + } + + private function updateParticipants(CaseStarted $case, User | null $user) + { + if (!$user) { + return; + } + + $participantExists = $case->participants->contains(function ($participant) use ($user) { + return $participant['id'] === $user->id; + }); + + if (!$participantExists) { + $case->participants->push([ + 'id' => $user->id, + 'name' => $user->getFullName(), + ]); + + CaseParticipated::create([ + 'user_id' => $user->id, + 'case_number' => $case->case_number, + 'case_title' => $case->case_title, + 'case_title_formatted' => $case->case_title_formatted, + 'case_status' => $case->case_status, + 'processes' => $case->processes, + 'requests' => $case->requests, + 'request_tokens' => $case->request_tokens, + 'tasks' => $case->tasks, + 'participants' => $case->participants, + 'initiated_at' => $case->initiated_at, + 'completed_at' => $case->completed_at, + ]); + } + } + + private function checkIfCaseStartedExist(int $caseNumber): bool + { + return CaseStarted::where('case_number', $caseNumber)->count() > 0; + } +} diff --git a/ProcessMaker/Repositories/ExecutionInstanceRepository.php b/ProcessMaker/Repositories/ExecutionInstanceRepository.php index 5c6641ddb0..f8110986f1 100644 --- a/ProcessMaker/Repositories/ExecutionInstanceRepository.php +++ b/ProcessMaker/Repositories/ExecutionInstanceRepository.php @@ -3,6 +3,8 @@ namespace ProcessMaker\Repositories; use Carbon\Carbon; +use ProcessMaker\Jobs\CaseStore; +use ProcessMaker\Jobs\CaseUpdateStatus; use ProcessMaker\Models\ProcessCollaboration; use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Nayra\Contracts\Bpmn\ParticipantInterface; @@ -184,6 +186,8 @@ public function persistInstanceCreated(ExecutionInstanceInterface $instance) // Set id $instance->setId($instance->getKey()); + CaseStore::dispatch($instance); + // Persists collaboration $this->persistCollaboration($instance); } @@ -208,6 +212,8 @@ public function persistInstanceError(ExecutionInstanceInterface $instance) $instance->status = 'ERROR'; $instance->mergeLatestStoredData(); $instance->saveOrFail(); + + CaseUpdateStatus::dispatch($instance); } /** @@ -255,6 +261,8 @@ public function persistInstanceCompleted(ExecutionInstanceInterface $instance) $instance->completed_at = Carbon::now(); $instance->mergeLatestStoredData(); $instance->saveOrFail(); + + CaseUpdateStatus::dispatch($instance); } /** diff --git a/ProcessMaker/Repositories/TokenRepository.php b/ProcessMaker/Repositories/TokenRepository.php index 7e3e00179a..c33bb4add3 100644 --- a/ProcessMaker/Repositories/TokenRepository.php +++ b/ProcessMaker/Repositories/TokenRepository.php @@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; use Mustache_Engine; +use ProcessMaker\Jobs\CaseUpdate; use ProcessMaker\Mail\TaskActionByEmail; use ProcessMaker\Models\ProcessAbeRequestToken; use ProcessMaker\Models\ProcessCollaboration; @@ -158,6 +159,9 @@ public function persistActivityActivated(ActivityInterface $activity, TokenInter $token->setId($token->getKey()); $request = $token->getInstance(); $request->notifyProcessUpdated('ACTIVITY_ACTIVATED', $token); + + CaseUpdate::dispatch($request, $token); + if (!is_null($user)) { $this->validateAndSendActionByEmail($activity, $token, $user->email); } From 8c47c45840336fb036f1d51bf3873b32f8dc4548 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 20 Sep 2024 16:15:22 -0400 Subject: [PATCH 17/45] feat: populate case participate main flow --- ProcessMaker/Models/CaseStarted.php | 2 - .../CaseParticipatedRepository.php | 106 ++++++++++++++ ProcessMaker/Repositories/CaseRepository.php | 130 ++++++++++-------- composer.json | 1 + composer.lock | 80 ++++++++++- ...9_09_181717_create_cases_started_table.php | 4 +- ...172734_create_cases_participated_table.php | 3 +- 7 files changed, 267 insertions(+), 59 deletions(-) create mode 100644 ProcessMaker/Repositories/CaseParticipatedRepository.php diff --git a/ProcessMaker/Models/CaseStarted.php b/ProcessMaker/Models/CaseStarted.php index 00cd9f8e61..3840551816 100644 --- a/ProcessMaker/Models/CaseStarted.php +++ b/ProcessMaker/Models/CaseStarted.php @@ -14,8 +14,6 @@ class CaseStarted extends ProcessMakerModel protected $table = 'cases_started'; - protected $primaryKey = 'case_number'; - protected $fillable = [ 'case_number', 'user_id', diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php new file mode 100644 index 0000000000..025d3fe7d8 --- /dev/null +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -0,0 +1,106 @@ + $token->user->id, + 'case_number' => $case->case_number, + 'case_title' => $case->case_title, + 'case_title_formatted' => $case->case_title_formatted, + 'case_status' => $case->case_status, + 'processes' => $case->processes, + 'requests' => $case->requests, + 'request_tokens' => [$token->getKey()], + 'tasks' => [ + [ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ], + ], + 'participants' => $case->participants, + 'initiated_at' => $case->initiated_at, + 'completed_at' => null, + ]); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + } + } + + /** + * Update the case participated. + * + * @param CaseStarted $case + * @param TokenInterface $token + * @return void + */ + public function update(CaseStarted $case, TokenInterface $token) + { + try { + $caseParticipated = CaseParticipated::where('user_id', $token->user->id) + ->where('case_number', $case->case_number) + ->first(); + + // Add the token data to the request_tokens + $requestTokens = $caseParticipated->request_tokens->push($token->getKey()) + ->unique() + ->values(); + // Add the task data to the tasks + $tasks = $caseParticipated->tasks->push([ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ]) + ->unique('id') + ->values(); + + $caseParticipated->update([ + 'case_title' => $case->case_title, + 'case_title_formatted' => $case->case_title_formatted, + 'case_status' => $case->case_status, + 'processes' => $case->processes, + 'requests' => $case->requests, + 'request_tokens' => $requestTokens, + 'tasks' => $tasks, + 'participants' => $case->participants, + ]); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + } + } + + /** + * Update the status of a case participated. + * + * @param int $caseNumber + * @param array $statusData + * @return void + */ + public function updateStatus(int $caseNumber, array $statusData) + { + try { + CaseParticipated::where('case_number', $caseNumber) + ->update($statusData); + } catch (\Exception $e) { + \Log::error($e->getMessage()); + } + } +} diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 2e73792a29..3bdd35d65e 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -4,14 +4,21 @@ use Carbon\Carbon; use ProcessMaker\Contracts\CaseRepositoryInterface; -use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; -use ProcessMaker\Models\User; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; class CaseRepository implements CaseRepositoryInterface { + public function __construct(protected CaseParticipatedRepository $caseParticipatedRepository) + { + } + /** + * Store a new case started. + * + * @param ExecutionInstanceInterface $instance + * @return void + */ public function create(ExecutionInstanceInterface $instance): void { if ($this->checkIfCaseStartedExist($instance->case_number)) { @@ -19,15 +26,19 @@ public function create(ExecutionInstanceInterface $instance): void } try { - $process = [ - 'id' => $instance->process->id, - 'name' => $instance->process->name, + $processes = [ + [ + 'id' => $instance->process->id, + 'name' => $instance->process->name, + ], ]; - $request = [ - 'id' => $instance->id, - 'name' => $instance->name, - 'parent_request_id' => $instance->parentRequest->id ?? 0, + $requests = [ + [ + 'id' => $instance->id, + 'name' => $instance->name, + 'parent_request_id' => $instance->parentRequest->id ?? 0, + ], ]; CaseStarted::create([ @@ -36,8 +47,8 @@ public function create(ExecutionInstanceInterface $instance): void 'case_title' => $instance->case_title, 'case_title_formatted' => $instance->case_title_formatted, 'case_status' => 'IN_PROGRESS', - 'processes' => [$process], - 'requests' => [$request], + 'processes' => $processes, + 'requests' => $requests, 'request_tokens' => [], 'tasks' => [], 'participants' => [], @@ -49,23 +60,50 @@ public function create(ExecutionInstanceInterface $instance): void } } + /** + * Update the case started. + * + * @param ExecutionInstanceInterface $instance + * @param TokenInterface $token + * @return void + */ public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { try { $case = CaseStarted::where('case_number', $instance->case_number)->first(); - $user = $token->user; - $this->updateRequestTokens($case, $token); - $this->updateTasks($case, $token); - $this->updateParticipants($case, $user); + $case->case_title = $instance->case_title; + $case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; + + $case->request_tokens->push($token->getKey()) + ->unique() + ->values(); + + if (!in_array($token->element_type, ['scriptTask'])) { + $case->tasks->push([ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ]) + ->unique('id') + ->values(); + } + + $this->updateParticipants($case, $token); $case->saveOrFail(); } catch (\Exception $e) { \Log::error($e->getMessage()); - dd($e->getMessage()); } } + /** + * Update the status of a case started. + * + * @param ExecutionInstanceInterface $instance + * @return void + */ public function updateStatus(ExecutionInstanceInterface $instance): void { try { @@ -77,38 +115,25 @@ public function updateStatus(ExecutionInstanceInterface $instance): void $data['completed_at'] = Carbon::now(); } + // Update the case started and case participated CaseStarted::where('case_number', $instance->case_number)->update($data); + $this->caseParticipatedRepository->updateStatus($instance->case_number, $data); } catch (\Exception $e) { \Log::error($e->getMessage()); - dd($e->getMessage()); } } - private function updateRequestTokens(CaseStarted $case, TokenInterface $token) + /** + * Update the participants of the case started. + * + * @param CaseStarted $case + * @param TokenInterface $token + * @return void + */ + private function updateParticipants(CaseStarted $case, TokenInterface $token): void { - $requestTokenExists = $case->request_tokens->contains($token->getKey()); + $user = $token->user; - if (!$requestTokenExists) { - $case->request_tokens->push($token->getKey()); - } - } - - private function updateTasks(CaseStarted $case, TokenInterface $token) - { - $taskExists = $case->tasks->contains(function ($task) use ($token) { - return $task['id'] === $token->element_id; - }); - - if (!$taskExists) { - $case->tasks->push([ - 'id' => $token->element_id, - 'name' => $token->element_name, - ]); - } - } - - private function updateParticipants(CaseStarted $case, User | null $user) - { if (!$user) { return; } @@ -121,25 +146,22 @@ private function updateParticipants(CaseStarted $case, User | null $user) $case->participants->push([ 'id' => $user->id, 'name' => $user->getFullName(), + 'title' => $user->title, + 'avatar' => $user->avatar, ]); - CaseParticipated::create([ - 'user_id' => $user->id, - 'case_number' => $case->case_number, - 'case_title' => $case->case_title, - 'case_title_formatted' => $case->case_title_formatted, - 'case_status' => $case->case_status, - 'processes' => $case->processes, - 'requests' => $case->requests, - 'request_tokens' => $case->request_tokens, - 'tasks' => $case->tasks, - 'participants' => $case->participants, - 'initiated_at' => $case->initiated_at, - 'completed_at' => $case->completed_at, - ]); + $this->caseParticipatedRepository->create($case, $token); } + + $this->caseParticipatedRepository->update($case, $token); } + /** + * Check if the case started exist. + * + * @param int $caseNumber + * @return bool + */ private function checkIfCaseStartedExist(int $caseNumber): bool { return CaseStarted::where('case_number', $caseNumber)->count() > 0; diff --git a/composer.json b/composer.json index f591ce30a8..921193f492 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "jenssegers/agent": "^2.6", "laravel/framework": "^10.19", "laravel/horizon": "^5.12", + "laravel/pail": "*", "laravel/passport": "^11.5", "laravel/scout": "^9.8", "laravel/telescope": "^4.12", diff --git a/composer.lock b/composer.lock index 810e0e5350..d24712a93b 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": "cfd04a0f3ee33c659f5333738092adeb", + "content-hash": "2e3ed0dbb125cedadc0fa04b8380026d", "packages": [ { "name": "aws/aws-crt-php", @@ -3484,6 +3484,84 @@ }, "time": "2023-11-23T15:47:58+00:00" }, + { + "name": "laravel/pail", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "c22fe771277971eb9cd224955996bcf39c1a710d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/c22fe771277971eb9cd224955996bcf39c1a710d", + "reference": "c22fe771277971eb9cd224955996bcf39c1a710d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-pcntl": "*", + "illuminate/console": "^10.24|^11.0", + "illuminate/contracts": "^10.24|^11.0", + "illuminate/log": "^10.24|^11.0", + "illuminate/process": "^10.24|^11.0", + "illuminate/support": "^10.24|^11.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/pint": "^1.13", + "orchestra/testbench": "^8.12|^9.0", + "pestphp/pest": "^2.20", + "pestphp/pest-plugin-type-coverage": "^2.3", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2024-05-08T18:19:39+00:00" + }, { "name": "laravel/passport", "version": "v11.10.0", diff --git a/database/migrations/2024_09_09_181717_create_cases_started_table.php b/database/migrations/2024_09_09_181717_create_cases_started_table.php index 2f9d32efe5..73f6b35db5 100644 --- a/database/migrations/2024_09_09_181717_create_cases_started_table.php +++ b/database/migrations/2024_09_09_181717_create_cases_started_table.php @@ -12,7 +12,8 @@ public function up(): void { Schema::create('cases_started', function (Blueprint $table) { - $table->unsignedInteger('case_number')->primary(); + $table->id(); + $table->unsignedInteger('case_number')->unique(); $table->unsignedInteger('user_id'); $table->string('case_title', 255); $table->text('case_title_formatted'); @@ -29,6 +30,7 @@ public function up(): void $table->foreign('user_id')->references('id')->on('users'); + $table->index(['case_number']); $table->index(['user_id', 'case_status', 'created_at']); $table->index(['user_id', 'case_status', 'updated_at']); diff --git a/database/migrations/2024_09_12_172734_create_cases_participated_table.php b/database/migrations/2024_09_12_172734_create_cases_participated_table.php index 0e28554f63..d6d9dd00b8 100644 --- a/database/migrations/2024_09_12_172734_create_cases_participated_table.php +++ b/database/migrations/2024_09_12_172734_create_cases_participated_table.php @@ -12,6 +12,7 @@ public function up(): void { Schema::create('cases_participated', function (Blueprint $table) { + $table->id(); $table->unsignedInteger('user_id'); $table->unsignedInteger('case_number'); $table->string('case_title', 255); @@ -27,9 +28,9 @@ public function up(): void $table->timestamps(); $table->text('keywords'); - $table->primary(['user_id', 'case_number']); $table->foreign('user_id')->references('id')->on('users'); + $table->index(['user_id', 'case_number']); $table->index(['user_id', 'case_status', 'created_at']); $table->index(['user_id', 'case_status', 'completed_at']); From 88a0f4af31a96214bd981553c24c2b8cdfd3ea0c Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Tue, 24 Sep 2024 08:07:44 -0400 Subject: [PATCH 18/45] test: cases main flow --- ProcessMaker/Repositories/CaseRepository.php | 4 +- tests/Feature/Cases/CaseParticipatedTest.php | 363 +++++++++++++++++ tests/Feature/Cases/CaseStartedTest.php | 393 +++++++++++++++++++ tests/Feature/Cases/CasesJobTest.php | 68 ++++ 4 files changed, 826 insertions(+), 2 deletions(-) create mode 100644 tests/Feature/Cases/CaseParticipatedTest.php create mode 100644 tests/Feature/Cases/CaseStartedTest.php create mode 100644 tests/Feature/Cases/CasesJobTest.php diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 3bdd35d65e..795036811d 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -75,12 +75,12 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok $case->case_title = $instance->case_title; $case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; - $case->request_tokens->push($token->getKey()) + $case->request_tokens = $case->request_tokens->push($token->getKey()) ->unique() ->values(); if (!in_array($token->element_type, ['scriptTask'])) { - $case->tasks->push([ + $case->tasks = $case->tasks->push([ 'id' => $token->getKey(), 'element_id' => $token->element_id, 'name' => $token->element_name, diff --git a/tests/Feature/Cases/CaseParticipatedTest.php b/tests/Feature/Cases/CaseParticipatedTest.php new file mode 100644 index 0000000000..d28e80c0dc --- /dev/null +++ b/tests/Feature/Cases/CaseParticipatedTest.php @@ -0,0 +1,363 @@ +create(); + $process = Process::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseHas('cases_started', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + ]); + + $this->assertDatabaseCount('cases_participated', 0); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'processes->[0]->id' => $process->id, + 'processes->[0]->name' => $process->name, + 'requests->[0]->id' => $instance->id, + 'requests->[0]->name' => $instance->name, + 'requests->[0]->parent_request_id' => $instance->parent_request_id ?? 0, + 'request_tokens->[0]' => $token->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + } + + public function test_create_multiple_case_participated() + { + $user = User::factory()->create(); + $process = Process::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseHas('cases_started', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + 'request_tokens->[1]' => $token2->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + 'tasks->[1]->id' => $token2->id, + 'tasks->[1]->element_id' => $token2->element_id, + 'tasks->[1]->name' => $token2->element_name, + 'tasks->[1]->process_id' => $token2->process_id, + ]); + } + + public function test_update_case_participated_users() + { + $user = User::factory()->create(); + $user2 = User::factory()->create(); + $process = Process::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseHas('cases_started', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user2->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user2->id, + 'case_number' => $instance->case_number, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token2->id, + 'tasks->[0]->id' => $token2->id, + 'tasks->[0]->element_id' => $token2->element_id, + 'tasks->[0]->name' => $token2->element_name, + 'tasks->[0]->process_id' => $token2->process_id, + ]); + } + + public function test_update_case_participated_user_tasks() + { + $user = User::factory()->create(); + $user2 = User::factory()->create(); + $process = Process::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'request_tokens->[0]' => $token->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user2->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user2->id, + 'case_number' => $instance->case_number, + 'request_tokens->[0]' => $token2->id, + 'tasks->[0]->id' => $token2->id, + 'tasks->[0]->element_id' => $token2->element_id, + 'tasks->[0]->name' => $token2->element_name, + 'tasks->[0]->process_id' => $token2->process_id, + ]); + + $token3 = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token3); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'request_tokens->[0]' => $token->id, + 'request_tokens->[1]' => $token3->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + 'tasks->[1]->id' => $token3->id, + 'tasks->[1]->element_id' => $token3->element_id, + 'tasks->[1]->name' => $token3->element_name, + 'tasks->[1]->process_id' => $token3->process_id, + ]); + } + + public function test_update_case_participated_completed() + { + $user = User::factory()->create(); + $user2 = User::factory()->create(); + $process = Process::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + + $this->assertDatabaseCount('cases_participated', 1); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user2->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user2->id, + 'case_number' => $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token2->id, + 'tasks->[0]->id' => $token2->id, + 'tasks->[0]->element_id' => $token2->element_id, + 'tasks->[0]->name' => $token2->element_name, + 'tasks->[0]->process_id' => $token2->process_id, + ]); + + $token3 = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token3); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'user_id' => $user->id, + 'case_number' => $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + 'request_tokens->[1]' => $token3->id, + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + 'tasks->[1]->id' => $token3->id, + 'tasks->[1]->element_id' => $token3->element_id, + 'tasks->[1]->name' => $token3->element_name, + 'tasks->[1]->process_id' => $token3->process_id, + ]); + + $instance->status = 'COMPLETED'; + $repo->updateStatus($instance); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $instance->case_number, + 'case_status' => 'COMPLETED', + 'completed_at' => now(), + ]); + } +} diff --git a/tests/Feature/Cases/CaseStartedTest.php b/tests/Feature/Cases/CaseStartedTest.php new file mode 100644 index 0000000000..87a87067d0 --- /dev/null +++ b/tests/Feature/Cases/CaseStartedTest.php @@ -0,0 +1,393 @@ +create(); + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + } + + public function test_create_multiple_cases() + { + $user = User::factory()->create(); + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + $instance1 = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + $instance2 = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance1); + $repo->create($instance2); + + $this->assertDatabaseCount('cases_started', 2); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance1->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance1->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance2->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance2->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + } + + public function test_create_case_started_processes() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'processes->[0]->id' => $process->id, + 'processes->[0]->name' => $process->name, + ]); + } + + public function test_create_case_started_requests() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'requests->[0]->id' => $instance->id, + 'requests->[0]->name' => $instance->name, + 'requests->[0]->parent_request_id' => $instance->parent_request_id ?? 0, + ]); + } + + public function test_update_case_started_request_tokens() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $token->id, + ]); + } + + public function test_update_case_started_tasks() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[1]->id' => $token2->id, + 'tasks->[1]->element_id' => $token2->element_id, + 'tasks->[1]->name' => $token2->element_name, + 'tasks->[1]->process_id' => $token2->process_id, + ]); + } + + public function test_update_case_started_script_tasks() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + 'element_type' => 'scriptTask', + ]); + + $repo->update($instance, $token2); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[1]->id' => null, + 'tasks->[1]->element_id' => null, + 'tasks->[1]->name' => null, + 'tasks->[1]->process_id' => null, + ]); + } + + public function test_update_case_started_participants() + { + $process = Process::factory()->create(); + + $user = User::factory()->create(); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'participants->[0]->id' => $user->id, + 'participants->[0]->name' => $user->fullName, + 'participants->[0]->title' => $user->title, + 'participants->[0]->avatar' => $user->avatar, + ]); + + $user2 = User::factory()->create(); + $token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $user2->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token2); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'participants->[1]->id' => $user2->id, + 'participants->[1]->name' => $user2->fullName, + 'participants->[1]->title' => $user2->title, + 'participants->[1]->avatar' => $user2->avatar, + ]); + } + + public function test_update_case_started_status() + { + $process = Process::factory()->create(); + $user = User::factory()->create(); + + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + 'process_id' => $process->id, + ]); + + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + ]); + + $repo->update($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'IN_PROGRESS', + 'completed_at' => null, + 'request_tokens->[0]' => $token->id, + ]); + + $instance->status = 'COMPLETED'; + $repo->updateStatus($instance, $token); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $instance->case_number, + 'user_id' => $user->id, + 'case_title' => 'Case #' . $instance->case_number, + 'case_status' => 'COMPLETED', + 'completed_at' => now(), + 'tasks->[0]->id' => $token->id, + 'tasks->[0]->element_id' => $token->element_id, + 'tasks->[0]->name' => $token->element_name, + 'tasks->[0]->process_id' => $token->process_id, + ]); + } +} diff --git a/tests/Feature/Cases/CasesJobTest.php b/tests/Feature/Cases/CasesJobTest.php new file mode 100644 index 0000000000..1f3783f773 --- /dev/null +++ b/tests/Feature/Cases/CasesJobTest.php @@ -0,0 +1,68 @@ +create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + + CaseStore::dispatch($instance); + + Queue::assertPushed(CaseStore::class, 1); + } + + public function test_handle_case_update_job() + { + Queue::fake(); + + $user = User::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + + $token = ProcessRequestToken::factory()->create([ + 'process_request_id' => $instance->id, + ]); + + CaseUpdate::dispatch($instance, $token); + + Queue::assertPushed(CaseUpdate::class, 1); + } + + public function test_handle_case_update_status_job() + { + Queue::fake(); + + $user = User::factory()->create(); + $instance = ProcessRequest::factory()->create([ + 'user_id' => $user->id, + ]); + + $token = ProcessRequestToken::factory()->create([ + 'process_request_id' => $instance->id, + ]); + + CaseUpdateStatus::dispatch($instance, $token); + + Queue::assertPushed(CaseUpdateStatus::class, 1); + } +} From 1031a8f40f5e888af3ceeec679169d5626863d71 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 25 Sep 2024 09:31:00 -0400 Subject: [PATCH 19/45] fix: handle null case started --- ProcessMaker/Repositories/CaseRepository.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 795036811d..71ba8926c6 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -72,6 +72,10 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok try { $case = CaseStarted::where('case_number', $instance->case_number)->first(); + if (is_null($case)) { + return; + } + $case->case_title = $instance->case_title; $case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; From 387cf7d7a8757af477858f715a37c715262ed7c1 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 25 Sep 2024 11:20:36 -0400 Subject: [PATCH 20/45] fix: update cases migrations, fix CaseController test --- .../2024_09_09_181717_create_cases_started_table.php | 2 +- .../2024_09_12_172734_create_cases_participated_table.php | 2 +- tests/Feature/Api/V1_1/CaseControllerTest.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/migrations/2024_09_09_181717_create_cases_started_table.php b/database/migrations/2024_09_09_181717_create_cases_started_table.php index 73f6b35db5..e2a380298e 100644 --- a/database/migrations/2024_09_09_181717_create_cases_started_table.php +++ b/database/migrations/2024_09_09_181717_create_cases_started_table.php @@ -28,7 +28,7 @@ public function up(): void $table->timestamps(); $table->text('keywords'); - $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->index(['case_number']); $table->index(['user_id', 'case_status', 'created_at']); diff --git a/database/migrations/2024_09_12_172734_create_cases_participated_table.php b/database/migrations/2024_09_12_172734_create_cases_participated_table.php index d6d9dd00b8..2d0eef7dc3 100644 --- a/database/migrations/2024_09_12_172734_create_cases_participated_table.php +++ b/database/migrations/2024_09_12_172734_create_cases_participated_table.php @@ -28,7 +28,7 @@ public function up(): void $table->timestamps(); $table->text('keywords'); - $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->index(['user_id', 'case_number']); $table->index(['user_id', 'case_status', 'created_at']); diff --git a/tests/Feature/Api/V1_1/CaseControllerTest.php b/tests/Feature/Api/V1_1/CaseControllerTest.php index f002e69643..31333a9316 100644 --- a/tests/Feature/Api/V1_1/CaseControllerTest.php +++ b/tests/Feature/Api/V1_1/CaseControllerTest.php @@ -177,12 +177,12 @@ public function test_get_all_cases_sort_by_completed_at(): void $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:asc'])); $response->assertStatus(200); $response->assertJsonCount($cases->count(), 'data'); - $response->assertJsonPath('data.0.completed_at', $casesSorted->first()->completed_at->format('Y-m-d\TH:i:s.u\Z')); + $response->assertJsonPath('data.0.completed_at', $casesSorted->first()->completed_at->format('Y-m-d H:i:s')); $response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:desc'])); $response->assertStatus(200); $response->assertJsonCount($cases->count(), 'data'); - $response->assertJsonPath('data.0.completed_at', $casesSorted->last()->completed_at->format('Y-m-d\TH:i:s.u\Z')); + $response->assertJsonPath('data.0.completed_at', $casesSorted->last()->completed_at->format('Y-m-d H:i:s')); } public function test_get_all_cases_sort_by_invalid_field(): void From ef64c8f13a2e14bac54a95ffc7d5ea6cc978a641 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 25 Sep 2024 13:41:57 -0400 Subject: [PATCH 21/45] fix: handle null case number --- ProcessMaker/Repositories/CaseRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 71ba8926c6..e77f14665b 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -21,7 +21,7 @@ public function __construct(protected CaseParticipatedRepository $caseParticipat */ public function create(ExecutionInstanceInterface $instance): void { - if ($this->checkIfCaseStartedExist($instance->case_number)) { + if (is_null($instance->case_number) || $this->checkIfCaseStartedExist($instance->case_number)) { return; } From 2fbba858fc61d0b08f477966d66c3432f1152ce8 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 25 Sep 2024 15:14:47 -0400 Subject: [PATCH 22/45] feat: populate sub processes --- .../CaseParticipatedRepository.php | 83 ++++++++++++++----- ProcessMaker/Repositories/CaseRepository.php | 81 ++++++++++++++---- 2 files changed, 126 insertions(+), 38 deletions(-) diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 025d3fe7d8..85f261bb66 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -18,23 +18,42 @@ class CaseParticipatedRepository public function create(CaseStarted $case, TokenInterface $token): void { try { + $processes = [ + [ + 'id' => $token->processRequest->process->id, + 'name' => $token->processRequest->process->name, + ], + ]; + + $requests = [ + [ + 'id' => $token->processRequest->id, + 'name' => $token->processRequest->name, + 'parent_request_id' => $token->processRequest->parentRequest->id, + ], + ]; + + $tasks = collect(); + + if (in_array($token->element_type, ['task'])) { + $tasks->push([ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ]); + } + CaseParticipated::create([ 'user_id' => $token->user->id, 'case_number' => $case->case_number, 'case_title' => $case->case_title, 'case_title_formatted' => $case->case_title_formatted, 'case_status' => $case->case_status, - 'processes' => $case->processes, - 'requests' => $case->requests, + 'processes' => $processes, + 'requests' => $requests, 'request_tokens' => [$token->getKey()], - 'tasks' => [ - [ - 'id' => $token->getKey(), - 'element_id' => $token->element_id, - 'name' => $token->element_name, - 'process_id' => $token->process_id, - ], - ], + 'tasks' => $tasks, 'participants' => $case->participants, 'initiated_at' => $case->initiated_at, 'completed_at' => null, @@ -58,26 +77,50 @@ public function update(CaseStarted $case, TokenInterface $token) ->where('case_number', $case->case_number) ->first(); + if (is_null($caseParticipated)) { + return; + } + + // Store the sub-processes and requests + $processes = $caseParticipated->processes->push([ + 'id' => $token->processRequest->process->id, + 'name' => $token->processRequest->process->name, + ]) + ->unique('id') + ->values(); + + $requests = $caseParticipated->requests->push([ + 'id' => $token->processRequest->id, + 'name' => $token->processRequest->name, + 'parent_request_id' => $token->processRequest->parentRequest->id, + ]) + ->unique('id') + ->values(); + // Add the token data to the request_tokens $requestTokens = $caseParticipated->request_tokens->push($token->getKey()) ->unique() ->values(); // Add the task data to the tasks - $tasks = $caseParticipated->tasks->push([ - 'id' => $token->getKey(), - 'element_id' => $token->element_id, - 'name' => $token->element_name, - 'process_id' => $token->process_id, - ]) - ->unique('id') - ->values(); + $tasks = $caseParticipated->tasks; + + if (in_array($token->element_type, ['task'])) { + $tasks = $tasks->push([ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ]) + ->unique('id') + ->values(); + } $caseParticipated->update([ 'case_title' => $case->case_title, 'case_title_formatted' => $case->case_title_formatted, 'case_status' => $case->case_status, - 'processes' => $case->processes, - 'requests' => $case->requests, + 'processes' => $processes, + 'requests' => $requests, 'request_tokens' => $requestTokens, 'tasks' => $tasks, 'participants' => $case->participants, diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index e77f14665b..cc498f42ee 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -10,6 +10,11 @@ class CaseRepository implements CaseRepositoryInterface { + /** + * @var CaseStarted|null + */ + protected ?CaseStarted $case; + public function __construct(protected CaseParticipatedRepository $caseParticipatedRepository) { } @@ -22,6 +27,8 @@ public function __construct(protected CaseParticipatedRepository $caseParticipat public function create(ExecutionInstanceInterface $instance): void { if (is_null($instance->case_number) || $this->checkIfCaseStartedExist($instance->case_number)) { + $this->updateSubProcesses($instance); + return; } @@ -37,7 +44,7 @@ public function create(ExecutionInstanceInterface $instance): void [ 'id' => $instance->id, 'name' => $instance->name, - 'parent_request_id' => $instance->parentRequest->id ?? 0, + 'parent_request_id' => $instance->parentRequest->id, ], ]; @@ -70,21 +77,19 @@ public function create(ExecutionInstanceInterface $instance): void public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { try { - $case = CaseStarted::where('case_number', $instance->case_number)->first(); - - if (is_null($case)) { + if (!$this->checkIfCaseStartedExist($instance->case_number)) { return; } - $case->case_title = $instance->case_title; - $case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; + $this->case->case_title = $instance->case_title; + $this->case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; - $case->request_tokens = $case->request_tokens->push($token->getKey()) + $this->case->request_tokens = $this->case->request_tokens->push($token->getKey()) ->unique() ->values(); - if (!in_array($token->element_type, ['scriptTask'])) { - $case->tasks = $case->tasks->push([ + if (in_array($token->element_type, ['task'])) { + $this->case->tasks = $this->case->tasks->push([ 'id' => $token->getKey(), 'element_id' => $token->element_id, 'name' => $token->element_name, @@ -94,9 +99,9 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok ->values(); } - $this->updateParticipants($case, $token); + $this->updateParticipants($token); - $case->saveOrFail(); + $this->case->saveOrFail(); } catch (\Exception $e) { \Log::error($e->getMessage()); } @@ -110,6 +115,10 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok */ public function updateStatus(ExecutionInstanceInterface $instance): void { + if (!is_null($instance->parent_request_id)) { + return; + } + try { $data = [ 'case_status' => $instance->status, @@ -130,11 +139,10 @@ public function updateStatus(ExecutionInstanceInterface $instance): void /** * Update the participants of the case started. * - * @param CaseStarted $case * @param TokenInterface $token * @return void */ - private function updateParticipants(CaseStarted $case, TokenInterface $token): void + private function updateParticipants(TokenInterface $token): void { $user = $token->user; @@ -142,22 +150,22 @@ private function updateParticipants(CaseStarted $case, TokenInterface $token): v return; } - $participantExists = $case->participants->contains(function ($participant) use ($user) { + $participantExists = $this->case->participants->contains(function ($participant) use ($user) { return $participant['id'] === $user->id; }); if (!$participantExists) { - $case->participants->push([ + $this->case->participants->push([ 'id' => $user->id, 'name' => $user->getFullName(), 'title' => $user->title, 'avatar' => $user->avatar, ]); - $this->caseParticipatedRepository->create($case, $token); + $this->caseParticipatedRepository->create($this->case, $token); } - $this->caseParticipatedRepository->update($case, $token); + $this->caseParticipatedRepository->update($this->case, $token); } /** @@ -168,6 +176,43 @@ private function updateParticipants(CaseStarted $case, TokenInterface $token): v */ private function checkIfCaseStartedExist(int $caseNumber): bool { - return CaseStarted::where('case_number', $caseNumber)->count() > 0; + $this->case = CaseStarted::where('case_number', $caseNumber)->first(); + + return !is_null($this->case); + } + + /** + * Update the processes and requests of the case started. + * + * @param ExecutionInstanceInterface $instance + * @return void + */ + private function updateSubProcesses(ExecutionInstanceInterface $instance): void + { + if (is_null($instance->parent_request_id)) { + return; + } + + try { + // Store the sub-processes and requests + $this->case->processes = $this->case->processes->push([ + 'id' => $instance->process->id, + 'name' => $instance->process->name, + ]) + ->unique('id') + ->values(); + + $this->case->requests = $this->case->requests->push([ + 'id' => $instance->id, + 'name' => $instance->name, + 'parent_request_id' => $instance->parentRequest->id, + ]) + ->unique('id') + ->values(); + + $this->case->saveOrFail(); + } catch (\Exception $th) { + \Log::error($th->getMessage()); + } } } From fec23b4c2c8234bedc5b2d6d18ef7eeed7b2c038 Mon Sep 17 00:00:00 2001 From: danloa Date: Wed, 25 Sep 2024 16:49:50 -0400 Subject: [PATCH 23/45] Change PDF validation condition --- .../Http/Controllers/Api/ProcessRequestFileController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Http/Controllers/Api/ProcessRequestFileController.php b/ProcessMaker/Http/Controllers/Api/ProcessRequestFileController.php index fd58eaa475..6e9b2d75b7 100644 --- a/ProcessMaker/Http/Controllers/Api/ProcessRequestFileController.php +++ b/ProcessMaker/Http/Controllers/Api/ProcessRequestFileController.php @@ -431,7 +431,7 @@ private function validatePDFFile(UploadedFile $file, &$errors) { $text = $file->get(); - $jsKeywords = ['/JavaScript', '/JS', '<< /S /JavaScript']; + $jsKeywords = ['/JavaScript', '<< /S /JavaScript']; foreach ($jsKeywords as $keyword) { if (strpos($text, $keyword) !== false) { From eeec1e6cef54675f17d6fb7e4cdbc7f75848731b Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 26 Sep 2024 08:25:01 -0400 Subject: [PATCH 24/45] feat: ref common functions --- .../CaseParticipatedRepository.php | 104 +++++------------- ProcessMaker/Repositories/CaseRepository.php | 66 +++-------- ProcessMaker/Repositories/CaseUtils.php | 84 ++++++++++++++ 3 files changed, 130 insertions(+), 124 deletions(-) create mode 100644 ProcessMaker/Repositories/CaseUtils.php diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 85f261bb66..7f7085c8ef 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -8,6 +8,11 @@ class CaseParticipatedRepository { + /** + * @var CaseParticipated|null + */ + protected ?CaseParticipated $caseParticipated; + /** * Store a new case participated. * @@ -17,43 +22,21 @@ class CaseParticipatedRepository */ public function create(CaseStarted $case, TokenInterface $token): void { - try { - $processes = [ - [ - 'id' => $token->processRequest->process->id, - 'name' => $token->processRequest->process->name, - ], - ]; - - $requests = [ - [ - 'id' => $token->processRequest->id, - 'name' => $token->processRequest->name, - 'parent_request_id' => $token->processRequest->parentRequest->id, - ], - ]; - - $tasks = collect(); - - if (in_array($token->element_type, ['task'])) { - $tasks->push([ - 'id' => $token->getKey(), - 'element_id' => $token->element_id, - 'name' => $token->element_name, - 'process_id' => $token->process_id, - ]); - } + if ($this->checkIfCaseParticipatedExist($token->user->id, $case->case_number)) { + return; + } - CaseParticipated::create([ + try { + $this->caseParticipated = CaseParticipated::create([ 'user_id' => $token->user->id, 'case_number' => $case->case_number, 'case_title' => $case->case_title, 'case_title_formatted' => $case->case_title_formatted, 'case_status' => $case->case_status, - 'processes' => $processes, - 'requests' => $requests, - 'request_tokens' => [$token->getKey()], - 'tasks' => $tasks, + 'processes' => CaseUtils::storeProcesses($token->processRequest, collect()), + 'requests' => CaseUtils::storeRequests($token->processRequest, collect()), + 'request_tokens' => CaseUtils::storeRequestTokens($token->getKey(), collect()), + 'tasks' => CaseUtils::storeTasks($token, collect()), 'participants' => $case->participants, 'initiated_at' => $case->initiated_at, 'completed_at' => null, @@ -73,56 +56,18 @@ public function create(CaseStarted $case, TokenInterface $token): void public function update(CaseStarted $case, TokenInterface $token) { try { - $caseParticipated = CaseParticipated::where('user_id', $token->user->id) - ->where('case_number', $case->case_number) - ->first(); - - if (is_null($caseParticipated)) { + if (!$this->checkIfCaseParticipatedExist($token->user->id, $case->case_number)) { return; } - // Store the sub-processes and requests - $processes = $caseParticipated->processes->push([ - 'id' => $token->processRequest->process->id, - 'name' => $token->processRequest->process->name, - ]) - ->unique('id') - ->values(); - - $requests = $caseParticipated->requests->push([ - 'id' => $token->processRequest->id, - 'name' => $token->processRequest->name, - 'parent_request_id' => $token->processRequest->parentRequest->id, - ]) - ->unique('id') - ->values(); - - // Add the token data to the request_tokens - $requestTokens = $caseParticipated->request_tokens->push($token->getKey()) - ->unique() - ->values(); - // Add the task data to the tasks - $tasks = $caseParticipated->tasks; - - if (in_array($token->element_type, ['task'])) { - $tasks = $tasks->push([ - 'id' => $token->getKey(), - 'element_id' => $token->element_id, - 'name' => $token->element_name, - 'process_id' => $token->process_id, - ]) - ->unique('id') - ->values(); - } - - $caseParticipated->update([ + $this->caseParticipated->updateOrFail([ 'case_title' => $case->case_title, 'case_title_formatted' => $case->case_title_formatted, 'case_status' => $case->case_status, - 'processes' => $processes, - 'requests' => $requests, - 'request_tokens' => $requestTokens, - 'tasks' => $tasks, + 'processes' => CaseUtils::storeProcesses($token->processRequest, $this->caseParticipated->processes), + 'requests' => CaseUtils::storeRequests($token->processRequest, $this->caseParticipated->requests), + 'request_tokens' => CaseUtils::storeRequestTokens($token->getKey(), $this->caseParticipated->request_tokens), + 'tasks' => CaseUtils::storeTasks($token, $this->caseParticipated->tasks), 'participants' => $case->participants, ]); } catch (\Exception $e) { @@ -146,4 +91,13 @@ public function updateStatus(int $caseNumber, array $statusData) \Log::error($e->getMessage()); } } + + private function checkIfCaseParticipatedExist(int $userId, int $caseNumber): bool + { + $this->caseParticipated = CaseParticipated::where('user_id', $userId) + ->where('case_number', $caseNumber) + ->first(); + + return !is_null($this->caseParticipated); + } } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index cc498f42ee..8ed1835a5d 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -26,36 +26,25 @@ public function __construct(protected CaseParticipatedRepository $caseParticipat */ public function create(ExecutionInstanceInterface $instance): void { - if (is_null($instance->case_number) || $this->checkIfCaseStartedExist($instance->case_number)) { + if (is_null($instance->case_number)) { + \Log::error('Case number is required. instance: ' . $instance->getKey()); + } + + if ($this->checkIfCaseStartedExist($instance->case_number)) { $this->updateSubProcesses($instance); return; } try { - $processes = [ - [ - 'id' => $instance->process->id, - 'name' => $instance->process->name, - ], - ]; - - $requests = [ - [ - 'id' => $instance->id, - 'name' => $instance->name, - 'parent_request_id' => $instance->parentRequest->id, - ], - ]; - - CaseStarted::create([ + $this->case = CaseStarted::create([ 'case_number' => $instance->case_number, 'user_id' => $instance->user_id, 'case_title' => $instance->case_title, 'case_title_formatted' => $instance->case_title_formatted, - 'case_status' => 'IN_PROGRESS', - 'processes' => $processes, - 'requests' => $requests, + 'case_status' => $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status, + 'processes' => CaseUtils::storeProcesses($instance, collect()), + 'requests' => CaseUtils::storeRequests($instance, collect()), 'request_tokens' => [], 'tasks' => [], 'participants' => [], @@ -64,6 +53,8 @@ public function create(ExecutionInstanceInterface $instance): void ]); } catch (\Exception $e) { \Log::error($e->getMessage()); + // trace + \Log::error($e->getTraceAsString()); } } @@ -78,26 +69,15 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok { try { if (!$this->checkIfCaseStartedExist($instance->case_number)) { + \Log::error('Case number not found. instance: ' . $instance->id); + return; } $this->case->case_title = $instance->case_title; $this->case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; - - $this->case->request_tokens = $this->case->request_tokens->push($token->getKey()) - ->unique() - ->values(); - - if (in_array($token->element_type, ['task'])) { - $this->case->tasks = $this->case->tasks->push([ - 'id' => $token->getKey(), - 'element_id' => $token->element_id, - 'name' => $token->element_name, - 'process_id' => $token->process_id, - ]) - ->unique('id') - ->values(); - } + $this->case->request_tokens = CaseUtils::storeRequestTokens($token->getKey(), $this->case->request_tokens); + $this->case->tasks = CaseUtils::storeTasks($token, $this->case->tasks); $this->updateParticipants($token); @@ -195,20 +175,8 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void try { // Store the sub-processes and requests - $this->case->processes = $this->case->processes->push([ - 'id' => $instance->process->id, - 'name' => $instance->process->name, - ]) - ->unique('id') - ->values(); - - $this->case->requests = $this->case->requests->push([ - 'id' => $instance->id, - 'name' => $instance->name, - 'parent_request_id' => $instance->parentRequest->id, - ]) - ->unique('id') - ->values(); + $this->case->processes = CaseUtils::storeProcesses($instance, $this->case->processes); + $this->case->requests = CaseUtils::storeRequests($instance, $this->case->requests); $this->case->saveOrFail(); } catch (\Exception $th) { diff --git a/ProcessMaker/Repositories/CaseUtils.php b/ProcessMaker/Repositories/CaseUtils.php new file mode 100644 index 0000000000..2d93e1d098 --- /dev/null +++ b/ProcessMaker/Repositories/CaseUtils.php @@ -0,0 +1,84 @@ +push([ + 'id' => $instance->process->id, + 'name' => $instance->process->name, + ]) + ->unique('id') + ->values(); + } + + /** + * Store requests. + * + * @param ExecutionInstanceInterface $instance + * @param Collection $requests + * @return Collection + */ + public static function storeRequests(ExecutionInstanceInterface $instance, Collection $requests) + { + return $requests->push([ + 'id' => $instance->id, + 'name' => $instance->name, + 'parent_request_id' => $instance?->parentRequest?->id, + ]) + ->unique('id') + ->values(); + } + + /** + * Store request tokens. + * + * @param int $tokenId + * @param Collection $requestTokens + * @return Collection + */ + public static function storeRequestTokens(int $tokenId, Collection $requestTokens) + { + return $requestTokens->push($tokenId) + ->unique() + ->values(); + } + + /** + * Store tasks. + * + * @param TokenInterface $token + * @param Collection $tasks + * @return Collection + */ + public static function storeTasks(TokenInterface $token, Collection $tasks) + { + if (in_array($token->element_type, self::ALLOWED_ELEMENT_TYPES)) { + return $tasks->push([ + 'id' => $token->getKey(), + 'element_id' => $token->element_id, + 'name' => $token->element_name, + 'process_id' => $token->process_id, + ]) + ->unique('id') + ->values(); + } + + return $tasks; + } +} From 3c93fd469561df0be12ab6406217d4f42e3fffb9 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 26 Sep 2024 14:40:02 -0400 Subject: [PATCH 25/45] test: populate case sub processes --- ProcessMaker/Repositories/CaseRepository.php | 9 +- tests/Feature/Cases/CaseParticipatedTest.php | 13 +- .../Cases/CaseStartedSubProcessTest.php | 400 ++++++++++++++++++ tests/Feature/Cases/CaseStartedTest.php | 5 + 4 files changed, 425 insertions(+), 2 deletions(-) create mode 100644 tests/Feature/Cases/CaseStartedSubProcessTest.php diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 8ed1835a5d..27ed0ff6a5 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -28,6 +28,8 @@ public function create(ExecutionInstanceInterface $instance): void { if (is_null($instance->case_number)) { \Log::error('Case number is required. instance: ' . $instance->getKey()); + + return; } if ($this->checkIfCaseStartedExist($instance->case_number)) { @@ -53,7 +55,6 @@ public function create(ExecutionInstanceInterface $instance): void ]); } catch (\Exception $e) { \Log::error($e->getMessage()); - // trace \Log::error($e->getTraceAsString()); } } @@ -67,6 +68,12 @@ public function create(ExecutionInstanceInterface $instance): void */ public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { + if (is_null($instance->case_number)) { + \Log::error('Case number is required. instance: ' . $instance->getKey()); + + return; + } + try { if (!$this->checkIfCaseStartedExist($instance->case_number)) { \Log::error('Case number not found. instance: ' . $instance->id); diff --git a/tests/Feature/Cases/CaseParticipatedTest.php b/tests/Feature/Cases/CaseParticipatedTest.php index d28e80c0dc..a0b6795116 100644 --- a/tests/Feature/Cases/CaseParticipatedTest.php +++ b/tests/Feature/Cases/CaseParticipatedTest.php @@ -38,6 +38,7 @@ public function test_create_case_participated() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -53,7 +54,7 @@ public function test_create_case_participated() 'processes->[0]->name' => $process->name, 'requests->[0]->id' => $instance->id, 'requests->[0]->name' => $instance->name, - 'requests->[0]->parent_request_id' => $instance->parent_request_id ?? 0, + 'requests->[0]->parent_request_id' => $instance->parent_request_id, 'request_tokens->[0]' => $token->id, 'tasks->[0]->id' => $token->id, 'tasks->[0]->element_id' => $token->element_id, @@ -86,6 +87,7 @@ public function test_create_multiple_case_participated() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -107,6 +109,7 @@ public function test_create_multiple_case_participated() $token2 = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token2); @@ -156,6 +159,7 @@ public function test_update_case_participated_users() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -177,6 +181,7 @@ public function test_update_case_participated_users() $token2 = ProcessRequestToken::factory()->create([ 'user_id' => $user2->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token2); @@ -215,6 +220,7 @@ public function test_update_case_participated_user_tasks() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -233,6 +239,7 @@ public function test_update_case_participated_user_tasks() $token2 = ProcessRequestToken::factory()->create([ 'user_id' => $user2->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token2); @@ -251,6 +258,7 @@ public function test_update_case_participated_user_tasks() $token3 = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token3); @@ -291,6 +299,7 @@ public function test_update_case_participated_completed() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -310,6 +319,7 @@ public function test_update_case_participated_completed() $token2 = ProcessRequestToken::factory()->create([ 'user_id' => $user2->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token2); @@ -329,6 +339,7 @@ public function test_update_case_participated_completed() $token3 = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token3); diff --git a/tests/Feature/Cases/CaseStartedSubProcessTest.php b/tests/Feature/Cases/CaseStartedSubProcessTest.php new file mode 100644 index 0000000000..1aee94a0a1 --- /dev/null +++ b/tests/Feature/Cases/CaseStartedSubProcessTest.php @@ -0,0 +1,400 @@ +user = User::factory()->create(); + $this->process = Process::factory()->create(); + $this->parentRequest = ProcessRequest::factory()->create([ + 'user_id' => $this->user->id, + 'status' => 'ACTIVE', + 'process_id' => $this->process->id, + ]); + $this->parentToken = ProcessRequestToken::factory()->create([ + 'user_id' => $this->user->id, + 'process_request_id' => $this->parentRequest->id, + 'element_type' => 'task', + ]); + $this->subProcess = Process::factory()->create(); + $this->childRequest = ProcessRequest::factory()->create([ + 'user_id' => $this->user->id, + 'status' => 'ACTIVE', + 'parent_request_id' => $this->parentRequest->id, + 'process_id' => $this->subProcess->id, + ]); + $this->childToken = ProcessRequestToken::factory()->create([ + 'user_id' => $this->user->id, + 'process_request_id' => $this->childRequest->id, + 'element_type' => 'task', + ]); + + $this->user2 = User::factory()->create(); + $this->childToken2 = ProcessRequestToken::factory()->create([ + 'user_id' => $this->user2->id, + 'process_request_id' => $this->childRequest->id, + 'element_type' => 'task', + ]); + + parent::setUp(); + } + + public function test_create_case_sub_process() + { + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + ]); + } + + public function test_create_case_processes() + { + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'processes->[0]->id' => $this->process->id, + 'processes->[0]->name' => $this->process->name, + 'processes->[1]->id' => $this->subProcess->id, + 'processes->[1]->name' => $this->subProcess->name, + ]); + } + + public function test_create_case_requests() + { + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'requests->[0]->id' => $this->parentRequest->id, + 'requests->[0]->name' => $this->parentRequest->name, + 'requests->[0]->parent_request_id' => $this->parentRequest->parent_request_id, + 'requests->[1]->id' => $this->childRequest->id, + 'requests->[1]->name' => $this->childRequest->name, + 'requests->[1]->parent_request_id' => $this->childRequest->parent_request_id, + ]); + } + + public function test_create_case_request_tokens() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->childRequest); + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $this->parentToken->id, + 'request_tokens->[1]' => $this->childToken->id, + ]); + } + + public function test_create_case_tasks() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->childRequest); + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[0]->id' => $this->parentToken->id, + 'tasks->[0]->element_id' => $this->parentToken->element_id, + 'tasks->[0]->name' => $this->parentToken->element_name, + 'tasks->[0]->process_id' => $this->parentToken->process_id, + 'tasks->[1]->id' => $this->childToken->id, + 'tasks->[1]->element_id' => $this->childToken->element_id, + 'tasks->[1]->name' => $this->childToken->element_name, + 'tasks->[1]->process_id' => $this->childToken->process_id, + ]); + } + + public function test_create_case_participated_processes() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_participated', 0); + + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + $repo->update($this->childRequest, $this->childToken2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'processes->[0]->id' => $this->process->id, + 'processes->[0]->name' => $this->process->name, + 'processes->[1]->id' => $this->subProcess->id, + 'processes->[1]->name' => $this->subProcess->name, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'processes->[0]->id' => $this->subProcess->id, + 'processes->[0]->name' => $this->subProcess->name, + ]); + } + + public function test_create_case_participated_requests() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_participated', 0); + + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + $repo->update($this->childRequest, $this->childToken2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'requests->[0]->id' => $this->parentRequest->id, + 'requests->[0]->name' => $this->parentRequest->name, + 'requests->[0]->parent_request_id' => $this->parentRequest->parent_request_id, + 'requests->[1]->id' => $this->childRequest->id, + 'requests->[1]->name' => $this->childRequest->name, + 'requests->[1]->parent_request_id' => $this->childRequest->parent_request_id, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'requests->[0]->id' => $this->childRequest->id, + 'requests->[0]->name' => $this->childRequest->name, + 'requests->[0]->parent_request_id' => $this->childRequest->parent_request_id, + ]); + } + + public function test_create_case_participated_request_tokens() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_participated', 0); + + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + $repo->update($this->childRequest, $this->childToken2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $this->parentToken->id, + 'request_tokens->[1]' => $this->childToken->id, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'request_tokens->[0]' => $this->childToken2->id, + ]); + } + + public function test_create_case_participated_tasks() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + $repo->create($this->childRequest); + + $this->assertDatabaseCount('cases_participated', 0); + + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + $repo->update($this->childRequest, $this->childToken2); + + $this->assertDatabaseCount('cases_participated', 2); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[0]->id' => $this->parentToken->id, + 'tasks->[0]->element_id' => $this->parentToken->element_id, + 'tasks->[0]->name' => $this->parentToken->element_name, + 'tasks->[0]->process_id' => $this->parentToken->process_id, + 'tasks->[1]->id' => $this->childToken->id, + 'tasks->[1]->element_id' => $this->childToken->element_id, + 'tasks->[1]->name' => $this->childToken->element_name, + 'tasks->[1]->process_id' => $this->childToken->process_id, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_title' => 'Case #' . $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'tasks->[0]->id' => $this->childToken2->id, + 'tasks->[0]->element_id' => $this->childToken2->element_id, + 'tasks->[0]->name' => $this->childToken2->element_name, + 'tasks->[0]->process_id' => $this->childToken2->process_id, + 'tasks->[1]->id' => null, + 'tasks->[1]->element_id' => null, + 'tasks->[1]->name' => null, + 'tasks->[1]->process_id' => null, + ]); + } + + public function test_update_case_participated_completed() + { + $repoParticipant = new CaseParticipatedRepository(); + + $repo = new CaseRepository($repoParticipant); + $repo->create($this->parentRequest); + $repo->create($this->childRequest); + + $repo->update($this->parentRequest, $this->parentToken); + $repo->update($this->childRequest, $this->childToken); + $repo->update($this->childRequest, $this->childToken2); + + $this->assertDatabaseCount('cases_started', 1); + $this->assertDatabaseCount('cases_participated', 2); + + $this->childRequest->status = 'COMPLETED'; + $repo->updateStatus($this->childRequest); + + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'case_status' => 'IN_PROGRESS', + 'completed_at' => null, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_status' => 'IN_PROGRESS', + 'completed_at' => null, + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_status' => 'IN_PROGRESS', + 'completed_at' => null, + ]); + + $this->parentRequest->status = 'COMPLETED'; + $repo->updateStatus($this->parentRequest); + + $this->assertDatabaseHas('cases_started', [ + 'case_number' => $this->parentRequest->case_number, + 'case_status' => 'COMPLETED', + 'completed_at' => now(), + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user->id, + 'case_status' => 'COMPLETED', + 'completed_at' => now(), + ]); + $this->assertDatabaseHas('cases_participated', [ + 'case_number' => $this->parentRequest->case_number, + 'user_id' => $this->user2->id, + 'case_status' => 'COMPLETED', + 'completed_at' => now(), + ]); + } +} diff --git a/tests/Feature/Cases/CaseStartedTest.php b/tests/Feature/Cases/CaseStartedTest.php index 87a87067d0..ffbd3a12d6 100644 --- a/tests/Feature/Cases/CaseStartedTest.php +++ b/tests/Feature/Cases/CaseStartedTest.php @@ -146,6 +146,7 @@ public function test_update_case_started_request_tokens() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -185,6 +186,7 @@ public function test_update_case_started_tasks() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -202,6 +204,7 @@ public function test_update_case_started_tasks() $token2 = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token2); @@ -245,6 +248,7 @@ public function test_update_case_started_script_tasks() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); @@ -364,6 +368,7 @@ public function test_update_case_started_status() $token = ProcessRequestToken::factory()->create([ 'user_id' => $user->id, 'process_request_id' => $instance->id, + 'element_type' => 'task', ]); $repo->update($instance, $token); From 143664c28b423ea3ab2cfd9ca6dfe6bf3b39b020 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Thu, 26 Sep 2024 15:38:42 -0400 Subject: [PATCH 26/45] test: fix CaseStartedSubProcessTest setup --- tests/Feature/Cases/CaseStartedSubProcessTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Cases/CaseStartedSubProcessTest.php b/tests/Feature/Cases/CaseStartedSubProcessTest.php index 1aee94a0a1..db4204931c 100644 --- a/tests/Feature/Cases/CaseStartedSubProcessTest.php +++ b/tests/Feature/Cases/CaseStartedSubProcessTest.php @@ -36,6 +36,8 @@ class CaseStartedSubProcessTest extends TestCase protected function setUp(): void { + parent::setUp(); + $this->user = User::factory()->create(); $this->process = Process::factory()->create(); $this->parentRequest = ProcessRequest::factory()->create([ @@ -67,8 +69,6 @@ protected function setUp(): void 'process_request_id' => $this->childRequest->id, 'element_type' => 'task', ]); - - parent::setUp(); } public function test_create_case_sub_process() From 1858009b36ace4b499dfe61ccbbb2c5f12caedb4 Mon Sep 17 00:00:00 2001 From: Eleazar Resendez Date: Thu, 26 Sep 2024 17:43:51 -0600 Subject: [PATCH 27/45] fix: implement Last-Modified header with If-Modified-Since validation for cache control --- .../Controllers/Api/V1_1/TaskController.php | 94 ++++++++++++------- 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php b/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php index f27c538dfc..c25fe4f0a2 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php @@ -4,8 +4,11 @@ namespace ProcessMaker\Http\Controllers\Api\V1_1; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\Request; +use Illuminate\Http\Response; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Resources\V1_1\TaskInterstitialResource; use ProcessMaker\Http\Resources\V1_1\TaskResource; @@ -59,34 +62,6 @@ public function index() ]; } - private function processFilters(Request $request, Builder $query) - { - if (request()->has('user_id')) { - ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id')); - } - - if ($request->has('process_request_id')) { - $query->where(function ($q) use ($request) { - $q->where('process_request_id', $request->input('process_request_id')); - $this->addSubprocessTasks($request, $q); - }); - } - if ($request->has('status')) { - $query->where('status', $request->input('status')); - } - } - - private function addSubprocessTasks(Request $request, Builder &$q) - { - if ($request->has('include_sub_tasks')) { - $q->orWhereIn( - 'process_request_id', - ProcessRequest::select('id') - ->where('parent_request_id', $request->input('process_request_id')) - ); - } - } - public function show(ProcessRequestToken $task) { $resource = TaskResource::preprocessInclude(request(), ProcessRequestToken::where('id', $task->id)); @@ -94,19 +69,44 @@ public function show(ProcessRequestToken $task) return $resource->toArray(request()); } - public function showScreen($taskId) + /** + * Display the screen for a given task. + * + * @throws ModelNotFoundException If the task is not found. + */ + public function showScreen(Request $request, int $taskId): Response { + // Fetch the task data. $task = ProcessRequestToken::select( array_merge($this->defaultFields, ['process_request_id', 'process_id']) )->findOrFail($taskId); + + // Prepare the response. $response = new TaskScreen($task); - $response = response($response->toArray(request())['screen'], 200); - $now = time(); - // screen cache time + $screen = $response->toArray($request)['screen']; + $now = isset($screen['updated_at']) + ? Carbon::parse($screen['updated_at'])->timestamp + : time(); + + // Create the response object. + $response = response($screen, 200); + + // Set Cache-Control headers. $cacheTime = config('screen_task_cache_time', 86400); - $response->headers->set('Cache-Control', 'max-age=' . $cacheTime . ', must-revalidate, public'); + $response->headers->set('Cache-Control', 'no-cache, must-revalidate, public'); $response->headers->set('Expires', gmdate('D, d M Y H:i:s', $now + $cacheTime) . ' GMT'); + // Set Last-Modified header. + $response->headers->set('Last-Modified', gmdate('D, d M Y H:i:s', $now) . ' GMT'); + + // Return 304 if the resource has not been modified since the provided date. + if ($request->headers->has('If-Modified-Since')) { + $ifModifiedSince = strtotime($request->headers->get('If-Modified-Since')); + if ($ifModifiedSince >= $now) { + return response()->noContent(304); + } + } + return $response; } @@ -125,4 +125,32 @@ public function showInterstitial($taskId) return $response; } + + private function processFilters(Request $request, Builder $query) + { + if (request()->has('user_id')) { + ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id')); + } + + if ($request->has('process_request_id')) { + $query->where(function ($q) use ($request) { + $q->where('process_request_id', $request->input('process_request_id')); + $this->addSubprocessTasks($request, $q); + }); + } + if ($request->has('status')) { + $query->where('status', $request->input('status')); + } + } + + private function addSubprocessTasks(Request $request, Builder &$q) + { + if ($request->has('include_sub_tasks')) { + $q->orWhereIn( + 'process_request_id', + ProcessRequest::select('id') + ->where('parent_request_id', $request->input('process_request_id')) + ); + } + } } From 64f71a00c91eafce68df8102a47e9a7893898068 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Thu, 26 Sep 2024 17:35:35 -0700 Subject: [PATCH 28/45] Allow admin users to reassign any user task --- ProcessMaker/Models/ProcessRequestToken.php | 22 +----- .../Policies/ProcessRequestTokenPolicy.php | 35 +++++++--- .../ProcessMaker/Models/UserFactory.php | 4 +- .../Api/ProcessRequestTokenPolicyTest.php | 70 +++++++++++++++++++ 4 files changed, 99 insertions(+), 32 deletions(-) diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index 1b88fe7ca6..18de925842 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -7,6 +7,7 @@ use Exception; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Notification; use Laravel\Scout\Searchable; use Log; @@ -496,25 +497,6 @@ public function getAdvanceStatusAttribute() return $result; } - /** - * Check if the user has access to reassign this task - * - * @param User $user - */ - public function authorizeReassignment(User $user) - { - if ($user->can('update', $this)) { - $definitions = $this->getDefinition(); - if (empty($definitions['allowReassignment']) || $definitions['allowReassignment'] === 'false') { - throw new AuthorizationException('Not authorized to reassign this task'); - } - - return true; - } else { - throw new AuthorizationException('Not authorized to view this task'); - } - } - /** * Check if this task can be escalated to the manager by the assignee * @@ -1168,7 +1150,7 @@ public function reassign($toUserId, User $requestingUser) $reassingAction = true; } else { // Validate if user can reassign - $this->authorizeReassignment($requestingUser); + Gate::forUser($requestingUser)->authorize('reassign', $this); // Reassign user $this->reassignTo($toUserId); $this->persistUserData($toUserId); diff --git a/ProcessMaker/Policies/ProcessRequestTokenPolicy.php b/ProcessMaker/Policies/ProcessRequestTokenPolicy.php index 43893e3bd6..4f4612d651 100644 --- a/ProcessMaker/Policies/ProcessRequestTokenPolicy.php +++ b/ProcessMaker/Policies/ProcessRequestTokenPolicy.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Policies; use Illuminate\Auth\Access\HandlesAuthorization; +use Illuminate\Auth\Access\Response; use Illuminate\Support\Facades\Request; use ProcessMaker\Models\AnonymousUser; use ProcessMaker\Models\ProcessRequestToken; @@ -17,7 +18,7 @@ class ProcessRequestTokenPolicy * Run before all methods to determine if the * user is an admin and can do everything. * - * @param \ProcessMaker\Models\User $user + * @param User $user * @return mixed */ public function before(User $user) @@ -30,8 +31,8 @@ public function before(User $user) /** * Determine whether the user can view the process request token. * - * @param \ProcessMaker\Models\User $user - * @param \ProcessMaker\Models\ProcessRequestToken $processRequestToken + * @param User $user + * @param ProcessRequestToken $processRequestToken * @return mixed */ public function view(User $user, ProcessRequestToken $processRequestToken) @@ -49,8 +50,8 @@ public function view(User $user, ProcessRequestToken $processRequestToken) /** * Determine whether the user can update the process request token. * - * @param \ProcessMaker\Models\User $user - * @param \ProcessMaker\Models\ProcessRequestToken $processRequestToken + * @param User $user + * @param ProcessRequestToken $processRequestToken * @return mixed */ public function update(User $user, ProcessRequestToken $processRequestToken) @@ -70,9 +71,9 @@ public function update(User $user, ProcessRequestToken $processRequestToken) /** * Determine if the user can view a screen associated with the task * - * @param \ProcessMaker\Models\User $user - * @param \ProcessMaker\Models\ProcessRequestToken $processRequestToken - * @param \ProcessMaker\Models\Screen $screen + * @param User $user + * @param ProcessRequestToken $processRequestToken + * @param Screen $screen * @return mixed */ public function viewScreen(User $user, ProcessRequestToken $task, Screen $screen) @@ -92,8 +93,8 @@ public function viewScreen(User $user, ProcessRequestToken $task, Screen $screen /** * Determine if a user can rollback the process request. * - * @param \ProcessMaker\Models\User $user - * @param \ProcessMaker\Models\ProcessRequestToken $processRequestToken + * @param User $user + * @param ProcessRequestToken $processRequestToken * * @return bool */ @@ -102,4 +103,18 @@ public function rollback(User $user, ProcessRequestToken $task) // For now, only the process manager can rollback the request return $user->id === $task->process->managerId; } + + public function reassign(User $user, ProcessRequestToken $task) + { + if ($user->can('update', $task)) { + $definitions = $task->getDefinition(); + if (empty($definitions['allowReassignment']) || $definitions['allowReassignment'] === 'false') { + return Response::deny('Not authorized to reassign this task'); + } + + return true; + } else { + return Response::deny('Not authorized to update this task'); + } + } } diff --git a/database/factories/ProcessMaker/Models/UserFactory.php b/database/factories/ProcessMaker/Models/UserFactory.php index b838effb7a..9a4380b193 100644 --- a/database/factories/ProcessMaker/Models/UserFactory.php +++ b/database/factories/ProcessMaker/Models/UserFactory.php @@ -20,10 +20,10 @@ public function definition(): array } return [ - 'username' => $this->faker->unique()->userName().'.'.$this->faker->word(), + 'username' => $this->faker->unique()->userName() . '.' . $this->faker->word(), 'email' => $this->faker->unique()->email(), 'password' => $GLOBALS['testPassword'], - 'status' => $this->faker->randomElement(['ACTIVE', 'INACTIVE']), + 'status' => 'ACTIVE', 'firstname' => $this->faker->firstName(), 'lastname' => $this->faker->lastName(), 'address' => $this->faker->streetAddress(), diff --git a/tests/Feature/Api/ProcessRequestTokenPolicyTest.php b/tests/Feature/Api/ProcessRequestTokenPolicyTest.php index f80c800682..ff2d9d63db 100644 --- a/tests/Feature/Api/ProcessRequestTokenPolicyTest.php +++ b/tests/Feature/Api/ProcessRequestTokenPolicyTest.php @@ -6,6 +6,8 @@ use Faker\Factory as Faker; use Illuminate\Support\Facades\Hash; use ProcessMaker\Models\Process; +use ProcessMaker\Models\ProcessCategory; +use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\ProcessTaskAssignment; use ProcessMaker\Models\Screen; @@ -124,4 +126,72 @@ public function testGetInterstitialNestedScreen() $response->assertStatus(200); $this->assertEquals('Screen Interstitial', $response->json()['config'][0]['name']); } + + public function createTaskHelper($allowReassignment, $assignedTo) + { + ProcessCategory::factory()->create(['is_system' => true]); + $this->seed(\ProcessMaker\Package\AdvancedUserManager\Database\Seeds\AssignmentProcessSeeder::class); + + $bpmn = file_get_contents(base_path('tests/Feature/Api/bpmnPatterns/SimpleTaskProcess.bpmn')); + $value = $allowReassignment ? 'true' : 'false'; + $bpmn = str_replace('pm:allowReassignment="false"', 'pm:allowReassignment="' . $value . '"', $bpmn); + $process = Process::factory()->create(['bpmn' => $bpmn]); + + $url = route('api.process_events.trigger', [$process->id, 'event' => 'node_1']); + $this->apiCall('POST', $url); + + $task = ProcessRequestToken::where('status', 'ACTIVE')->first(); + $task->user_id = $assignedTo->id; + $task->save(); + + return $task; + } + + public function testReassignTask() + { + $assignedUser = User::factory()->create(); + $reassignToUser = User::factory()->create(); + $task = $this->createTaskHelper(true, $assignedUser); + + $this->user = $assignedUser; + $response = $this->apiCall('PUT', route('api.tasks.update', $task), [ + 'user_id' => $reassignToUser->id, + ]); + $response->assertStatus(200); + + $this->assertEquals($reassignToUser->id, $task->refresh()->user_id); + } + + public function testReassignWithoutTaskSetting() + { + $assignedUser = User::factory()->create(); + $reassignToUser = User::factory()->create(); + $task = $this->createTaskHelper(false, $assignedUser); + + $this->user = $assignedUser; + $response = $this->apiCall('PUT', route('api.tasks.update', $task), [ + 'user_id' => $reassignToUser->id, + ]); + $response->assertStatus(403); + + $this->assertEquals('Not authorized to reassign this task', $response->json()['message']); + } + + public function testAdminReassignWithoutTaskSetting() + { + $assignedUser = User::factory()->create(); + $reassignToUser = User::factory()->create(); + $adminUser = User::factory()->create([ + 'is_administrator' => true, + ]); + $task = $this->createTaskHelper(false, $assignedUser); + + $this->user = $adminUser; + $response = $this->apiCall('PUT', route('api.tasks.update', $task), [ + 'user_id' => $reassignToUser->id, + ]); + $response->assertStatus(200); + + $this->assertEquals($reassignToUser->id, $task->refresh()->user_id); + } } From a168f7eb446d26c4e045ca37a1507256bd50f8bd Mon Sep 17 00:00:00 2001 From: Eleazar Resendez Date: Fri, 27 Sep 2024 09:50:12 -0600 Subject: [PATCH 29/45] Revert "fix: implement Last-Modified header with If-Modified-Since validation for cache control" This reverts commit 1858009b36ace4b499dfe61ccbbb2c5f12caedb4. --- .../Controllers/Api/V1_1/TaskController.php | 94 +++++++------------ 1 file changed, 33 insertions(+), 61 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php b/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php index c25fe4f0a2..f27c538dfc 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/TaskController.php @@ -4,11 +4,8 @@ namespace ProcessMaker\Http\Controllers\Api\V1_1; -use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\Request; -use Illuminate\Http\Response; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Resources\V1_1\TaskInterstitialResource; use ProcessMaker\Http\Resources\V1_1\TaskResource; @@ -62,6 +59,34 @@ public function index() ]; } + private function processFilters(Request $request, Builder $query) + { + if (request()->has('user_id')) { + ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id')); + } + + if ($request->has('process_request_id')) { + $query->where(function ($q) use ($request) { + $q->where('process_request_id', $request->input('process_request_id')); + $this->addSubprocessTasks($request, $q); + }); + } + if ($request->has('status')) { + $query->where('status', $request->input('status')); + } + } + + private function addSubprocessTasks(Request $request, Builder &$q) + { + if ($request->has('include_sub_tasks')) { + $q->orWhereIn( + 'process_request_id', + ProcessRequest::select('id') + ->where('parent_request_id', $request->input('process_request_id')) + ); + } + } + public function show(ProcessRequestToken $task) { $resource = TaskResource::preprocessInclude(request(), ProcessRequestToken::where('id', $task->id)); @@ -69,44 +94,19 @@ public function show(ProcessRequestToken $task) return $resource->toArray(request()); } - /** - * Display the screen for a given task. - * - * @throws ModelNotFoundException If the task is not found. - */ - public function showScreen(Request $request, int $taskId): Response + public function showScreen($taskId) { - // Fetch the task data. $task = ProcessRequestToken::select( array_merge($this->defaultFields, ['process_request_id', 'process_id']) )->findOrFail($taskId); - - // Prepare the response. $response = new TaskScreen($task); - $screen = $response->toArray($request)['screen']; - $now = isset($screen['updated_at']) - ? Carbon::parse($screen['updated_at'])->timestamp - : time(); - - // Create the response object. - $response = response($screen, 200); - - // Set Cache-Control headers. + $response = response($response->toArray(request())['screen'], 200); + $now = time(); + // screen cache time $cacheTime = config('screen_task_cache_time', 86400); - $response->headers->set('Cache-Control', 'no-cache, must-revalidate, public'); + $response->headers->set('Cache-Control', 'max-age=' . $cacheTime . ', must-revalidate, public'); $response->headers->set('Expires', gmdate('D, d M Y H:i:s', $now + $cacheTime) . ' GMT'); - // Set Last-Modified header. - $response->headers->set('Last-Modified', gmdate('D, d M Y H:i:s', $now) . ' GMT'); - - // Return 304 if the resource has not been modified since the provided date. - if ($request->headers->has('If-Modified-Since')) { - $ifModifiedSince = strtotime($request->headers->get('If-Modified-Since')); - if ($ifModifiedSince >= $now) { - return response()->noContent(304); - } - } - return $response; } @@ -125,32 +125,4 @@ public function showInterstitial($taskId) return $response; } - - private function processFilters(Request $request, Builder $query) - { - if (request()->has('user_id')) { - ProcessRequestToken::scopeWhereUserAssigned($query, request()->get('user_id')); - } - - if ($request->has('process_request_id')) { - $query->where(function ($q) use ($request) { - $q->where('process_request_id', $request->input('process_request_id')); - $this->addSubprocessTasks($request, $q); - }); - } - if ($request->has('status')) { - $query->where('status', $request->input('status')); - } - } - - private function addSubprocessTasks(Request $request, Builder &$q) - { - if ($request->has('include_sub_tasks')) { - $q->orWhereIn( - 'process_request_id', - ProcessRequest::select('id') - ->where('parent_request_id', $request->input('process_request_id')) - ); - } - } } From d8186eab8faa876c6419ddf8df88b8636b9b1104 Mon Sep 17 00:00:00 2001 From: Eleazar Resendez Date: Fri, 27 Sep 2024 09:59:02 -0600 Subject: [PATCH 30/45] feat: implement cache-busting with version parameter to ensure screen updates are reflected - Added a version parameter to screen URLs based on the last modified id. - Ensures that changes in the screen trigger a new URL, bypassing cached versions. - Prevents stale data by forcing the browser to fetch the updated resource when changes occur. --- resources/views/tasks/edit.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/tasks/edit.blade.php b/resources/views/tasks/edit.blade.php index d6bc80fe34..80a4691396 100644 --- a/resources/views/tasks/edit.blade.php +++ b/resources/views/tasks/edit.blade.php @@ -55,6 +55,7 @@ class="card border-0" v-model="formData" :initial-task-id="{{ $task->id }}" :initial-request-id="{{ $task->process_request_id }}" + :screen-version="{{ $task->screen['id'] ?? null }}" :user-id="{{ Auth::user()->id }}" csrf-token="{{ csrf_token() }}" initial-loop-context="{{ $task->getLoopContext() }}" From e0638fd685a76b56c28690b44de2974ccce15a80 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Fri, 27 Sep 2024 15:24:51 -0400 Subject: [PATCH 31/45] Cast users and groups to array of strings --- ProcessMaker/Repositories/TokenRepository.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ProcessMaker/Repositories/TokenRepository.php b/ProcessMaker/Repositories/TokenRepository.php index 7e3e00179a..ac00c94301 100644 --- a/ProcessMaker/Repositories/TokenRepository.php +++ b/ProcessMaker/Repositories/TokenRepository.php @@ -135,6 +135,10 @@ public function persistActivityActivated(ActivityInterface $activity, TokenInter $evaluatedUsers = is_array($evaluatedUsers) ? $evaluatedUsers : [$evaluatedUsers]; $evaluatedGroups = is_array($evaluatedGroups) ? $evaluatedGroups : [$evaluatedGroups]; + // convert to array of strings + $evaluatedUsers = array_map('strval', $evaluatedUsers); + $evaluatedGroups = array_map('strval', $evaluatedGroups); + $token->self_service_groups = ['users' => $evaluatedUsers, 'groups' => $evaluatedGroups]; break; case 'rule_expression': From 01dd406323ac5db5e20497a4d1c1417620087c09 Mon Sep 17 00:00:00 2001 From: Nolan Ehrstrom Date: Fri, 27 Sep 2024 13:26:44 -0700 Subject: [PATCH 32/45] Fix call to missing method --- ProcessMaker/Models/Process.php | 2 +- .../unit/ProcessMaker/Models/ProcessTest.php | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/unit/ProcessMaker/Models/ProcessTest.php diff --git a/ProcessMaker/Models/Process.php b/ProcessMaker/Models/Process.php index 34f1fb6b81..5890d05815 100644 --- a/ProcessMaker/Models/Process.php +++ b/ProcessMaker/Models/Process.php @@ -1077,7 +1077,7 @@ public function getConsolidatedUsers($groupOrGroups, array &$users) ->where('groups.status', 'ACTIVE') ->chunk(1000, function ($members) use (&$users) { $groupIds = $members->pluck('member_id')->toArray(); - $users = $this->addActiveAssignedGroupMembers($groupIds, $users); + $users = $this->getConsolidatedUsers($groupIds, $users); }); return $users; diff --git a/tests/unit/ProcessMaker/Models/ProcessTest.php b/tests/unit/ProcessMaker/Models/ProcessTest.php new file mode 100644 index 0000000000..e74cec820c --- /dev/null +++ b/tests/unit/ProcessMaker/Models/ProcessTest.php @@ -0,0 +1,33 @@ +create(); + + $groupA = Group::factory()->create(['name' => 'Group A', 'status' => 'ACTIVE']); + $groupB = Group::factory()->create(['name' => 'Group B', 'status' => 'ACTIVE']); + + $groupAUser = User::factory()->create(['status' => 'ACTIVE']); + $groupBUser = User::factory()->create(['status' => 'ACTIVE']); + + $groupA->groupMembers()->create(['member_id' => $groupAUser->id, 'member_type' => User::class]); + $groupB->groupMembers()->create(['member_id' => $groupBUser->id, 'member_type' => User::class]); + + // Add group B to group A + $groupA->groupMembers()->create(['member_id' => $groupB->id, 'member_type' => Group::class]); + + $users = []; + $process->getConsolidatedUsers($groupA->id, $users); + + $this->assertEquals([$groupAUser->id, $groupBUser->id], $users); + } +} From e9211d0652b43be1219b6e3ba7ef123bc582bdd2 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Sun, 29 Sep 2024 10:31:49 -0700 Subject: [PATCH 33/45] Update JS dependencies --- package-lock.json | 4764 +++++++++++++++++++++++++++++++++++++++++---- package.json | 6 +- 2 files changed, 4399 insertions(+), 371 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6212cd5ec4..46c9eace28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,10 +20,10 @@ "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/vue-fontawesome": "^0.1.9", "@panter/vue-i18next": "^0.15.2", - "@processmaker/modeler": "1.60.1", + "@processmaker/modeler": "1.61.0", "@processmaker/processmaker-bpmn-moddle": "0.16.0", - "@processmaker/screen-builder": "2.99.1", - "@processmaker/vue-form-elements": "0.59.0", + "@processmaker/screen-builder": "2.99.2", + "@processmaker/vue-form-elements": "0.60.0", "@processmaker/vue-multiselect": "2.3.0", "@tinymce/tinymce-vue": "2.0.0", "autoprefixer": "10.4.5", @@ -598,6 +598,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -2984,6 +3000,12 @@ "vue": ">=2.0.0" } }, + "node_modules/@philippfromme/moddle-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.1.0.tgz", + "integrity": "sha512-eKnrt2mCtcYFhweNr20mOWSG0431BPPFnhYJEQd+D2/5ssWPaHVEEgD3YnUOmbg1gdRQdVe2rrxcdEvvPugB/A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2993,6 +3015,161 @@ "node": ">=14" } }, + "node_modules/@processmaker/modeler": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.61.0.tgz", + "integrity": "sha512-1yamAAtPD7MObua14TW0QZ8oJutcS8veoiO/Xm1ojYuCNStJ5gUiXSqk5H9/XoMMjmTmVYz2+ZJ81Z3gStHPUg==", + "dependencies": { + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@fortawesome/fontawesome-free": "^5.11.2", + "@fortawesome/fontawesome-svg-core": "^1.2.25", + "@fortawesome/free-brands-svg-icons": "^6.4.2", + "@fortawesome/free-solid-svg-icons": "^5.11.2", + "@fortawesome/vue-fontawesome": "^0.1.8", + "@processmaker/screen-builder": "2.99.2", + "@processmaker/vue-form-elements": "0.60.0", + "@processmaker/vue-multiselect": "2.3.0", + "bootstrap": "^4.3.1", + "bootstrap-vue": "^2.0.4", + "bpmn-moddle": "^6.0.0", + "bpmnlint": "^6.4.0", + "bpmnlint-plugin-processmaker": "1.5.0", + "core-js": "^3.8.3", + "file-saver": "^2.0.5", + "jest-junit": "^12.0.0", + "jointjs": "^3.1.1", + "js-yaml-loader": "^1.2.2", + "lodash": "^4.17.21", + "lodash-contrib": "^4.1200.1", + "luxon": "^1.21.1", + "mocha-junit-reporter": "^2.0.0", + "mustache": "^3.2.1", + "popper.js": "^1.16.1", + "socket.io-client": "^4.7.2", + "svg-inline-loader": "^0.8.2", + "tinycolor2": "^1.4.2", + "vue": "^2.6.12", + "vue-deepset": "^0.6.3", + "vue-inline-svg": "^2.1.3", + "vue-monaco": "^1.2.1", + "vue-popperjs": "^2.3.0", + "vue-upload-component": "^2.8.20", + "vuex": "^3.5.1", + "y-websocket": "^1.5.0", + "yjs": "^13.6.7" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "peerDependencies": { + "@fortawesome/free-solid-svg-icons": "^5.11.2", + "@fortawesome/vue-fontawesome": "^0.1.8", + "@panter/vue-i18next": "^0.15.1", + "bootstrap": "^4.3.1", + "bootstrap-vue": "^2.0.4", + "bpmn-moddle": "^6.0.0", + "i18next": "^15.0.8", + "jointjs": "^3.1.1", + "lodash": "^4.17.21", + "luxon": "^1.21.1", + "vue": "^2.6.12", + "vue-color": "^2.7.1" + } + }, + "node_modules/@processmaker/modeler/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@processmaker/modeler/node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz", + "integrity": "sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@processmaker/modeler/node_modules/engine.io-client": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", + "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/@processmaker/modeler/node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@processmaker/modeler/node_modules/socket.io-client": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.0.tgz", + "integrity": "sha512-C0jdhD5yQahMws9alf/yvtsMGTaIDBnZ8Rb5HU56svyq0l5LIrGzIDZZD5pHQlmzxLuU91Gz+VpQMKgCTNYtkw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@processmaker/modeler/node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@processmaker/modeler/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@processmaker/modeler/node_modules/xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/@processmaker/processmaker-bpmn-moddle": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@processmaker/processmaker-bpmn-moddle/-/processmaker-bpmn-moddle-0.16.0.tgz", @@ -3002,9 +3179,9 @@ } }, "node_modules/@processmaker/screen-builder": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-2.99.1.tgz", - "integrity": "sha512-t629KYIvUvoVwMtqQjKANEfwGHwG0YcAlHSL/jjAsz6K+kYWVj6NaISPtP1PcIepJJScpEkg7yxPxhflDiDvrQ==", + "version": "2.99.2", + "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-2.99.2.tgz", + "integrity": "sha512-nmWYDgsKNaNLhPUsurMnWJya6sMIBii6RGN6G+Lz7axf6xfdgdXhmxT4z+Ylhz4bqPFXH7t6BaQ/femc2oajPg==", "dependencies": { "@chantouchsek/validatorjs": "1.2.3", "@storybook/addon-docs": "^7.6.13", @@ -3027,7 +3204,7 @@ }, "peerDependencies": { "@panter/vue-i18next": "^0.15.0", - "@processmaker/vue-form-elements": "0.59.0", + "@processmaker/vue-form-elements": "0.60.0", "i18next": "^15.0.8", "vue": "^2.6.12", "vuex": "^3.1.1" @@ -3053,9 +3230,9 @@ "integrity": "sha512-JAc0mtW7NeO+0SwPRcdkfDbWLgkqL9WfP1NbpP9wNASsW6oWqgZqNIWt4teymGjZIXTElx3dnQmUYHmVrJ7HxA==" }, "node_modules/@processmaker/vue-form-elements": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@processmaker/vue-form-elements/-/vue-form-elements-0.59.0.tgz", - "integrity": "sha512-LHOehmt5DjM1uIfR+WO42T5MnWn8fOmoaFHZWawKvcAsHiXkKChvnU7u88sZEK+H1Ba+57exd0SDizxmiJPpKg==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@processmaker/vue-form-elements/-/vue-form-elements-0.60.0.tgz", + "integrity": "sha512-Rndk+TlCl3SXGx7VeZq0207fzA3ALNEjfapXazra1yI+AQFqPYAdSLrisckSvGYPTG0TFGGBhpzh+cHjOWlwug==", "dependencies": { "@chantouchsek/validatorjs": "1.2.3", "@tinymce/tinymce-vue": "2.0.0", @@ -3081,11 +3258,6 @@ "mustache": "^3.0.1" } }, - "node_modules/@processmaker/vue-form-elements/node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" - }, "node_modules/@processmaker/vue-multiselect": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@processmaker/vue-multiselect/-/vue-multiselect-2.3.0.tgz", @@ -4257,6 +4429,11 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, "node_modules/@storybook/addon-docs": { "version": "7.6.20", "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.20.tgz", @@ -5736,6 +5913,22 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5906,6 +6099,14 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -6025,6 +6226,29 @@ "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -6093,11 +6317,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -6171,6 +6444,12 @@ "lodash": "^4.17.14" } }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "optional": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6241,9 +6520,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6388,6 +6670,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/backbone": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.1.tgz", + "integrity": "sha512-ADy1ztN074YkWbHi8ojJVFe3vAanO/lrzMGZWUClIP7oDD/Pjy2vrASraUP+2EVCfIiTtCW4FChVow01XneivA==", + "dependencies": { + "underscore": ">=1.8.3" + } + }, "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -6624,6 +6914,470 @@ "moddle-xml": "^8.0.8" } }, + "node_modules/bpmnlint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-6.5.0.tgz", + "integrity": "sha512-plF2kcTqcQ7gyusnR9gQhDd04Ld/rJ0b9k8HGa5Bg3m88w8hf6O2AJ5JHpITttncJzNNxFvNXzYmJVOhIgqB2g==", + "dependencies": { + "bpmn-moddle": "^6.0.0", + "bpmnlint-utils": "^1.0.1", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "meow": "^5.0.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.8" + }, + "bin": { + "bpmnlint": "bin/bpmnlint.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/bpmnlint-plugin-processmaker": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-processmaker/-/bpmnlint-plugin-processmaker-1.5.0.tgz", + "integrity": "sha512-iiVLQ1GBvl/EqADLsz7wqsEYJ2cohycMM0cwL3NKz+BJdsUoARFBzdKqE6hKmL+5Wn6si/hjsn8ec5oqvNWylQ==", + "dependencies": { + "bpmnlint": "^7.2.1", + "bpmnlint-utils": "^1.0.1", + "mocha": "^6.1.2" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/bpmn-moddle": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.3.tgz", + "integrity": "sha512-ZcBfw0NSOdYTSXFKEn7MOXHItz7VfLZTrFYKO8cK6V8ZzGjCcdiLIOiw7Lctw1PJsihhLiZQS8Htj2xKf+NwCg==", + "dependencies": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "moddle-xml": "^9.0.6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/bpmnlint": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-7.8.0.tgz", + "integrity": "sha512-hzmDB/yMzv90bRYkey6lvJ5fyqSCBPdIMRLBzWSvqpH/XvSasaRo3Gibp1oX3dJg1JyHeZw4EnJZdhP55CzGWQ==", + "dependencies": { + "@philippfromme/moddle-helpers": "^0.1.0", + "ansi-colors": "^4.1.1", + "bpmn-moddle": "^7.1.2", + "bpmnlint-utils": "^1.0.2", + "cli-table": "^0.3.9", + "color-support": "^1.1.3", + "min-dash": "^3.8.0", + "mri": "^1.2.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.9" + }, + "bin": { + "bpmnlint": "bin/bpmnlint.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/mocha/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/moddle-xml": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.6.tgz", + "integrity": "sha512-tl0reHpsY/aKlLGhXeFlQWlYAQHFxTkFqC8tq8jXRYpQSnLVw13T6swMaourLd7EXqHdWsc+5ggsB+fEep6xZQ==", + "dependencies": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "saxen": "^8.1.2" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/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/bpmnlint-plugin-processmaker/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/bpmnlint-plugin-processmaker/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bpmnlint-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.1.1.tgz", + "integrity": "sha512-Afdb77FmwNB3INyUfbzXW40yY+mc0qYU3SgDFeI4zTtduiVomOlfqoXiEaUIGI8Hyh7aVYpmf3O97P2w7x0DYQ==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6649,6 +7403,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -6768,6 +7527,30 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6963,6 +7746,27 @@ "tslib": "^2.0.3" } }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "dependencies": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -7341,6 +8145,17 @@ "node": ">=8" } }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/cli-table3": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", @@ -7484,6 +8299,14 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/colors-cli": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/colors-cli/-/colors-cli-1.0.33.tgz", @@ -8109,6 +8932,17 @@ "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -8119,6 +8953,15 @@ "type": "^1.0.1" } }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -8130,6 +8973,54 @@ "node": ">=0.10" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -8159,6 +9050,29 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -8267,6 +9181,19 @@ "node": ">=10" } }, + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "optional": true, + "dependencies": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -8407,6 +9334,15 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -8657,6 +9593,21 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "optional": true, + "dependencies": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -8797,6 +9748,18 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -8806,44 +9769,56 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -8852,6 +9827,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -8876,15 +9856,25 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -8903,7 +9893,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -9841,6 +10830,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "node_modules/file-system-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", @@ -9975,6 +10969,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "peer": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -10152,15 +11155,14 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -10173,7 +11175,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10270,13 +11271,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -10346,7 +11347,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -10357,6 +11357,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10376,6 +11381,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -10422,6 +11432,22 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "engines": { + "node": ">=4.x" + } + }, "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -10488,7 +11514,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10531,9 +11556,9 @@ } }, "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==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -10553,11 +11578,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -10612,9 +11637,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -10640,6 +11665,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -11143,6 +12173,12 @@ "imagemin": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "optional": true + }, "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -11202,6 +12238,14 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -11317,13 +12361,12 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11425,14 +12468,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11447,7 +12491,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -11470,7 +12513,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11509,11 +12551,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11600,10 +12655,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "engines": { "node": ">= 0.4" }, @@ -11623,7 +12677,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11650,6 +12703,14 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -11665,7 +12726,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11678,12 +12738,14 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11704,7 +12766,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11719,7 +12780,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -11731,15 +12791,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -11753,11 +12809,22 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -11794,6 +12861,15 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -11977,6 +13053,39 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jest-junit": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.3.0.tgz", + "integrity": "sha512-+NmE5ogsEjFppEl90GChrk7xgz8xzvF0f+ZT5AnhW6suJC93gvQtmQjfyjDnE0Z2nXJqEkxF0WXlvjG/J+wn/g==", + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", @@ -12103,11 +13212,23 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jointjs": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/jointjs/-/jointjs-3.7.7.tgz", + "integrity": "sha512-gwjyLfXIxovVCIHrg57WG0cyPt6dsJjgnGEGOt8gh2F2kp/T1x6z7kBf62eQqSnM7qn1XiheZV4Iopzd2doHlw==", + "deprecated": "This package has been deprecated in favor of '@joint/core'. The repository name has changed to improve organization and naming conventions. Please update your dependencies to use the new package name:\n\nnpm install @joint/core\n\nFor more information, visit the JointJS repository at: https://github.com/clientio/joint", + "dependencies": { + "backbone": "~1.4.1", + "dagre": "~0.8.5", + "graphlib": "~2.1.8", + "jquery": "~3.7.1", + "lodash": "~4.17.21" + } + }, "node_modules/jquery": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", - "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==", - "peer": true + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "node_modules/js-sdsl": { "version": "4.3.0", @@ -12128,7 +13249,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -12140,7 +13260,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/js-yaml-loader/-/js-yaml-loader-1.2.2.tgz", "integrity": "sha512-H+NeuNrG6uOs/WMjna2SjkaCw13rMWiT/D7l9+9x5n8aq88BDsh2sRmdfxckWPIHtViYHWRG6XiCKYvS1dfyLg==", - "dev": true, "dependencies": { "js-yaml": "^3.13.1", "loader-utils": "^1.2.3", @@ -12151,7 +13270,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -12160,7 +13278,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12190,6 +13307,11 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -12688,6 +13810,153 @@ "node": ">=12" } }, + "node_modules/level": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", + "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", + "optional": true, + "dependencies": { + "level-js": "^5.0.0", + "level-packager": "^5.1.0", + "leveldown": "^5.4.0" + }, + "engines": { + "node": ">=8.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "optional": true, + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "optional": true, + "dependencies": { + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "optional": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/level-js": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", + "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", + "optional": true, + "dependencies": { + "abstract-leveldown": "~6.2.3", + "buffer": "^5.5.0", + "inherits": "^2.0.3", + "ltgt": "^2.1.2" + } + }, + "node_modules/level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "optional": true, + "dependencies": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "optional": true, + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/leveldown": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", + "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "optional": true, + "dependencies": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -12701,6 +13970,26 @@ "node": ">= 0.8.0" } }, + "node_modules/lib0": { + "version": "0.2.98", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.98.tgz", + "integrity": "sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==", + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -12714,6 +14003,32 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -12765,6 +14080,19 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-contrib": { + "version": "4.1200.1", + "resolved": "https://registry.npmjs.org/lodash-contrib/-/lodash-contrib-4.1200.1.tgz", + "integrity": "sha512-5QkRLyRLjc7J3BOqkqW5BkKXVUMhvlDZ5VqDSrGJnipIIY1KsW/vs3rrIzHg3XqBO6Hibc4o8JTLhdJIHr52Wg==", + "dependencies": { + "lodash": "4.12.x" + } + }, + "node_modules/lodash-contrib/node_modules/lodash": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", + "integrity": "sha512-H7Y9y0h/WibZBZyt9IOEEDaNJCzmpEoUQNB6d/+sHuS6fKFWCRuYSAf5s2mfK3hYrPqHbosJI4/bv0HUf2OvVw==" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12805,6 +14133,86 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -12816,6 +14224,18 @@ "loose-envify": "cli.js" } }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -12840,6 +14260,12 @@ "yallist": "^3.0.2" } }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "optional": true + }, "node_modules/luxon": { "version": "1.28.1", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", @@ -12904,6 +14330,14 @@ "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", @@ -13023,6 +14457,25 @@ "map-or-similar": "^1.5.0" } }, + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -13221,6 +14674,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -13325,6 +14790,217 @@ "node": ">=10" } }, + "node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "peer": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", + "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", + "dependencies": { + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-junit-reporter/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/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==", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/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==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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==", + "peer": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/moddle": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", @@ -13406,6 +15082,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13459,6 +15143,12 @@ "resolved": "https://registry.npmjs.org/nano-assign/-/nano-assign-1.0.1.tgz", "integrity": "sha512-1K8ncUoAYFPYcCZqrB+K2XQaFCmA35rryJCtPkGrG3zYkwm+iIUZRIHyaAfuy6zxaK9siPdjeJq7+Inijm6xhw==" }, + "node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13493,6 +15183,23 @@ "tslib": "^2.0.3" } }, + "node_modules/node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/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/node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -13544,6 +15251,17 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-gyp-build": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", + "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -13667,6 +15385,25 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/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/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13784,12 +15521,12 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -13814,6 +15551,26 @@ "node": ">= 0.4" } }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", @@ -13893,6 +15650,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -14256,6 +16021,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -14323,6 +16096,14 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "engines": { + "node": ">=4" + } + }, "node_modules/polished": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", @@ -14384,6 +16165,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.33", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", @@ -15047,6 +16836,12 @@ "node": ">= 0.10" } }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -15155,6 +16950,14 @@ } ] }, + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ramda": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", @@ -15304,6 +17107,103 @@ } } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -15368,6 +17268,18 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -15428,14 +17340,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -15913,6 +17825,28 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -15933,15 +17867,17 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16117,6 +18053,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -16222,6 +18166,20 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -16301,6 +18259,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" + }, "node_modules/simple-uploader.js": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.5.6.tgz", @@ -16548,6 +18511,34 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -16732,29 +18723,47 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16787,7 +18796,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "engines": { "node": ">=4" } @@ -16800,11 +18808,18 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -16981,6 +18996,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "dependencies": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, "node_modules/svg-pan-zoom": { "version": "3.6.1", "resolved": "git+ssh://git@github.com/ariutta/svg-pan-zoom.git#632c04b408854926087266022aff7557a363e1ba", @@ -17461,14 +19486,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17555,6 +19572,15 @@ "resolved": "https://registry.npmjs.org/timezones.json/-/timezones.json-1.6.1.tgz", "integrity": "sha512-lAYx2w4qyN2nzJ7wNSxdaNEgWjvuBvN6/AzLdOAN0BsVAvKJVkOqApPvgOKYeESWe40Qrxc+KPVc9eQiy3iCZw==" }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -17676,6 +19702,14 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -17847,15 +19881,70 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17890,14 +19979,12 @@ "node_modules/un-eval": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/un-eval/-/un-eval-1.2.0.tgz", - "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==", - "dev": true + "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==" }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -17908,6 +19995,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -18219,6 +20311,15 @@ "vue-resize": "^1.0.1" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -18397,6 +20498,11 @@ "html2canvas": "^1.0.0-alpha.12" } }, + "node_modules/vue-inline-svg": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vue-inline-svg/-/vue-inline-svg-2.1.4.tgz", + "integrity": "sha512-Zt+pG+dRR8qMvLKc6YTPRs3l4YE8E+kZqDPOguKuLKhX7lRzQs3PKzV/cgWg06PUvcrqDNVgSt+md0XmYok7wA==" + }, "node_modules/vue-loader": { "version": "15.10.1", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", @@ -18448,6 +20554,16 @@ "npm": ">= 3.0.0" } }, + "node_modules/vue-popperjs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-popperjs/-/vue-popperjs-2.3.0.tgz", + "integrity": "sha512-925QEeNjlMtb3eDHl5ZlODJzqnQL0nQPEKpr9aQ3XBg21DyqAdfLgD/At4svsPwFeIkpdF1gvHarENon47L9Cg==", + "hasInstallScript": true, + "dependencies": { + "opencollective-postinstall": "^2.0.2", + "popper.js": "^1.15.0" + } + }, "node_modules/vue-resize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", @@ -18523,6 +20639,11 @@ "qinu": "^1.1.2" } }, + "node_modules/vue-upload-component": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/vue-upload-component/-/vue-upload-component-2.8.23.tgz", + "integrity": "sha512-diy7wOROLmfUj3zBYZ6HwqX7K4P0nmFKguhXTHA2pU2SrxTbUQc/eaOGnJJ6D75vexrvG8x7OPtSBLw9RUYbEQ==" + }, "node_modules/vuedraggable": { "version": "2.24.3", "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", @@ -19152,7 +21273,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -19170,16 +21290,15 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -19188,6 +21307,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -19207,6 +21373,12 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "peer": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -19327,6 +21499,11 @@ } } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" + }, "node_modules/xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", @@ -19362,6 +21539,80 @@ "node": ">=0.4" } }, + "node_modules/y-leveldb": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/y-leveldb/-/y-leveldb-0.1.2.tgz", + "integrity": "sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==", + "optional": true, + "dependencies": { + "level": "^6.0.1", + "lib0": "^0.2.31" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-protocols": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", + "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-websocket": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-1.5.4.tgz", + "integrity": "sha512-Y3021uy0anOIHqAPyAZbNDoR05JuMEGjRNI8c+K9MHzVS8dWoImdJUjccljAznc8H2L7WkIXhRHZ1igWNRSgPw==", + "dependencies": { + "lib0": "^0.2.52", + "lodash.debounce": "^4.0.8", + "y-protocols": "^1.0.5" + }, + "bin": { + "y-websocket": "bin/server.js", + "y-websocket-server": "bin/server.js" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "optionalDependencies": { + "ws": "^6.2.1", + "y-leveldb": "^0.1.0" + }, + "peerDependencies": { + "yjs": "^13.5.6" + } + }, + "node_modules/y-websocket/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "optional": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -19439,6 +21690,62 @@ "node": ">=8" } }, + "node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "peer": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -19512,6 +21819,22 @@ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, + "node_modules/yjs": { + "version": "13.6.19", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.19.tgz", + "integrity": "sha512-GNKw4mEUn5yWU2QPHRx8jppxmCm9KzbBhB4qJLUJFiiYD0g/tDVgXQ7aPkyh01YO28kbs2J/BEbWBagjuWyejw==", + "dependencies": { + "lib0": "^0.2.86" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -19872,6 +22195,15 @@ "@babel/plugin-transform-parameters": "^7.20.7" } }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -21418,12 +23750,124 @@ "deepmerge": "^2.0.0" } }, + "@philippfromme/moddle-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.1.0.tgz", + "integrity": "sha512-eKnrt2mCtcYFhweNr20mOWSG0431BPPFnhYJEQd+D2/5ssWPaHVEEgD3YnUOmbg1gdRQdVe2rrxcdEvvPugB/A==" + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "optional": true }, + "@processmaker/modeler": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.61.0.tgz", + "integrity": "sha512-1yamAAtPD7MObua14TW0QZ8oJutcS8veoiO/Xm1ojYuCNStJ5gUiXSqk5H9/XoMMjmTmVYz2+ZJ81Z3gStHPUg==", + "requires": { + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@fortawesome/fontawesome-free": "^5.11.2", + "@fortawesome/fontawesome-svg-core": "^1.2.25", + "@fortawesome/free-brands-svg-icons": "^6.4.2", + "@fortawesome/free-solid-svg-icons": "^5.11.2", + "@fortawesome/vue-fontawesome": "^0.1.8", + "@processmaker/screen-builder": "2.99.2", + "@processmaker/vue-form-elements": "0.60.0", + "@processmaker/vue-multiselect": "2.3.0", + "bootstrap": "^4.3.1", + "bootstrap-vue": "^2.0.4", + "bpmn-moddle": "^6.0.0", + "bpmnlint": "^6.4.0", + "bpmnlint-plugin-processmaker": "1.5.0", + "core-js": "^3.8.3", + "file-saver": "^2.0.5", + "jest-junit": "^12.0.0", + "jointjs": "^3.1.1", + "js-yaml-loader": "^1.2.2", + "lodash": "^4.17.21", + "lodash-contrib": "^4.1200.1", + "luxon": "^1.21.1", + "mocha-junit-reporter": "^2.0.0", + "mustache": "^3.2.1", + "popper.js": "^1.16.1", + "socket.io-client": "^4.7.2", + "svg-inline-loader": "^0.8.2", + "tinycolor2": "^1.4.2", + "vue": "^2.6.12", + "vue-deepset": "^0.6.3", + "vue-inline-svg": "^2.1.3", + "vue-monaco": "^1.2.1", + "vue-popperjs": "^2.3.0", + "vue-upload-component": "^2.8.20", + "vuex": "^3.5.1", + "y-websocket": "^1.5.0", + "yjs": "^13.6.7" + }, + "dependencies": { + "@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==" + }, + "@fortawesome/free-brands-svg-icons": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz", + "integrity": "sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.6.0" + } + }, + "engine.io-client": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", + "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==" + }, + "socket.io-client": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.0.tgz", + "integrity": "sha512-C0jdhD5yQahMws9alf/yvtsMGTaIDBnZ8Rb5HU56svyq0l5LIrGzIDZZD5pHQlmzxLuU91Gz+VpQMKgCTNYtkw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "requires": {} + }, + "xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==" + } + } + }, "@processmaker/processmaker-bpmn-moddle": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@processmaker/processmaker-bpmn-moddle/-/processmaker-bpmn-moddle-0.16.0.tgz", @@ -21433,9 +23877,9 @@ } }, "@processmaker/screen-builder": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-2.99.1.tgz", - "integrity": "sha512-t629KYIvUvoVwMtqQjKANEfwGHwG0YcAlHSL/jjAsz6K+kYWVj6NaISPtP1PcIepJJScpEkg7yxPxhflDiDvrQ==", + "version": "2.99.2", + "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-2.99.2.tgz", + "integrity": "sha512-nmWYDgsKNaNLhPUsurMnWJya6sMIBii6RGN6G+Lz7axf6xfdgdXhmxT4z+Ylhz4bqPFXH7t6BaQ/femc2oajPg==", "requires": { "@chantouchsek/validatorjs": "1.2.3", "@storybook/addon-docs": "^7.6.13", @@ -21477,9 +23921,9 @@ } }, "@processmaker/vue-form-elements": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@processmaker/vue-form-elements/-/vue-form-elements-0.59.0.tgz", - "integrity": "sha512-LHOehmt5DjM1uIfR+WO42T5MnWn8fOmoaFHZWawKvcAsHiXkKChvnU7u88sZEK+H1Ba+57exd0SDizxmiJPpKg==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@processmaker/vue-form-elements/-/vue-form-elements-0.60.0.tgz", + "integrity": "sha512-Rndk+TlCl3SXGx7VeZq0207fzA3ALNEjfapXazra1yI+AQFqPYAdSLrisckSvGYPTG0TFGGBhpzh+cHjOWlwug==", "requires": { "@chantouchsek/validatorjs": "1.2.3", "@tinymce/tinymce-vue": "2.0.0", @@ -21496,13 +23940,6 @@ "vue-date-pick": "^1.5.1", "vue-uniq-ids": "^1.0.0", "weekstart": "^1.0.0" - }, - "dependencies": { - "jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" - } } }, "@processmaker/vue-multiselect": { @@ -22078,6 +24515,11 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, + "@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, "@storybook/addon-docs": { "version": "7.6.20", "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.20.tgz", @@ -23320,6 +25762,19 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "optional": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -23449,6 +25904,11 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -23539,6 +25999,20 @@ "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -23586,11 +26060,45 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -23662,6 +26170,12 @@ "lodash": "^4.17.14" } }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "optional": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -23701,9 +26215,12 @@ } }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "aws-sign2": { "version": "0.7.0", @@ -23815,6 +26332,14 @@ "@babel/helper-define-polyfill-provider": "^0.3.3" } }, + "backbone": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.1.tgz", + "integrity": "sha512-ADy1ztN074YkWbHi8ojJVFe3vAanO/lrzMGZWUClIP7oDD/Pjy2vrASraUP+2EVCfIiTtCW4FChVow01XneivA==", + "requires": { + "underscore": ">=1.8.3" + } + }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -24006,6 +26531,360 @@ "moddle-xml": "^8.0.8" } }, + "bpmnlint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-6.5.0.tgz", + "integrity": "sha512-plF2kcTqcQ7gyusnR9gQhDd04Ld/rJ0b9k8HGa5Bg3m88w8hf6O2AJ5JHpITttncJzNNxFvNXzYmJVOhIgqB2g==", + "requires": { + "bpmn-moddle": "^6.0.0", + "bpmnlint-utils": "^1.0.1", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "meow": "^5.0.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.8" + } + }, + "bpmnlint-plugin-processmaker": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-processmaker/-/bpmnlint-plugin-processmaker-1.5.0.tgz", + "integrity": "sha512-iiVLQ1GBvl/EqADLsz7wqsEYJ2cohycMM0cwL3NKz+BJdsUoARFBzdKqE6hKmL+5Wn6si/hjsn8ec5oqvNWylQ==", + "requires": { + "bpmnlint": "^7.2.1", + "bpmnlint-utils": "^1.0.1", + "mocha": "^6.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "bpmn-moddle": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.3.tgz", + "integrity": "sha512-ZcBfw0NSOdYTSXFKEn7MOXHItz7VfLZTrFYKO8cK6V8ZzGjCcdiLIOiw7Lctw1PJsihhLiZQS8Htj2xKf+NwCg==", + "requires": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "moddle-xml": "^9.0.6" + } + }, + "bpmnlint": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-7.8.0.tgz", + "integrity": "sha512-hzmDB/yMzv90bRYkey6lvJ5fyqSCBPdIMRLBzWSvqpH/XvSasaRo3Gibp1oX3dJg1JyHeZw4EnJZdhP55CzGWQ==", + "requires": { + "@philippfromme/moddle-helpers": "^0.1.0", + "ansi-colors": "^4.1.1", + "bpmn-moddle": "^7.1.2", + "bpmnlint-utils": "^1.0.2", + "cli-table": "^0.3.9", + "color-support": "^1.1.3", + "min-dash": "^3.8.0", + "mri": "^1.2.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.9" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "requires": { + "is-buffer": "~2.0.3" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" + } + } + }, + "moddle-xml": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.6.tgz", + "integrity": "sha512-tl0reHpsY/aKlLGhXeFlQWlYAQHFxTkFqC8tq8jXRYpQSnLVw13T6swMaourLd7EXqHdWsc+5ggsB+fEep6xZQ==", + "requires": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "saxen": "^8.1.2" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "bpmnlint-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.1.1.tgz", + "integrity": "sha512-Afdb77FmwNB3INyUfbzXW40yY+mc0qYU3SgDFeI4zTtduiVomOlfqoXiEaUIGI8Hyh7aVYpmf3O97P2w7x0DYQ==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -24028,6 +26907,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -24126,6 +27010,16 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "optional": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -24279,6 +27173,21 @@ "tslib": "^2.0.3" } }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -24548,6 +27457,14 @@ "restore-cursor": "^3.1.0" } }, + "cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "requires": { + "colors": "1.0.3" + } + }, "cli-table3": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", @@ -24663,6 +27580,11 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==" + }, "colors-cli": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/colors-cli/-/colors-cli-1.0.33.tgz", @@ -25151,6 +28073,14 @@ "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "requires": { + "array-find-index": "^1.0.1" + } + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -25161,6 +28091,15 @@ "type": "^1.0.1" } }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -25169,6 +28108,36 @@ "assert-plus": "^1.0.0" } }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -25187,6 +28156,22 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" + } + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -25260,6 +28245,16 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, + "deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "optional": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + } + }, "define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -25359,6 +28354,12 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "peer": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -25570,6 +28571,18 @@ } } }, + "encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "optional": true, + "requires": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -25680,6 +28693,15 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -25689,46 +28711,63 @@ } }, "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, "es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -25747,15 +28786,22 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "requires": { + "es-errors": "^1.3.0" + } + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { @@ -25771,7 +28817,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -26484,6 +29529,11 @@ } } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "file-system-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", @@ -26597,6 +29647,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "peer": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -26712,22 +29768,20 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gauge": { "version": "4.0.4", @@ -26795,13 +29849,13 @@ } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "getpass": { @@ -26853,11 +29907,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "requires": { "define-properties": "^1.1.3" } }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -26871,6 +29929,11 @@ "slash": "^3.0.0" } }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -26908,6 +29971,19 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -26955,8 +30031,7 @@ "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-binary2": { "version": "1.0.3", @@ -26992,9 +30067,9 @@ } }, "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==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", @@ -27002,11 +30077,11 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "has-unicode": { @@ -27051,9 +30126,9 @@ } }, "hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -27073,6 +30148,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -27446,6 +30526,12 @@ "loader-utils": "^1.1.0" } }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "optional": true + }, "immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -27484,6 +30570,11 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==" + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -27574,13 +30665,12 @@ } }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -27656,14 +30746,12 @@ } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-arrayish": { @@ -27675,7 +30763,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -27692,7 +30779,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -27716,11 +30802,18 @@ "has": "^1.0.3" } }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "requires": { + "is-typed-array": "^1.1.13" + } + }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -27771,10 +30864,9 @@ } }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" }, "is-number": { "version": "7.0.0", @@ -27785,7 +30877,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -27800,6 +30891,11 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -27812,19 +30908,17 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-stream": { @@ -27836,7 +30930,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -27845,21 +30938,16 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" } }, "is-typedarray": { @@ -27867,11 +30955,16 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "peer": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -27899,6 +30992,11 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, + "isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -28031,6 +31129,32 @@ } } }, + "jest-junit": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.3.0.tgz", + "integrity": "sha512-+NmE5ogsEjFppEl90GChrk7xgz8xzvF0f+ZT5AnhW6suJC93gvQtmQjfyjDnE0Z2nXJqEkxF0WXlvjG/J+wn/g==", + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", @@ -28119,11 +31243,22 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==" }, + "jointjs": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/jointjs/-/jointjs-3.7.7.tgz", + "integrity": "sha512-gwjyLfXIxovVCIHrg57WG0cyPt6dsJjgnGEGOt8gh2F2kp/T1x6z7kBf62eQqSnM7qn1XiheZV4Iopzd2doHlw==", + "requires": { + "backbone": "~1.4.1", + "dagre": "~0.8.5", + "graphlib": "~2.1.8", + "jquery": "~3.7.1", + "lodash": "~4.17.21" + } + }, "jquery": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", - "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==", - "peer": true + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "js-sdsl": { "version": "4.3.0", @@ -28140,7 +31275,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -28149,7 +31283,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/js-yaml-loader/-/js-yaml-loader-1.2.2.tgz", "integrity": "sha512-H+NeuNrG6uOs/WMjna2SjkaCw13rMWiT/D7l9+9x5n8aq88BDsh2sRmdfxckWPIHtViYHWRG6XiCKYvS1dfyLg==", - "dev": true, "requires": { "js-yaml": "^3.13.1", "loader-utils": "^1.2.3", @@ -28160,7 +31293,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -28169,7 +31301,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -28192,6 +31323,11 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -28553,6 +31689,120 @@ } } }, + "level": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", + "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", + "optional": true, + "requires": { + "level-js": "^5.0.0", + "level-packager": "^5.1.0", + "leveldown": "^5.4.0" + } + }, + "level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "optional": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "optional": true + }, + "level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "optional": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "optional": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "level-js": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", + "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", + "optional": true, + "requires": { + "abstract-leveldown": "~6.2.3", + "buffer": "^5.5.0", + "inherits": "^2.0.3", + "ltgt": "^2.1.2" + } + }, + "level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "optional": true, + "requires": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + } + }, + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "optional": true, + "requires": { + "xtend": "^4.0.2" + } + }, + "leveldown": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", + "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", + "optional": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" + } + }, + "levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "optional": true, + "requires": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -28563,6 +31813,14 @@ "type-check": "~0.4.0" } }, + "lib0": { + "version": "0.2.98", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.98.tgz", + "integrity": "sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==", + "requires": { + "isomorphic.js": "^0.2.4" + } + }, "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -28573,6 +31831,28 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -28611,6 +31891,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-contrib": { + "version": "4.1200.1", + "resolved": "https://registry.npmjs.org/lodash-contrib/-/lodash-contrib-4.1200.1.tgz", + "integrity": "sha512-5QkRLyRLjc7J3BOqkqW5BkKXVUMhvlDZ5VqDSrGJnipIIY1KsW/vs3rrIzHg3XqBO6Hibc4o8JTLhdJIHr52Wg==", + "requires": { + "lodash": "4.12.x" + }, + "dependencies": { + "lodash": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", + "integrity": "sha512-H7Y9y0h/WibZBZyt9IOEEDaNJCzmpEoUQNB6d/+sHuS6fKFWCRuYSAf5s2mfK3hYrPqHbosJI4/bv0HUf2OvVw==" + } + } + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -28651,6 +31946,61 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "peer": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true + }, + "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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -28659,6 +32009,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -28680,6 +32039,12 @@ "yallist": "^3.0.2" } }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "optional": true + }, "luxon": { "version": "1.28.1", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", @@ -28731,6 +32096,11 @@ "tmpl": "1.0.5" } }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==" + }, "map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", @@ -28833,6 +32203,22 @@ "map-or-similar": "^1.5.0" } }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -28979,6 +32365,15 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, "minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -29058,6 +32453,160 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, + "mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "peer": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "peer": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "peer": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "peer": true, + "requires": { + "ms": "^2.1.3" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "peer": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "peer": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "peer": true + } + } + }, + "mocha-junit-reporter": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", + "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", + "requires": { + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + } + } + }, "moddle": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", @@ -29122,6 +32671,11 @@ "path-exists": "^4.0.0" } }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -29166,6 +32720,12 @@ "resolved": "https://registry.npmjs.org/nano-assign/-/nano-assign-1.0.1.tgz", "integrity": "sha512-1K8ncUoAYFPYcCZqrB+K2XQaFCmA35rryJCtPkGrG3zYkwm+iIUZRIHyaAfuy6zxaK9siPdjeJq7+Inijm6xhw==" }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -29197,6 +32757,22 @@ "tslib": "^2.0.3" } }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + } + } + }, "node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -29235,6 +32811,12 @@ } } }, + "node-gyp-build": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", + "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", + "optional": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -29336,6 +32918,24 @@ "abbrev": "^1.0.0" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -29413,12 +33013,12 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } @@ -29434,6 +33034,20 @@ "es-abstract": "^1.20.4" } }, + "object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "requires": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + } + }, "object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", @@ -29489,6 +33103,11 @@ "is-wsl": "^2.2.0" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -29759,6 +33378,11 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + }, "pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -29807,6 +33431,11 @@ } } }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, "polished": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", @@ -29854,6 +33483,11 @@ } } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postcss": { "version": "8.4.33", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", @@ -30245,6 +33879,12 @@ "ipaddr.js": "1.9.1" } }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -30328,6 +33968,11 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==" + }, "ramda": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", @@ -30422,6 +34067,80 @@ "tslib": "^2.0.0" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -30479,6 +34198,15 @@ "resolve": "^1.9.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -30530,14 +34258,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "regexpp": { @@ -30894,19 +34622,36 @@ } } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "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==" }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, @@ -31035,6 +34780,14 @@ } } }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -31124,6 +34877,17 @@ "has-property-descriptors": "^1.0.1" } }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -31185,6 +34949,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==" + }, "simple-uploader.js": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.5.6.tgz", @@ -31406,6 +35175,34 @@ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -31566,26 +35363,35 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -31607,19 +35413,22 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" }, "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==" }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==" + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { "version": "2.0.0", @@ -31734,6 +35543,16 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "requires": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, "svg-pan-zoom": { "version": "git+ssh://git@github.com/ariutta/svg-pan-zoom.git#632c04b408854926087266022aff7557a363e1ba", "from": "svg-pan-zoom@^3.6.1" @@ -32071,14 +35890,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "requires": { - "randombytes": "^2.1.0" - } } } }, @@ -32154,6 +35965,15 @@ "resolved": "https://registry.npmjs.org/timezones.json/-/timezones.json-1.6.1.tgz", "integrity": "sha512-lAYx2w4qyN2nzJ7wNSxdaNEgWjvuBvN6/AzLdOAN0BsVAvKJVkOqApPvgOKYeESWe40Qrxc+KPVc9eQiy3iCZw==" }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -32251,6 +36071,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==" + }, "ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -32386,15 +36211,52 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { @@ -32413,14 +36275,12 @@ "un-eval": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/un-eval/-/un-eval-1.2.0.tgz", - "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==", - "dev": true + "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==" }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -32428,6 +36288,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -32647,6 +36512,15 @@ "vue-resize": "^1.0.1" } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -32791,6 +36665,11 @@ "html2canvas": "^1.0.0-alpha.12" } }, + "vue-inline-svg": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vue-inline-svg/-/vue-inline-svg-2.1.4.tgz", + "integrity": "sha512-Zt+pG+dRR8qMvLKc6YTPRs3l4YE8E+kZqDPOguKuLKhX7lRzQs3PKzV/cgWg06PUvcrqDNVgSt+md0XmYok7wA==" + }, "vue-loader": { "version": "15.10.1", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", @@ -32828,6 +36707,15 @@ "zxcvbn": "^4.4.2" } }, + "vue-popperjs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-popperjs/-/vue-popperjs-2.3.0.tgz", + "integrity": "sha512-925QEeNjlMtb3eDHl5ZlODJzqnQL0nQPEKpr9aQ3XBg21DyqAdfLgD/At4svsPwFeIkpdF1gvHarENon47L9Cg==", + "requires": { + "opencollective-postinstall": "^2.0.2", + "popper.js": "^1.15.0" + } + }, "vue-resize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", @@ -32893,6 +36781,11 @@ "qinu": "^1.1.2" } }, + "vue-upload-component": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/vue-upload-component/-/vue-upload-component-2.8.23.tgz", + "integrity": "sha512-diy7wOROLmfUj3zBYZ6HwqX7K4P0nmFKguhXTHA2pU2SrxTbUQc/eaOGnJJ6D75vexrvG8x7OPtSBLw9RUYbEQ==" + }, "vuedraggable": { "version": "2.24.3", "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", @@ -33336,7 +37229,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -33351,16 +37243,52 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "wildcard": { @@ -33379,6 +37307,12 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "peer": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -33455,6 +37389,11 @@ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "requires": {} }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" + }, "xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", @@ -33478,6 +37417,47 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "y-leveldb": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/y-leveldb/-/y-leveldb-0.1.2.tgz", + "integrity": "sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==", + "optional": true, + "requires": { + "level": "^6.0.1", + "lib0": "^0.2.31" + } + }, + "y-protocols": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", + "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", + "requires": { + "lib0": "^0.2.85" + } + }, + "y-websocket": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-1.5.4.tgz", + "integrity": "sha512-Y3021uy0anOIHqAPyAZbNDoR05JuMEGjRNI8c+K9MHzVS8dWoImdJUjccljAznc8H2L7WkIXhRHZ1igWNRSgPw==", + "requires": { + "lib0": "^0.2.52", + "lodash.debounce": "^4.0.8", + "ws": "^6.2.1", + "y-leveldb": "^0.1.0", + "y-protocols": "^1.0.5" + }, + "dependencies": { + "ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -33582,11 +37562,59 @@ } } }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "peer": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "peer": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "peer": true + } + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" }, + "yjs": { + "version": "13.6.19", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.19.tgz", + "integrity": "sha512-GNKw4mEUn5yWU2QPHRx8jppxmCm9KzbBhB4qJLUJFiiYD0g/tDVgXQ7aPkyh01YO28kbs2J/BEbWBagjuWyejw==", + "requires": { + "lib0": "^0.2.86" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 9e92914283..7558d7a818 100644 --- a/package.json +++ b/package.json @@ -54,10 +54,10 @@ "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/vue-fontawesome": "^0.1.9", "@panter/vue-i18next": "^0.15.2", - "@processmaker/modeler": "1.60.1", + "@processmaker/modeler": "1.61.0", "@processmaker/processmaker-bpmn-moddle": "0.16.0", - "@processmaker/screen-builder": "2.99.1", - "@processmaker/vue-form-elements": "0.59.0", + "@processmaker/screen-builder": "2.99.2", + "@processmaker/vue-form-elements": "0.60.0", "@processmaker/vue-multiselect": "2.3.0", "@tinymce/tinymce-vue": "2.0.0", "autoprefixer": "10.4.5", From 7e30220a6d3a3660726cabb893e156b059baee33 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Sun, 29 Sep 2024 10:32:26 -0700 Subject: [PATCH 34/45] Update enterprise package --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f591ce30a8..8746b2eef8 100644 --- a/composer.json +++ b/composer.json @@ -173,7 +173,7 @@ "package-translations": "2.11.0", "package-versions": "1.12.0", "package-vocabularies": "2.16.0", - "package-webentry": "2.24.0", + "package-webentry": "2.25.0", "package-api-testing": "1.0.1", "packages": "^0" }, From 5d95bd9f2b051fde4eaf0fa61d4bdedb2cf61ce3 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Sun, 29 Sep 2024 10:33:14 -0700 Subject: [PATCH 35/45] Version 4.11.4-RC1 Build #d03c3e80 --- composer.json | 4 ++-- composer.lock | 2 +- package-lock.json | 16 ++++++++-------- package.json | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 8746b2eef8..ef5a5b9e57 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.11.3", + "version": "4.11.4-RC1", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -104,7 +104,7 @@ "Gmail" ], "processmaker": { - "build": "821f14eb", + "build": "d03c3e80", "custom": { "package-ellucian-ethos": "1.16.0", "package-plaid": "1.6.0", diff --git a/composer.lock b/composer.lock index 810e0e5350..9cd02293b7 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": "cfd04a0f3ee33c659f5333738092adeb", + "content-hash": "befb1ac9199c8eaabb8213e22a531c6b", "packages": [ { "name": "aws/aws-crt-php", diff --git a/package-lock.json b/package-lock.json index 46c9eace28..ea3df581d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.11.3", + "version": "4.11.4-RC1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.11.3", + "version": "4.11.4-RC1", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -12866,7 +12866,7 @@ "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" } }, @@ -13986,7 +13986,7 @@ "node": ">=16" }, "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" } }, @@ -21549,7 +21549,7 @@ "lib0": "^0.2.31" }, "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" }, "peerDependencies": { @@ -21568,7 +21568,7 @@ "npm": ">=8.0.0" }, "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" }, "peerDependencies": { @@ -21593,7 +21593,7 @@ "npm": ">=8.0.0" }, "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" }, "optionalDependencies": { @@ -21831,7 +21831,7 @@ "npm": ">=8.0.0" }, "funding": { - "type": "GitHub Sponsors ❤", + "type": "GitHub Sponsors \u2764", "url": "https://github.com/sponsors/dmonad" } }, diff --git a/package.json b/package.json index 7558d7a818..6200a77b8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.11.3", + "version": "4.11.4-RC1", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", From fd3e2022fe8c7a7eb689d71390f6cf393c1df5f9 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Mon, 30 Sep 2024 11:55:26 -0400 Subject: [PATCH 36/45] fix: add cr suggestions --- .../CaseParticipatedRepository.php | 14 ++++++++++- ProcessMaker/Repositories/CaseRepository.php | 11 ++++++--- tests/Feature/Cases/CaseStartedTest.php | 23 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 7f7085c8ef..1a22abebe2 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -9,6 +9,8 @@ class CaseParticipatedRepository { /** + * This property is used to store an instance of `CaseParticipated` + * when a case participated is updated. * @var CaseParticipated|null */ protected ?CaseParticipated $caseParticipated; @@ -27,7 +29,7 @@ public function create(CaseStarted $case, TokenInterface $token): void } try { - $this->caseParticipated = CaseParticipated::create([ + CaseParticipated::create([ 'user_id' => $token->user->id, 'case_number' => $case->case_number, 'case_title' => $case->case_title, @@ -92,6 +94,16 @@ public function updateStatus(int $caseNumber, array $statusData) } } + /** + * Check if a case participated exists. + * If it exists, store the instance in the property. + * The property is used to update the JSON fields of the case participated. + * + * @param int $userId + * @param int $caseNumber + * + * @return bool + */ private function checkIfCaseParticipatedExist(int $userId, int $caseNumber): bool { $this->caseParticipated = CaseParticipated::where('user_id', $userId) diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 27ed0ff6a5..7ef6ca49ec 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -10,7 +10,11 @@ class CaseRepository implements CaseRepositoryInterface { + const CASE_STATUS_ACTIVE = 'ACTIVE'; + /** + * This property is used to store an instance of `CaseStarted` + * when a case started is updated. * @var CaseStarted|null */ protected ?CaseStarted $case; @@ -39,12 +43,12 @@ public function create(ExecutionInstanceInterface $instance): void } try { - $this->case = CaseStarted::create([ + CaseStarted::create([ 'case_number' => $instance->case_number, 'user_id' => $instance->user_id, 'case_title' => $instance->case_title, 'case_title_formatted' => $instance->case_title_formatted, - 'case_status' => $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status, + 'case_status' => $instance->status === self::CASE_STATUS_ACTIVE ? 'IN_PROGRESS' : $instance->status, 'processes' => CaseUtils::storeProcesses($instance, collect()), 'requests' => CaseUtils::storeRequests($instance, collect()), 'request_tokens' => [], @@ -82,7 +86,7 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok } $this->case->case_title = $instance->case_title; - $this->case->case_status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; + $this->case->case_status = $instance->status === self::CASE_STATUS_ACTIVE ? 'IN_PROGRESS' : $instance->status; $this->case->request_tokens = CaseUtils::storeRequestTokens($token->getKey(), $this->case->request_tokens); $this->case->tasks = CaseUtils::storeTasks($token, $this->case->tasks); @@ -102,6 +106,7 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok */ public function updateStatus(ExecutionInstanceInterface $instance): void { + // If a sub-process is completed, do not update the case started status if (!is_null($instance->parent_request_id)) { return; } diff --git a/tests/Feature/Cases/CaseStartedTest.php b/tests/Feature/Cases/CaseStartedTest.php index ffbd3a12d6..2b597a5bee 100644 --- a/tests/Feature/Cases/CaseStartedTest.php +++ b/tests/Feature/Cases/CaseStartedTest.php @@ -395,4 +395,27 @@ public function test_update_case_started_status() 'tasks->[0]->process_id' => $token->process_id, ]); } + + public function test_try_update_if_case_has_not_been_created() + { + $user = User::factory()->create(); + $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); + $instance = ProcessRequest::factory()->create([ + 'user_id' => null, + ]); + + $repo = new CaseRepository($repoParticipant); + $repo->create($instance); + + $this->assertDatabaseCount('cases_started', 0); + + $token = ProcessRequestToken::factory()->create([ + 'user_id' => $user->id, + 'process_request_id' => $instance->id, + 'element_type' => 'task', + ]); + + $repo->update($instance, $token); + $this->assertDatabaseCount('cases_started', 0); + } } From da20d16fa859db2ca7ed0b58f7be447180e8a3f0 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Mon, 30 Sep 2024 12:40:37 -0700 Subject: [PATCH 37/45] Version 4.11.4 Build #73933446 --- composer.json | 4 ++-- composer.lock | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index ef5a5b9e57..115ce33539 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.11.4-RC1", + "version": "4.11.4", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -104,7 +104,7 @@ "Gmail" ], "processmaker": { - "build": "d03c3e80", + "build": "73933446", "custom": { "package-ellucian-ethos": "1.16.0", "package-plaid": "1.6.0", diff --git a/composer.lock b/composer.lock index 9cd02293b7..af5b9d6fbe 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": "befb1ac9199c8eaabb8213e22a531c6b", + "content-hash": "d5bab0bb27e1a1f1471eb3d776bb70c9", "packages": [ { "name": "aws/aws-crt-php", diff --git a/package-lock.json b/package-lock.json index ea3df581d6..900b948c54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.11.4-RC1", + "version": "4.11.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.11.4-RC1", + "version": "4.11.4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6200a77b8c..b112258ce9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.11.4-RC1", + "version": "4.11.4", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", From eaf113b33dce8ccf592a0f13401a79e649a41b39 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Mon, 30 Sep 2024 10:13:43 -0400 Subject: [PATCH 38/45] feat: add cases sync artisan command --- ProcessMaker/Console/Commands/CasesSync.php | 48 ++++++++++++++ ProcessMaker/Repositories/CaseRepository.php | 67 ++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 ProcessMaker/Console/Commands/CasesSync.php diff --git a/ProcessMaker/Console/Commands/CasesSync.php b/ProcessMaker/Console/Commands/CasesSync.php new file mode 100644 index 0000000000..960e41d6fa --- /dev/null +++ b/ProcessMaker/Console/Commands/CasesSync.php @@ -0,0 +1,48 @@ +option('request_ids'); + $requestIds = $requestIds ? explode(',', $requestIds) : []; + + if (count($requestIds) > 0) { + $data = CaseRepository::syncCases($requestIds); + + foreach ($data['successes'] as $value) { + $this->info('Case started synced ' . $value); + } + + foreach ($data['errors'] as $value) { + $this->error('Error syncing case started ' . $value); + } + } else { + $this->error('Please specify a list of request IDs.'); + } + } +} diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 7ef6ca49ec..c6820e58a3 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -4,7 +4,9 @@ use Carbon\Carbon; use ProcessMaker\Contracts\CaseRepositoryInterface; +use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; +use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; @@ -195,4 +197,69 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void \Log::error($th->getMessage()); } } + + public static function syncCases(array $requestIds): array + { + $requests = ProcessRequest::with(['tokens', 'parentRequest'])->whereIn('id', $requestIds)->get(); + $successes = []; + $errors = []; + + foreach ($requests as $instance) { + try { + $caseStarted = CaseStarted::updateOrCreate( + ['case_number' => $instance->case_number], + [ + 'user_id' => $instance->user_id, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status, + 'processes' => CaseUtils::storeProcesses($instance, collect()), + 'requests' => CaseUtils::storeRequests($instance, collect()), + 'request_tokens' => CaseUtils::storeRequestTokens($instance->tokens->first()->getKey(), collect()), + 'tasks' => CaseUtils::storeTasks($instance->tokens->first(), collect()), + 'participants' => $instance->participants, + 'initiated_at' => $instance->initiated_at, + 'completed_at' => $instance->completed_at, + ], + ); + + foreach ($instance->tokens as $token) { + if ($token->element_type === 'task') { + self::syncCasesParticipated($caseStarted, $token); + } + } + + $successes[] = $caseStarted->case_number; + } catch (\Exception $e) { + $errors[] = $instance->case_number . ' ' . $e->getMessage(); + } + } + + return [ + 'successes' => $successes, + 'errors' => $errors, + ]; + } + + public static function syncCasesParticipated($caseStarted, $token) + { + CaseParticipated::updateOrCreate( + [ + 'case_number' => $caseStarted->case_number, + 'user_id' => $token->user_id, + ], + [ + 'case_title' => $caseStarted->case_title, + 'case_title_formatted' => $caseStarted->case_title_formatted, + 'case_status' => $caseStarted->case_status, + 'processes' => CaseUtils::storeProcesses($token->processRequest, collect()), + 'requests' => CaseUtils::storeRequests($token->processRequest, collect()), + 'request_tokens' => CaseUtils::storeRequestTokens($token->getKey(), collect()), + 'tasks' => CaseUtils::storeTasks($token, collect()), + 'participants' => $caseStarted->participants, + 'initiated_at' => $caseStarted->initiated_at, + 'completed_at' => $caseStarted->completed_at, + ] + ); + } } From e6a3edc24143c70e93aab5968f5b23113e9b9204 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 27 Sep 2024 19:26:41 -0400 Subject: [PATCH 39/45] feat: add custom exception logs --- .../CaseParticipatedRepository.php | 9 +++++--- ProcessMaker/Repositories/CaseRepository.php | 22 +++++++++++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 1a22abebe2..5f6f31e567 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -44,7 +44,8 @@ public function create(CaseStarted $case, TokenInterface $token): void 'completed_at' => null, ]); } catch (\Exception $e) { - \Log::error($e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); } } @@ -73,7 +74,8 @@ public function update(CaseStarted $case, TokenInterface $token) 'participants' => $case->participants, ]); } catch (\Exception $e) { - \Log::error($e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); } } @@ -90,7 +92,8 @@ public function updateStatus(int $caseNumber, array $statusData) CaseParticipated::where('case_number', $caseNumber) ->update($statusData); } catch (\Exception $e) { - \Log::error($e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getMessage()); + \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); } } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index c6820e58a3..e333b9e6aa 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -33,7 +33,7 @@ public function __construct(protected CaseParticipatedRepository $caseParticipat public function create(ExecutionInstanceInterface $instance): void { if (is_null($instance->case_number)) { - \Log::error('Case number is required. instance: ' . $instance->getKey()); + \Log::error('CaseStartedError: case number is required, method=create, instance=' . $instance->getKey()); return; } @@ -60,8 +60,8 @@ public function create(ExecutionInstanceInterface $instance): void 'completed_at' => null, ]); } catch (\Exception $e) { - \Log::error($e->getMessage()); - \Log::error($e->getTraceAsString()); + \Log::error('CaseStartedException: ', $e->getMessage()); + \Log::error('CaseStartedException: ', $e->getTraceAsString()); } } @@ -75,14 +75,14 @@ public function create(ExecutionInstanceInterface $instance): void public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { if (is_null($instance->case_number)) { - \Log::error('Case number is required. instance: ' . $instance->getKey()); + \Log::error('CaseStartedError: case number is required, method=update, instance=' . $instance->getKey()); return; } try { if (!$this->checkIfCaseStartedExist($instance->case_number)) { - \Log::error('Case number not found. instance: ' . $instance->id); + \Log::error('CaseStartedError: case started not found, method=update, instance=' . $instance->getKey()); return; } @@ -96,7 +96,8 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok $this->case->saveOrFail(); } catch (\Exception $e) { - \Log::error($e->getMessage()); + \Log::error('CaseStartedException: ', $e->getMessage()); + \Log::error('CaseStartedException: ', $e->getTraceAsString()); } } @@ -126,7 +127,8 @@ public function updateStatus(ExecutionInstanceInterface $instance): void CaseStarted::where('case_number', $instance->case_number)->update($data); $this->caseParticipatedRepository->updateStatus($instance->case_number, $data); } catch (\Exception $e) { - \Log::error($e->getMessage()); + \Log::error('CaseStartedException: ', $e->getMessage()); + \Log::error('CaseStartedException: ', $e->getTraceAsString()); } } @@ -193,8 +195,10 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void $this->case->requests = CaseUtils::storeRequests($instance, $this->case->requests); $this->case->saveOrFail(); - } catch (\Exception $th) { - \Log::error($th->getMessage()); + } catch (\Exception $e) { + \Log::error('CaseStartedException: ', $e->getMessage()); + \Log::error('CaseStartedException: ', $e->getTraceAsString()); + } } From e92b52a3ec1547d499425ee5618febe4cdbc2d7f Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Tue, 1 Oct 2024 14:13:53 -0400 Subject: [PATCH 40/45] feat: add case sync repo --- ProcessMaker/Console/Commands/CasesSync.php | 5 +- ProcessMaker/Exception/CaseException.php | 16 ++ .../CaseParticipatedRepository.php | 10 +- ProcessMaker/Repositories/CaseRepository.php | 105 ++-------- .../Repositories/CaseSyncRepository.php | 190 ++++++++++++++++++ ProcessMaker/Repositories/CaseUtils.php | 2 + 6 files changed, 228 insertions(+), 100 deletions(-) create mode 100644 ProcessMaker/Exception/CaseException.php create mode 100644 ProcessMaker/Repositories/CaseSyncRepository.php diff --git a/ProcessMaker/Console/Commands/CasesSync.php b/ProcessMaker/Console/Commands/CasesSync.php index 960e41d6fa..e23d9ce0d4 100644 --- a/ProcessMaker/Console/Commands/CasesSync.php +++ b/ProcessMaker/Console/Commands/CasesSync.php @@ -3,8 +3,7 @@ namespace ProcessMaker\Console\Commands; use Illuminate\Console\Command; -use ProcessMaker\Repositories\CaseRepository; -use ProcessMaker\Repositories\CaseUtils; +use ProcessMaker\Repositories\CaseSyncRepository; class CasesSync extends Command { @@ -32,7 +31,7 @@ public function handle() $requestIds = $requestIds ? explode(',', $requestIds) : []; if (count($requestIds) > 0) { - $data = CaseRepository::syncCases($requestIds); + $data = CaseSyncRepository::syncCases($requestIds); foreach ($data['successes'] as $value) { $this->info('Case started synced ' . $value); diff --git a/ProcessMaker/Exception/CaseException.php b/ProcessMaker/Exception/CaseException.php new file mode 100644 index 0000000000..9a7966c346 --- /dev/null +++ b/ProcessMaker/Exception/CaseException.php @@ -0,0 +1,16 @@ +getTraceAsString()); + } +} diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 5f6f31e567..1e2e108c45 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -2,6 +2,7 @@ namespace ProcessMaker\Repositories; +use ProcessMaker\Exception\CaseException; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; @@ -44,8 +45,7 @@ public function create(CaseStarted $case, TokenInterface $token): void 'completed_at' => null, ]); } catch (\Exception $e) { - \Log::error('CaseParticipatedException: ', $e->getMessage()); - \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } @@ -74,8 +74,7 @@ public function update(CaseStarted $case, TokenInterface $token) 'participants' => $case->participants, ]); } catch (\Exception $e) { - \Log::error('CaseParticipatedException: ', $e->getMessage()); - \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } @@ -92,8 +91,7 @@ public function updateStatus(int $caseNumber, array $statusData) CaseParticipated::where('case_number', $caseNumber) ->update($statusData); } catch (\Exception $e) { - \Log::error('CaseParticipatedException: ', $e->getMessage()); - \Log::error('CaseParticipatedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index e333b9e6aa..14c508c4b7 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -4,9 +4,8 @@ use Carbon\Carbon; use ProcessMaker\Contracts\CaseRepositoryInterface; -use ProcessMaker\Models\CaseParticipated; +use ProcessMaker\Exception\CaseException; use ProcessMaker\Models\CaseStarted; -use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; @@ -33,9 +32,7 @@ public function __construct(protected CaseParticipatedRepository $caseParticipat public function create(ExecutionInstanceInterface $instance): void { if (is_null($instance->case_number)) { - \Log::error('CaseStartedError: case number is required, method=create, instance=' . $instance->getKey()); - - return; + throw new CaseException('case number is required, method=create, instance=' . $instance->getKey()); } if ($this->checkIfCaseStartedExist($instance->case_number)) { @@ -60,8 +57,7 @@ public function create(ExecutionInstanceInterface $instance): void 'completed_at' => null, ]); } catch (\Exception $e) { - \Log::error('CaseStartedException: ', $e->getMessage()); - \Log::error('CaseStartedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } @@ -74,19 +70,11 @@ public function create(ExecutionInstanceInterface $instance): void */ public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { - if (is_null($instance->case_number)) { - \Log::error('CaseStartedError: case number is required, method=update, instance=' . $instance->getKey()); - - return; + if (!$this->checkIfCaseStartedExist($instance->case_number)) { + throw new CaseException('case started not found, method=update, instance=' . $instance->getKey()); } try { - if (!$this->checkIfCaseStartedExist($instance->case_number)) { - \Log::error('CaseStartedError: case started not found, method=update, instance=' . $instance->getKey()); - - return; - } - $this->case->case_title = $instance->case_title; $this->case->case_status = $instance->status === self::CASE_STATUS_ACTIVE ? 'IN_PROGRESS' : $instance->status; $this->case->request_tokens = CaseUtils::storeRequestTokens($token->getKey(), $this->case->request_tokens); @@ -96,8 +84,7 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok $this->case->saveOrFail(); } catch (\Exception $e) { - \Log::error('CaseStartedException: ', $e->getMessage()); - \Log::error('CaseStartedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } @@ -127,8 +114,7 @@ public function updateStatus(ExecutionInstanceInterface $instance): void CaseStarted::where('case_number', $instance->case_number)->update($data); $this->caseParticipatedRepository->updateStatus($instance->case_number, $data); } catch (\Exception $e) { - \Log::error('CaseStartedException: ', $e->getMessage()); - \Log::error('CaseStartedException: ', $e->getTraceAsString()); + throw new CaseException($e->getMessage()); } } @@ -167,11 +153,15 @@ private function updateParticipants(TokenInterface $token): void /** * Check if the case started exist. * - * @param int $caseNumber + * @param int|null $caseNumber * @return bool */ - private function checkIfCaseStartedExist(int $caseNumber): bool + private function checkIfCaseStartedExist(int | null $caseNumber): bool { + if (is_null($caseNumber)) { + return false; + } + $this->case = CaseStarted::where('case_number', $caseNumber)->first(); return !is_null($this->case); @@ -196,74 +186,7 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void $this->case->saveOrFail(); } catch (\Exception $e) { - \Log::error('CaseStartedException: ', $e->getMessage()); - \Log::error('CaseStartedException: ', $e->getTraceAsString()); - + throw new CaseException($e->getMessage()); } } - - public static function syncCases(array $requestIds): array - { - $requests = ProcessRequest::with(['tokens', 'parentRequest'])->whereIn('id', $requestIds)->get(); - $successes = []; - $errors = []; - - foreach ($requests as $instance) { - try { - $caseStarted = CaseStarted::updateOrCreate( - ['case_number' => $instance->case_number], - [ - 'user_id' => $instance->user_id, - 'case_title' => $instance->case_title, - 'case_title_formatted' => $instance->case_title_formatted, - 'case_status' => $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status, - 'processes' => CaseUtils::storeProcesses($instance, collect()), - 'requests' => CaseUtils::storeRequests($instance, collect()), - 'request_tokens' => CaseUtils::storeRequestTokens($instance->tokens->first()->getKey(), collect()), - 'tasks' => CaseUtils::storeTasks($instance->tokens->first(), collect()), - 'participants' => $instance->participants, - 'initiated_at' => $instance->initiated_at, - 'completed_at' => $instance->completed_at, - ], - ); - - foreach ($instance->tokens as $token) { - if ($token->element_type === 'task') { - self::syncCasesParticipated($caseStarted, $token); - } - } - - $successes[] = $caseStarted->case_number; - } catch (\Exception $e) { - $errors[] = $instance->case_number . ' ' . $e->getMessage(); - } - } - - return [ - 'successes' => $successes, - 'errors' => $errors, - ]; - } - - public static function syncCasesParticipated($caseStarted, $token) - { - CaseParticipated::updateOrCreate( - [ - 'case_number' => $caseStarted->case_number, - 'user_id' => $token->user_id, - ], - [ - 'case_title' => $caseStarted->case_title, - 'case_title_formatted' => $caseStarted->case_title_formatted, - 'case_status' => $caseStarted->case_status, - 'processes' => CaseUtils::storeProcesses($token->processRequest, collect()), - 'requests' => CaseUtils::storeRequests($token->processRequest, collect()), - 'request_tokens' => CaseUtils::storeRequestTokens($token->getKey(), collect()), - 'tasks' => CaseUtils::storeTasks($token, collect()), - 'participants' => $caseStarted->participants, - 'initiated_at' => $caseStarted->initiated_at, - 'completed_at' => $caseStarted->completed_at, - ] - ); - } } diff --git a/ProcessMaker/Repositories/CaseSyncRepository.php b/ProcessMaker/Repositories/CaseSyncRepository.php new file mode 100644 index 0000000000..2d270d1974 --- /dev/null +++ b/ProcessMaker/Repositories/CaseSyncRepository.php @@ -0,0 +1,190 @@ +whereIn('id', $requestIds) + ->get(); + + $successes = []; + $errors = []; + + foreach ($requests as $instance) { + try { + if (!is_null($instance->parent_request_id)) { + continue; + } + + $csProcesses = CaseUtils::storeProcesses($instance, collect()); + $csRequests = CaseUtils::storeRequests($instance, collect()); + $csRequestTokens = collect(); + $csTasks = collect(); + $participants = $instance->participants->map->only('id', 'fullName', 'title', 'avatar'); + $status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; + + $cpData = self::prepareCaseStartedData($instance, $status, $participants); + + self::processTokens($instance, $cpData, $csRequestTokens, $csTasks); + + self::processChildRequests($instance, $cpData, $csProcesses, $csRequests, $participants, $csRequestTokens, $csTasks); + + $caseStarted = CaseStarted::updateOrCreate( + ['case_number' => $instance->case_number], + [ + 'user_id' => $instance->user_id, + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => $status, + 'processes' => $csProcesses, + 'requests' => $csRequests, + 'request_tokens' => $csRequestTokens, + 'tasks' => $csTasks, + 'participants' => $participants, + 'initiated_at' => $instance->initiated_at, + 'completed_at' => $instance->completed_at, + ], + ); + + $successes[] = $caseStarted->case_number; + } catch (\Exception $e) { + $errors[] = $instance->case_number . ' ' . $e->getMessage(); + } + } + + return [ + 'successes' => $successes, + 'errors' => $errors, + ]; + } + + /** + * Prepare the case started data. + * + * @param ProcessRequest $instance + * @param string $status + * @param Collection $participants + * @return array + */ + private static function prepareCaseStartedData($instance, $status, $participants) + { + return [ + 'case_title' => $instance->case_title, + 'case_title_formatted' => $instance->case_title_formatted, + 'case_status' => $status, + 'processes' => CaseUtils::storeProcesses($instance, collect()), + 'requests' => CaseUtils::storeRequests($instance, collect()), + 'request_tokens' => collect(), + 'tasks' => collect(), + 'participants' => $participants, + 'initiated_at' => $instance->initiated_at, + 'completed_at' => $instance->completed_at, + ]; + } + + /** + * Process the tokens. + * + * @param ProcessRequest $instance + * @param array $cpData + * @param Collection $csRequestTokens + * @param Collection $csTasks + * @return void + */ + private static function processTokens($instance, &$cpData, &$csRequestTokens, &$csTasks) + { + foreach ($instance->tokens as $token) { + if (in_array($token->element_type, CaseUtils::ALLOWED_REQUEST_TOKENS)) { + $cpData['processes'] = CaseUtils::storeProcesses($instance, $cpData['processes']); + $cpData['requests'] = CaseUtils::storeRequests($instance, $cpData['requests']); + $cpData['request_tokens'] = CaseUtils::storeRequestTokens($token->getKey(), $cpData['request_tokens']); + $cpData['tasks'] = CaseUtils::storeTasks($token, $cpData['tasks']); + + $csRequestTokens = CaseUtils::storeRequestTokens($token->getKey(), $csRequestTokens); + $csTasks = CaseUtils::storeTasks($token, $csTasks); + + self::syncCasesParticipated($instance->case_number, $token->user_id, $cpData); + } + } + } + + /** + * Process the child requests. + * + * @param ProcessRequest $instance + * @param array $cpData + * @param Collection $csProcesses + * @param Collection $csRequests + * @param Collection $participants + * @param Collection $csRequestTokens + * @param Collection $csTasks + * @return void + */ + private static function processChildRequests( + $instance, &$cpData, &$csProcesses, &$csRequests, &$participants, &$csRequestTokens, &$csTasks + ) + { + foreach ($instance->childRequests as $subProcess) { + $cpData['processes'] = CaseUtils::storeProcesses($subProcess, collect()); + $cpData['requests'] = CaseUtils::storeRequests($subProcess, collect()); + $cpData['request_tokens'] = collect(); + $cpData['tasks'] = collect(); + + $csProcesses = CaseUtils::storeProcesses($subProcess, $csProcesses); + $csRequests = CaseUtils::storeRequests($subProcess, $csRequests); + + $participants = $participants + ->merge($subProcess->participants->map->only('id', 'fullName', 'title', 'avatar')) + ->unique('id') + ->values(); + + foreach ($subProcess->tokens as $spToken) { + if (in_array($spToken->element_type, CaseUtils::ALLOWED_REQUEST_TOKENS)) { + $cpData['processes'] = CaseUtils::storeProcesses($subProcess, $cpData['processes']); + $cpData['requests'] = CaseUtils::storeRequests($subProcess, $cpData['requests']); + $cpData['request_tokens'] = CaseUtils::storeRequestTokens($spToken->getKey(), $cpData['request_tokens']); + $cpData['tasks'] = CaseUtils::storeTasks($spToken, $cpData['tasks']); + + $csRequestTokens = CaseUtils::storeRequestTokens($spToken->getKey(), $csRequestTokens); + $csTasks = CaseUtils::storeTasks($spToken, $csTasks); + + self::syncCasesParticipated($instance->case_number, $spToken->user_id, $cpData); + } + } + } + } + + /** + * Sync the cases participated. + * + * @param CaseStarted $caseStarted + * @param TokenInterface $token + * @return void + */ + private static function syncCasesParticipated($caseNumber, $userId, $data) + { + CaseParticipated::updateOrCreate( + [ + 'case_number' => $caseNumber, + 'user_id' => $userId, + ], + $data, + ); + } +} diff --git a/ProcessMaker/Repositories/CaseUtils.php b/ProcessMaker/Repositories/CaseUtils.php index 2d93e1d098..527de49434 100644 --- a/ProcessMaker/Repositories/CaseUtils.php +++ b/ProcessMaker/Repositories/CaseUtils.php @@ -10,6 +10,8 @@ class CaseUtils { const ALLOWED_ELEMENT_TYPES = ['task']; + const ALLOWED_REQUEST_TOKENS = ['task', 'scriptTask', 'callActivity']; + /** * Store processes. * From 6df43f6149e09ddc430516c36952cf21dc620cda Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Tue, 1 Oct 2024 14:42:01 -0400 Subject: [PATCH 41/45] case repository refactor --- ProcessMaker/Repositories/CaseRepository.php | 7 ++- tests/Feature/Cases/CaseParticipatedTest.php | 16 ++---- .../Cases/CaseStartedSubProcessTest.php | 51 ++++++------------- tests/Feature/Cases/CaseStartedTest.php | 31 ++++------- 4 files changed, 36 insertions(+), 69 deletions(-) diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index 14c508c4b7..ecfa3c038a 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -13,6 +13,10 @@ class CaseRepository implements CaseRepositoryInterface { const CASE_STATUS_ACTIVE = 'ACTIVE'; + /** + * @var CaseParticipatedRepository + */ + protected CaseParticipatedRepository $caseParticipatedRepository; /** * This property is used to store an instance of `CaseStarted` * when a case started is updated. @@ -20,8 +24,9 @@ class CaseRepository implements CaseRepositoryInterface */ protected ?CaseStarted $case; - public function __construct(protected CaseParticipatedRepository $caseParticipatedRepository) + public function __construct() { + $this->caseParticipatedRepository = new CaseParticipatedRepository(); } /** * Store a new case started. diff --git a/tests/Feature/Cases/CaseParticipatedTest.php b/tests/Feature/Cases/CaseParticipatedTest.php index a0b6795116..01c3d21c49 100644 --- a/tests/Feature/Cases/CaseParticipatedTest.php +++ b/tests/Feature/Cases/CaseParticipatedTest.php @@ -6,7 +6,6 @@ use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\User; -use ProcessMaker\Repositories\CaseParticipatedRepository; use ProcessMaker\Repositories\CaseRepository; use Tests\TestCase; @@ -21,8 +20,7 @@ public function test_create_case_participated() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseHas('cases_started', [ @@ -72,8 +70,7 @@ public function test_create_multiple_case_participated() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseHas('cases_started', [ @@ -144,8 +141,7 @@ public function test_update_case_participated_users() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseHas('cases_started', [ @@ -211,8 +207,7 @@ public function test_update_case_participated_user_tasks() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -290,8 +285,7 @@ public function test_update_case_participated_completed() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); diff --git a/tests/Feature/Cases/CaseStartedSubProcessTest.php b/tests/Feature/Cases/CaseStartedSubProcessTest.php index db4204931c..619c0e77f2 100644 --- a/tests/Feature/Cases/CaseStartedSubProcessTest.php +++ b/tests/Feature/Cases/CaseStartedSubProcessTest.php @@ -9,7 +9,6 @@ use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\User; -use ProcessMaker\Repositories\CaseParticipatedRepository; use ProcessMaker\Repositories\CaseRepository; class CaseStartedSubProcessTest extends TestCase @@ -73,12 +72,10 @@ protected function setUp(): void public function test_create_case_sub_process() { - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->childRequest); $this->assertDatabaseCount('cases_started', 1); @@ -92,12 +89,10 @@ public function test_create_case_sub_process() public function test_create_case_processes() { - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->childRequest); $this->assertDatabaseCount('cases_started', 1); @@ -115,12 +110,10 @@ public function test_create_case_processes() public function test_create_case_requests() { - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->childRequest); $this->assertDatabaseCount('cases_started', 1); @@ -140,12 +133,10 @@ public function test_create_case_requests() public function test_create_case_request_tokens() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->childRequest); $repo->update($this->parentRequest, $this->parentToken); $repo->update($this->childRequest, $this->childToken); @@ -163,12 +154,10 @@ public function test_create_case_request_tokens() public function test_create_case_tasks() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->childRequest); $repo->update($this->parentRequest, $this->parentToken); $repo->update($this->childRequest, $this->childToken); @@ -192,9 +181,7 @@ public function test_create_case_tasks() public function test_create_case_participated_processes() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); $repo->create($this->childRequest); @@ -227,9 +214,7 @@ public function test_create_case_participated_processes() public function test_create_case_participated_requests() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); $repo->create($this->childRequest); @@ -265,9 +250,7 @@ public function test_create_case_participated_requests() public function test_create_case_participated_request_tokens() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); $repo->create($this->childRequest); @@ -297,9 +280,7 @@ public function test_create_case_participated_request_tokens() public function test_create_case_participated_tasks() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); $repo->create($this->childRequest); @@ -342,9 +323,7 @@ public function test_create_case_participated_tasks() public function test_update_case_participated_completed() { - $repoParticipant = new CaseParticipatedRepository(); - - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($this->parentRequest); $repo->create($this->childRequest); diff --git a/tests/Feature/Cases/CaseStartedTest.php b/tests/Feature/Cases/CaseStartedTest.php index 2b597a5bee..d63cea61ee 100644 --- a/tests/Feature/Cases/CaseStartedTest.php +++ b/tests/Feature/Cases/CaseStartedTest.php @@ -9,7 +9,6 @@ use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\User; -use ProcessMaker\Repositories\CaseParticipatedRepository; use ProcessMaker\Repositories\CaseRepository; class CaseStartedTest extends TestCase @@ -19,12 +18,11 @@ class CaseStartedTest extends TestCase public function test_create_case() { $user = User::factory()->create(); - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); $instance = ProcessRequest::factory()->create([ 'user_id' => $user->id, ]); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -39,7 +37,6 @@ public function test_create_case() public function test_create_multiple_cases() { $user = User::factory()->create(); - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); $instance1 = ProcessRequest::factory()->create([ 'user_id' => $user->id, ]); @@ -47,7 +44,7 @@ public function test_create_multiple_cases() 'user_id' => $user->id, ]); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance1); $repo->create($instance2); @@ -71,14 +68,13 @@ public function test_create_case_started_processes() $process = Process::factory()->create(); $user = User::factory()->create(); - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); $instance = ProcessRequest::factory()->create([ 'user_id' => $user->id, 'process_id' => $process->id, ]); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -97,14 +93,13 @@ public function test_create_case_started_requests() $process = Process::factory()->create(); $user = User::factory()->create(); - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); $instance = ProcessRequest::factory()->create([ 'user_id' => $user->id, 'process_id' => $process->id, ]); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -130,9 +125,8 @@ public function test_update_case_started_request_tokens() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -170,9 +164,8 @@ public function test_update_case_started_tasks() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -232,9 +225,8 @@ public function test_update_case_started_script_tasks() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -293,9 +285,8 @@ public function test_update_case_started_participants() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -352,9 +343,8 @@ public function test_update_case_started_status() 'process_id' => $process->id, ]); - $repoParticipant = new CaseParticipatedRepository(); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 1); @@ -399,12 +389,11 @@ public function test_update_case_started_status() public function test_try_update_if_case_has_not_been_created() { $user = User::factory()->create(); - $repoParticipant = Mockery::mock(CaseParticipatedRepository::class); $instance = ProcessRequest::factory()->create([ 'user_id' => null, ]); - $repo = new CaseRepository($repoParticipant); + $repo = new CaseRepository(); $repo->create($instance); $this->assertDatabaseCount('cases_started', 0); From c9572a6d2f4cc232f858d6ec44cbe53c3fe78ae1 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Tue, 1 Oct 2024 16:02:33 -0400 Subject: [PATCH 42/45] test: case exception tests --- ProcessMaker/Exception/CaseException.php | 3 +- .../CaseParticipatedRepository.php | 16 ++- ProcessMaker/Repositories/CaseRepository.php | 27 ++-- tests/Feature/Cases/CaseExceptionTest.php | 135 ++++++++++++++++++ 4 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 tests/Feature/Cases/CaseExceptionTest.php diff --git a/ProcessMaker/Exception/CaseException.php b/ProcessMaker/Exception/CaseException.php index 9a7966c346..4eb688de16 100644 --- a/ProcessMaker/Exception/CaseException.php +++ b/ProcessMaker/Exception/CaseException.php @@ -9,8 +9,7 @@ class CaseException extends Exception { public function __construct($message = "", $code = 0, Exception $previous = null) { - parent::__construct($message, $code, $previous); Log::error('CaseException: ' . $message); - Log::error('CaseException: ' . $this->getTraceAsString()); + parent::__construct($message, $code, $previous); } } diff --git a/ProcessMaker/Repositories/CaseParticipatedRepository.php b/ProcessMaker/Repositories/CaseParticipatedRepository.php index 1e2e108c45..d46ca53075 100644 --- a/ProcessMaker/Repositories/CaseParticipatedRepository.php +++ b/ProcessMaker/Repositories/CaseParticipatedRepository.php @@ -2,6 +2,7 @@ namespace ProcessMaker\Repositories; +use Illuminate\Support\Facades\Log; use ProcessMaker\Exception\CaseException; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; @@ -44,8 +45,9 @@ public function create(CaseStarted $case, TokenInterface $token): void 'initiated_at' => $case->initiated_at, 'completed_at' => null, ]); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } @@ -73,8 +75,9 @@ public function update(CaseStarted $case, TokenInterface $token) 'tasks' => CaseUtils::storeTasks($token, $this->caseParticipated->tasks), 'participants' => $case->participants, ]); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } @@ -90,8 +93,9 @@ public function updateStatus(int $caseNumber, array $statusData) try { CaseParticipated::where('case_number', $caseNumber) ->update($statusData); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index ecfa3c038a..d985d54117 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Repositories; use Carbon\Carbon; +use Illuminate\Support\Facades\Log; use ProcessMaker\Contracts\CaseRepositoryInterface; use ProcessMaker\Exception\CaseException; use ProcessMaker\Models\CaseStarted; @@ -37,7 +38,8 @@ public function __construct() public function create(ExecutionInstanceInterface $instance): void { if (is_null($instance->case_number)) { - throw new CaseException('case number is required, method=create, instance=' . $instance->getKey()); + Log::error('case number is required, method=create, instance=' . $instance->getKey()); + return; } if ($this->checkIfCaseStartedExist($instance->case_number)) { @@ -61,8 +63,9 @@ public function create(ExecutionInstanceInterface $instance): void 'initiated_at' => $instance->initiated_at, 'completed_at' => null, ]); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } @@ -76,7 +79,8 @@ public function create(ExecutionInstanceInterface $instance): void public function update(ExecutionInstanceInterface $instance, TokenInterface $token): void { if (!$this->checkIfCaseStartedExist($instance->case_number)) { - throw new CaseException('case started not found, method=update, instance=' . $instance->getKey()); + Log::error('case started not found, method=update, instance=' . $instance->getKey()); + return; } try { @@ -88,8 +92,9 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok $this->updateParticipants($token); $this->case->saveOrFail(); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } @@ -118,8 +123,9 @@ public function updateStatus(ExecutionInstanceInterface $instance): void // Update the case started and case participated CaseStarted::where('case_number', $instance->case_number)->update($data); $this->caseParticipatedRepository->updateStatus($instance->case_number, $data); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } @@ -190,8 +196,9 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void $this->case->requests = CaseUtils::storeRequests($instance, $this->case->requests); $this->case->saveOrFail(); - } catch (\Exception $e) { - throw new CaseException($e->getMessage()); + } catch (CaseException $e) { + Log::error('CaseException: ' . $e->getMessage()); + Log::error('CaseException: ' . $e->getTraceAsString()); } } } diff --git a/tests/Feature/Cases/CaseExceptionTest.php b/tests/Feature/Cases/CaseExceptionTest.php new file mode 100644 index 0000000000..0930d1720f --- /dev/null +++ b/tests/Feature/Cases/CaseExceptionTest.php @@ -0,0 +1,135 @@ +user = User::factory()->create(); + $this->process = Process::factory()->create(); + + $this->instance = ProcessRequest::factory()->create([ + 'user_id' => $this->user->id, + 'process_id' => $this->process->id, + ]); + $this->token = ProcessRequestToken::factory()->create([ + 'user_id' => $this->user->id, + 'process_request_id' => $this->instance->id, + 'element_type' => 'task', + ]); + + $this->instance2 = ProcessRequest::factory()->create([ + 'user_id' => $this->user->id, + 'process_id' => $this->process->id, + ]); + $this->token2 = ProcessRequestToken::factory()->create([ + 'user_id' => $this->user->id, + 'process_request_id' => $this->instance2->id, + 'element_type' => 'task', + ]); + } + + public function test_create_case_missing_case_number(): void + { + $this->withoutExceptionHandling(); + + $this->instance->case_number = null; + $repo = new CaseRepository(); + $repo->create($this->instance); + + $this->assertDatabaseCount('cases_started', 0); + } + + public function test_create_case_missing_user_id(): void + { + $this->withoutExceptionHandling(); + + try { + $this->instance->user_id = null; + $repo = new CaseRepository(); + $repo->create($this->instance); + } catch (\Exception $e) { + $this->assertStringContainsString('Column \'user_id\' cannot be null', $e->getMessage()); + } + + $this->assertDatabaseCount('cases_started', 0); + } + + public function test_create_case_missing_case_title(): void + { + $this->withoutExceptionHandling(); + + try { + $this->instance->case_title = null; + $repo = new CaseRepository(); + $repo->create($this->instance); + } catch (\Exception $e) { + $this->assertStringContainsString('Column \'case_title\' cannot be null', $e->getMessage()); + } + + $this->assertDatabaseCount('cases_started', 0); + } + + public function test_update_case_missing_case_started(): void + { + $this->withoutExceptionHandling(); + + try { + $this->instance->case_title = null; + $repo = new CaseRepository(); + $repo->create($this->instance); + } catch (\Exception $e) { + $this->assertStringContainsString('Column \'case_title\' cannot be null', $e->getMessage()); + } + + $this->assertDatabaseCount('cases_started', 0); + + try { + $repo->update($this->instance, $this->token); + } catch (\Exception $e) { + $this->assertEquals( + 'case started not found, method=update, instance=' . $this->instance->getKey(), $e->getMessage() + ); + } + } + + public function test_artisan_sync_command_missing_ids(): void + { + $this->artisan('cases:sync') + ->expectsOutput('Please specify a list of request IDs.') + ->assertExitCode(0); + } + + public function test_artisan_sync_command_success(): void + { + $this->artisan('cases:sync --request_ids=1,2') + ->expectsOutput('Case started synced 1') + ->expectsOutput('Case started synced 2') + ->assertExitCode(0); + + $this->assertDatabaseCount('cases_started', 2); + } +} From 7055d40c21bba26bbabfdcbd6df42726183ee6bf Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Tue, 1 Oct 2024 22:52:12 -0400 Subject: [PATCH 43/45] fix: case exception handling and logging --- ProcessMaker/Exception/CaseException.php | 15 --------------- .../Repositories/CaseParticipatedRepository.php | 7 +++---- ProcessMaker/Repositories/CaseRepository.php | 9 ++++----- tests/Feature/Cases/CaseExceptionTest.php | 7 +++---- 4 files changed, 10 insertions(+), 28 deletions(-) delete mode 100644 ProcessMaker/Exception/CaseException.php diff --git a/ProcessMaker/Exception/CaseException.php b/ProcessMaker/Exception/CaseException.php deleted file mode 100644 index 4eb688de16..0000000000 --- a/ProcessMaker/Exception/CaseException.php +++ /dev/null @@ -1,15 +0,0 @@ - $case->initiated_at, 'completed_at' => null, ]); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } @@ -75,7 +74,7 @@ public function update(CaseStarted $case, TokenInterface $token) 'tasks' => CaseUtils::storeTasks($token, $this->caseParticipated->tasks), 'participants' => $case->participants, ]); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } @@ -93,7 +92,7 @@ public function updateStatus(int $caseNumber, array $statusData) try { CaseParticipated::where('case_number', $caseNumber) ->update($statusData); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } diff --git a/ProcessMaker/Repositories/CaseRepository.php b/ProcessMaker/Repositories/CaseRepository.php index d985d54117..f1b72d3b8d 100644 --- a/ProcessMaker/Repositories/CaseRepository.php +++ b/ProcessMaker/Repositories/CaseRepository.php @@ -5,7 +5,6 @@ use Carbon\Carbon; use Illuminate\Support\Facades\Log; use ProcessMaker\Contracts\CaseRepositoryInterface; -use ProcessMaker\Exception\CaseException; use ProcessMaker\Models\CaseStarted; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; @@ -63,7 +62,7 @@ public function create(ExecutionInstanceInterface $instance): void 'initiated_at' => $instance->initiated_at, 'completed_at' => null, ]); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } @@ -92,7 +91,7 @@ public function update(ExecutionInstanceInterface $instance, TokenInterface $tok $this->updateParticipants($token); $this->case->saveOrFail(); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } @@ -123,7 +122,7 @@ public function updateStatus(ExecutionInstanceInterface $instance): void // Update the case started and case participated CaseStarted::where('case_number', $instance->case_number)->update($data); $this->caseParticipatedRepository->updateStatus($instance->case_number, $data); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } @@ -196,7 +195,7 @@ private function updateSubProcesses(ExecutionInstanceInterface $instance): void $this->case->requests = CaseUtils::storeRequests($instance, $this->case->requests); $this->case->saveOrFail(); - } catch (CaseException $e) { + } catch (\Exception $e) { Log::error('CaseException: ' . $e->getMessage()); Log::error('CaseException: ' . $e->getTraceAsString()); } diff --git a/tests/Feature/Cases/CaseExceptionTest.php b/tests/Feature/Cases/CaseExceptionTest.php index 0930d1720f..5bf3317dd4 100644 --- a/tests/Feature/Cases/CaseExceptionTest.php +++ b/tests/Feature/Cases/CaseExceptionTest.php @@ -2,7 +2,6 @@ namespace Tests\Feature\Cases; -use Exception; use ProcessMaker\Models\Process; use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\ProcessRequestToken; @@ -125,9 +124,9 @@ public function test_artisan_sync_command_missing_ids(): void public function test_artisan_sync_command_success(): void { - $this->artisan('cases:sync --request_ids=1,2') - ->expectsOutput('Case started synced 1') - ->expectsOutput('Case started synced 2') + $this->artisan('cases:sync --request_ids=' . $this->instance->id . ',' . $this->instance2->id) + ->expectsOutput('Case started synced ' . $this->instance->case_number) + ->expectsOutput('Case started synced ' . $this->instance2->case_number) ->assertExitCode(0); $this->assertDatabaseCount('cases_started', 2); From 98b26105aba92658639497168f452d7ff12880e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Wed, 2 Oct 2024 15:19:17 +0000 Subject: [PATCH 44/45] FOUR-18605 Count the cases and requests by user and status (EP) --- .../Controllers/Api/V1_1/CaseController.php | 70 +++++++++++++++++++ .../Repositories/CaseApiRepository.php | 10 +-- routes/v1_1/api.php | 6 +- tests/Feature/Api/V1_1/CaseControllerTest.php | 51 ++++++++++++++ 4 files changed, 131 insertions(+), 6 deletions(-) diff --git a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php index ffa3056358..75f0c449eb 100644 --- a/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php +++ b/ProcessMaker/Http/Controllers/Api/V1_1/CaseController.php @@ -5,9 +5,12 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use ProcessMaker\Http\Controllers\Api\ProcessRequestController; use ProcessMaker\Http\Controllers\Controller; use ProcessMaker\Http\Requests\CaseListRequest; use ProcessMaker\Http\Resources\V1_1\CaseResource; +use ProcessMaker\Models\User; use ProcessMaker\Repositories\CaseApiRepository; class CaseController extends Controller @@ -83,6 +86,73 @@ public function getCompleted(CaseListRequest $request): JSonResponse return $this->paginateResponse($query); } + /** + * Get "my cases" counters + * + * @param CaseListRequest $request + * + * @return JsonResponse + */ + public function getMyCasesCounters(CaseListRequest $request): JsonResponse + { + // Load user object + if ($request->filled('userId')) { + $userId = $request->get('userId'); + $user = User::find($userId); + } else { + $user = Auth::user(); + } + + // Initializing variables + $totalAllCases = null; + $totalMyCases = null; + $totalInProgress = null; + $totalCompleted = null; + $totalMyRequest = null; + + // Check permission + if ($user->hasPermission('view-all_cases')) { + // The total number of cases recorded in the platform. User Id send is overridden. + $request->merge(['userId' => null]); + $queryAllCases = $this->caseRepository->getAllCases($request); + $totalAllCases = $queryAllCases->count(); + } + + // Restore user id + $request->merge(['userId' => $user->id]); + + // The total number of cases recorded by the user making the request. + $queryMyCases = $this->caseRepository->getAllCases($request); + $totalMyCases = $queryMyCases->count(); + + // The number of In Progress cases started by the user making the request. + $queryInProgressCases = $this->caseRepository->getInProgressCases($request); + $totalInProgress = $queryInProgressCases->count(); + + // The number of Completed cases started by the user making the request. + $queryCompletedCases = $this->caseRepository->getCompletedCases($request); + $totalCompleted = $queryCompletedCases->count(); + + // Check permission + if ($user->hasPermission('view-my_requests')) { + // Only in progress requests + $requestAux = new Request(); + $requestAux->replace(['type' => 'in_progress']); + + // The number of requests for user making the request. + $totalMyRequest = (new ProcessRequestController)->index($requestAux, true, $user); + } + + // Build response + return response()->json([ + 'totalAllCases' => $totalAllCases, + 'totalMyCases' => $totalMyCases, + 'totalInProgress' => $totalInProgress, + 'totalCompleted' => $totalCompleted, + 'totalMyRequest' => $totalMyRequest, + ]); + } + /** * Handle pagination and return JSON response. * diff --git a/ProcessMaker/Repositories/CaseApiRepository.php b/ProcessMaker/Repositories/CaseApiRepository.php index ccc6b14b92..08010b6ecf 100644 --- a/ProcessMaker/Repositories/CaseApiRepository.php +++ b/ProcessMaker/Repositories/CaseApiRepository.php @@ -116,11 +116,11 @@ public function getCompletedCases(Request $request): Builder */ protected function applyFilters(Request $request, Builder $query): void { - if ($request->has('userId')) { + if ($request->filled('userId')) { $query->where('user_id', $request->get('userId')); } - if ($request->has('status')) { + if ($request->filled('status')) { $query->where('case_status', $request->get('status')); } @@ -139,7 +139,7 @@ protected function applyFilters(Request $request, Builder $query): void */ public function search(Request $request, Builder $query): void { - if ($request->has('search')) { + if ($request->filled('search')) { $search = $request->get('search'); $query->where(function ($q) use ($search) { @@ -165,7 +165,7 @@ public function search(Request $request, Builder $query): void */ public function filterBy(Request $request, Builder $query): void { - if ($request->has('filterBy')) { + if ($request->filled('filterBy')) { $filterByValue = $request->get('filterBy'); foreach ($filterByValue as $key => $value) { @@ -193,7 +193,7 @@ public function filterBy(Request $request, Builder $query): void */ public function sortBy(Request $request, Builder $query): void { - if ($request->has('sortBy')) { + if ($request->filled('sortBy')) { $sort = explode(',', $request->get('sortBy')); foreach ($sort as $value) { diff --git a/routes/v1_1/api.php b/routes/v1_1/api.php index 1c722ad5cb..b147e8b5a7 100644 --- a/routes/v1_1/api.php +++ b/routes/v1_1/api.php @@ -38,8 +38,12 @@ Route::get('get_in_progress', [CaseController::class, 'getInProgress']) ->name('in_progress'); - // Route to list all completed cases + // Route to list all completed cases Route::get('get_completed', [CaseController::class, 'getCompleted']) ->name('completed'); + + // Route to get my cases counters + Route::get('get_my_cases_counters', [CaseController::class, 'getMyCasesCounters']) + ->name('my_cases_counters'); }); }); diff --git a/tests/Feature/Api/V1_1/CaseControllerTest.php b/tests/Feature/Api/V1_1/CaseControllerTest.php index 31333a9316..397532133e 100644 --- a/tests/Feature/Api/V1_1/CaseControllerTest.php +++ b/tests/Feature/Api/V1_1/CaseControllerTest.php @@ -2,9 +2,12 @@ namespace Tests\Feature\Api\V1_1; +use Faker\Factory as Faker; use Illuminate\Support\Facades\Hash; use ProcessMaker\Models\CaseParticipated; use ProcessMaker\Models\CaseStarted; +use ProcessMaker\Models\Permission; +use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\User; use Tests\Feature\Shared\RequestHelper; use Tests\TestCase; @@ -234,4 +237,52 @@ public function test_get_all_cases_filter_by_invalid_field(): void $response->assertStatus(422); $response->assertJsonPath('message', "Filter by field $invalidField is not allowed."); } + + public function test_get_my_cases_counters_ok(): void + { + /** + * Creating missing permissions, probably this part should be removed when + * the permissions were added in another ticket + */ + Permission::create([ + 'name' => 'view-all_cases', + 'title' => 'View All Cases', + ]); + Permission::create([ + 'name' => 'view-my_requests', + 'title' => 'View My Requests', + ]); + + $userA = $this->createUser('user_a'); + $userB = $this->createUser('user_b'); + + $userA->giveDirectPermission('view-all_cases'); + $userA->giveDirectPermission('view-my_requests'); + $userB->giveDirectPermission('view-all_cases'); + $userB->giveDirectPermission('view-my_requests'); + + $casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + $casesB = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesC = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'COMPLETED']); + $casesD = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']); + + $casesE = $this->createCasesStartedForUser($userB->id, 5, ['case_status' => 'COMPLETED']); + $casesF = $this->createCasesStartedForUser($userB->id, 5, ['case_status' => 'IN_PROGRESS']); + $casesG = $this->createCasesParticipatedForUser($userB->id, 5, ['case_status' => 'COMPLETED']); + $casesH = $this->createCasesParticipatedForUser($userB->id, 5, ['case_status' => 'IN_PROGRESS']); + + $in_progress = ProcessRequest::factory(5)->create([ + 'status' => 'ACTIVE', + 'user_id' => $userA->id, + ]); + + $response = $this->apiCall('GET', route('api.1.1.cases.my_cases_counters'), ['userId' => $userA->id]); + + $response->assertStatus(200); + $response->assertJsonFragment(['totalAllCases' => 20]); + $response->assertJsonFragment(['totalMyCases' => 10]); + $response->assertJsonFragment(['totalInProgress' => 5]); + $response->assertJsonFragment(['totalCompleted' => 5]); + $response->assertJsonFragment(['totalMyRequest' => 5]); + } } From d7ea3838eb6cc9e2c66166af1948cc212936b518 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Wed, 2 Oct 2024 13:18:55 -0400 Subject: [PATCH 45/45] fix: use status active constant --- ProcessMaker/Repositories/CaseSyncRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Repositories/CaseSyncRepository.php b/ProcessMaker/Repositories/CaseSyncRepository.php index 2d270d1974..64ac329e20 100644 --- a/ProcessMaker/Repositories/CaseSyncRepository.php +++ b/ProcessMaker/Repositories/CaseSyncRepository.php @@ -37,7 +37,7 @@ public static function syncCases(array $requestIds): array $csRequestTokens = collect(); $csTasks = collect(); $participants = $instance->participants->map->only('id', 'fullName', 'title', 'avatar'); - $status = $instance->status === 'ACTIVE' ? 'IN_PROGRESS' : $instance->status; + $status = $instance->status === CaseRepository::CASE_STATUS_ACTIVE ? 'IN_PROGRESS' : $instance->status; $cpData = self::prepareCaseStartedData($instance, $status, $participants);