From fc6d517b7147d9003af2ab96fa0a1da5e09c1c78 Mon Sep 17 00:00:00 2001 From: Igor Mironov Date: Thu, 4 Jul 2024 06:42:20 +0300 Subject: [PATCH] schema --- README.md | 3 +- backend/config/main.php | 15 +- backend/modules/schema/Module.php | 47 + backend/modules/schema/README.md | 30 + .../schema/controllers/DefaultController.php | 108 + .../modules/schema/messages/ru-RU/schema.php | 4 + .../modules/schema/views/default/_form.php | 30 + .../modules/schema/views/default/create.php | 27 + .../modules/schema/views/default/index.php | 97 + .../modules/schema/views/default/update.php | 24 + backend/modules/user/Module.php | 47 + backend/modules/user/README.md | 62 + .../user/controllers/DefaultController.php | 174 + backend/modules/user/messages/ru-RU/user.php | 73 + .../m240226_083100_modify_user_table.php | 33 + .../m240226_083103_create_employee_table.php | 69 + .../m240226_083135_create_customer_table.php | 70 + .../m240226_083203_create_admin_table.php | 66 + .../m240226_083212_create_users_roles.php | 223 + backend/modules/user/views/default/_form.php | 34 + backend/modules/user/views/default/create.php | 27 + backend/modules/user/views/default/index.php | 154 + backend/modules/user/views/default/update.php | 26 + .../modules/user/views/default/userMeta.php | 70 + common/components/schema/models/Schema.php | 68 + .../schema/models/search/SchemaSearch.php | 55 + .../user/handlers/UserCreateEventHandler.php | 87 + .../handlers/UserStatusChangeEventHandler.php | 45 + common/components/user/models/User.php | 362 ++ common/components/user/models/UserAdmin.php | 86 + .../components/user/models/UserCustomer.php | 82 + .../components/user/models/UserEmployee.php | 103 + .../components/user/models/UserPassword.php | 32 + .../user/models/search/UserSearch.php | 42 + common/helpers/HtmlHelper.php | 34 + common/helpers/MailHelper.php | 26 + common/helpers/UserHelper.php | 172 + composer.json | 131 +- composer.lock | 5640 ----------------- docker/logs/nginx/access.log | 10 + .../backend/config/codeception-local.php | 11 + .../stage/backend/config/main-local.php | 25 + .../stage/backend/config/params-local.php | 4 + .../stage/backend/config/test-local.php | 4 + environments/stage/backend/web/index-test.php | 27 + environments/stage/backend/web/index.php | 18 + environments/stage/backend/web/robots.txt | 2 + .../stage/common/config/codeception-local.php | 16 + .../stage/common/config/main-local.php | 43 + .../stage/common/config/params-local.php | 4 + .../stage/common/config/test-local.php | 9 + .../stage/console/config/main-local.php | 8 + .../stage/console/config/params-local.php | 4 + .../stage/console/config/test-local.php | 4 + .../frontend/config/codeception-local.php | 11 + .../stage/frontend/config/main-local.php | 25 + .../stage/frontend/config/params-local.php | 4 + .../stage/frontend/config/test-local.php | 4 + .../stage/frontend/web/index-test.php | 28 + environments/stage/frontend/web/index.php | 18 + environments/stage/frontend/web/robots.txt | 2 + environments/stage/yii | 24 + environments/stage/yii_test | 28 + environments/stage/yii_test.bat | 15 + 64 files changed, 3126 insertions(+), 5700 deletions(-) create mode 100644 backend/modules/schema/Module.php create mode 100644 backend/modules/schema/README.md create mode 100644 backend/modules/schema/controllers/DefaultController.php create mode 100644 backend/modules/schema/messages/ru-RU/schema.php create mode 100755 backend/modules/schema/views/default/_form.php create mode 100755 backend/modules/schema/views/default/create.php create mode 100755 backend/modules/schema/views/default/index.php create mode 100755 backend/modules/schema/views/default/update.php create mode 100644 backend/modules/user/Module.php create mode 100644 backend/modules/user/README.md create mode 100644 backend/modules/user/controllers/DefaultController.php create mode 100644 backend/modules/user/messages/ru-RU/user.php create mode 100644 backend/modules/user/migrations/m240226_083100_modify_user_table.php create mode 100644 backend/modules/user/migrations/m240226_083103_create_employee_table.php create mode 100644 backend/modules/user/migrations/m240226_083135_create_customer_table.php create mode 100644 backend/modules/user/migrations/m240226_083203_create_admin_table.php create mode 100644 backend/modules/user/migrations/m240226_083212_create_users_roles.php create mode 100755 backend/modules/user/views/default/_form.php create mode 100755 backend/modules/user/views/default/create.php create mode 100755 backend/modules/user/views/default/index.php create mode 100755 backend/modules/user/views/default/update.php create mode 100755 backend/modules/user/views/default/userMeta.php create mode 100644 common/components/schema/models/Schema.php create mode 100644 common/components/schema/models/search/SchemaSearch.php create mode 100644 common/components/user/handlers/UserCreateEventHandler.php create mode 100644 common/components/user/handlers/UserStatusChangeEventHandler.php create mode 100644 common/components/user/models/User.php create mode 100644 common/components/user/models/UserAdmin.php create mode 100644 common/components/user/models/UserCustomer.php create mode 100644 common/components/user/models/UserEmployee.php create mode 100644 common/components/user/models/UserPassword.php create mode 100644 common/components/user/models/search/UserSearch.php create mode 100644 common/helpers/HtmlHelper.php create mode 100644 common/helpers/MailHelper.php create mode 100644 common/helpers/UserHelper.php delete mode 100644 composer.lock create mode 100644 environments/stage/backend/config/codeception-local.php create mode 100644 environments/stage/backend/config/main-local.php create mode 100644 environments/stage/backend/config/params-local.php create mode 100644 environments/stage/backend/config/test-local.php create mode 100644 environments/stage/backend/web/index-test.php create mode 100644 environments/stage/backend/web/index.php create mode 100644 environments/stage/backend/web/robots.txt create mode 100644 environments/stage/common/config/codeception-local.php create mode 100644 environments/stage/common/config/main-local.php create mode 100644 environments/stage/common/config/params-local.php create mode 100644 environments/stage/common/config/test-local.php create mode 100644 environments/stage/console/config/main-local.php create mode 100644 environments/stage/console/config/params-local.php create mode 100644 environments/stage/console/config/test-local.php create mode 100644 environments/stage/frontend/config/codeception-local.php create mode 100644 environments/stage/frontend/config/main-local.php create mode 100644 environments/stage/frontend/config/params-local.php create mode 100644 environments/stage/frontend/config/test-local.php create mode 100644 environments/stage/frontend/web/index-test.php create mode 100644 environments/stage/frontend/web/index.php create mode 100644 environments/stage/frontend/web/robots.txt create mode 100644 environments/stage/yii create mode 100644 environments/stage/yii_test create mode 100644 environments/stage/yii_test.bat diff --git a/README.md b/README.md index 851a6f0..7d14c64 100644 --- a/README.md +++ b/README.md @@ -82,5 +82,6 @@ backend: [admin-example.webeffector.ru](https://admin-example.webeffector.ru) Test data for stage/dev: - Администратор admin@web.local:admin + - Супервайзор supervisor@web.local:supervisor - Менеджер manager@web.local:manager - - Пользователь user@web.local:user + - Пользователь customer@web.local:customer diff --git a/backend/config/main.php b/backend/config/main.php index 16ddc61..4299c1e 100644 --- a/backend/config/main.php +++ b/backend/config/main.php @@ -10,14 +10,13 @@ return [ 'id' => 'app-backend', 'basePath' => dirname(__DIR__), 'controllerNamespace' => 'backend\controllers', - 'bootstrap' => ['log'], - 'modules' => [], + 'bootstrap' => ['log', 'schema'], 'components' => [ 'request' => [ 'csrfParam' => '_csrf-backend', ], 'user' => [ - 'identityClass' => 'common\models\User', + 'identityClass' => common\components\user\models\User::class, 'enableAutoLogin' => true, 'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true], ], @@ -37,14 +36,20 @@ return [ 'errorHandler' => [ 'errorAction' => 'site/error', ], - /* 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], - */ + ], + 'modules' => [ + 'user' => [ + 'class' => backend\modules\user\Module::class, + ], + 'schema' => [ + 'class' => backend\modules\schema\Module::class, + ], ], 'params' => $params, ]; diff --git a/backend/modules/schema/Module.php b/backend/modules/schema/Module.php new file mode 100644 index 0000000..ff135da --- /dev/null +++ b/backend/modules/schema/Module.php @@ -0,0 +1,47 @@ +registerTranslations(); + } + + public function registerTranslations() + { + Yii::$app->i18n->translations['schema*'] = [ + 'class' => PhpMessageSource::class, + 'sourceLanguage' => 'ru-RU', + 'basePath' => '@backend/modules/schema/messages', + 'fileMap' => [ + 'schema' => 'schema.php', + ], + ]; + } + + public static function t($category, $message, $params = [], $language = null): string + { + return Yii::t('schema' . $category, $message, $params, $language); + } + + public function bootstrap($app) + { + if ($app instanceof Application) { + $app->getUrlManager()->addRules([ + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id, 'route' => $this->id . '/default/index'], + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id . '', 'route' => $this->id . '/default/view'], + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id . 'default/', 'route' => $this->id . '//'], + ], false); + } + } +} diff --git a/backend/modules/schema/README.md b/backend/modules/schema/README.md new file mode 100644 index 0000000..71e5fe0 --- /dev/null +++ b/backend/modules/schema/README.md @@ -0,0 +1,30 @@ +# Модуль Schema + +## Подключение модуля + + 'modules' => [ + 'schema' => [ + 'class' => backend\modules\schema\Module::class, + ], + ] + +Прописываем nameSpace в сгенерированном файле для подключения к проекту + + namespace backend\modules\schema\migrations; + +Добавляем миграции в настройки проекта + + 'controllerMap' => [ + 'migrate' => [ + 'class' => yii\console\controllers\MigrateController::class, + 'migrationNamespaces' => [ + 'backend\modules\schema\migrations', + ], + ], + ], + + docker-compose run --rm php ./yii migrate + +Добавление миграций + + docker-compose run --rm php ./yii migrate/create --migrationPath=@backend/modules/schema/migrations create_schema_table diff --git a/backend/modules/schema/controllers/DefaultController.php b/backend/modules/schema/controllers/DefaultController.php new file mode 100644 index 0000000..483903a --- /dev/null +++ b/backend/modules/schema/controllers/DefaultController.php @@ -0,0 +1,108 @@ + [ + 'class' => AccessControl::class, + 'denyCallback' => function () { + return $this->goHome(); + }, + 'rules' => [ + [ + 'allow' => true, + 'roles' => [UserHelper::ROLE_SUPERVISOR], + ], + ], + ], + ]; + } + + public function actionIndex(): string + { + $searchModel = new SchemaSearch(); + $params = Yii::$app->request->queryParams; + $dataProvider = $searchModel->search($params); + + return $this->render('index', [ + 'dataProvider' => $dataProvider, + 'searchModel' => $searchModel, + ]); + } + + public function actionCreate() + { + $model = new Schema(); + + if ($model->load(Yii::$app->request->post())) { + $model->save(); + } else { + if ($model->getErrors()) { + Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + } + } + + return $this->render('create', [ + 'model' => $model, + ]); + } + + public function actionUpdate($id) + { + $model = $this->findModel($id); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + Yii::$app->session->setFlash('success', Yii::t('schema', 'Сохранено')); + + return $this->redirect('index'); + } else { + if ($model->getErrors()) { + Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + } + } + + return $this->render('update', [ + 'model' => $model, + ]); + } + + public function actionDelete($id): Response + { + $model = $this->findModel($id); + $message = Yii::t('schema', 'Удалена'); + if ($model->delete()) { + Yii::$app->session->setFlash('success', $message); + } + if ($model->getErrors()) { + Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + } + + return $this->redirect(['index']); + } + + protected function findModel($id) + { + $model = Schema::find() + ->where(['id' => $id]) + ->one(); + + if ($model !== null) { + return $model; + } else { + throw new NotFoundHttpException(Yii::t('app/error', 'The requested page does not exist.')); + } + } +} diff --git a/backend/modules/schema/messages/ru-RU/schema.php b/backend/modules/schema/messages/ru-RU/schema.php new file mode 100644 index 0000000..bee73cf --- /dev/null +++ b/backend/modules/schema/messages/ru-RU/schema.php @@ -0,0 +1,4 @@ + + +
+ +
+ field($model, 'name')->textarea(['maxlength' => 255]) ?> +
+
+
+ field($model, 'type')->dropDownList(Schema::getTypeList()) ?> +
+
+
+ isNewRecord ? Yii::t('schema', 'Добавить') : Yii::t('schema', 'Обновить'), ['class' => 'btn btn-outline-primary btn-sm']) ?> +
+ +
diff --git a/backend/modules/schema/views/default/create.php b/backend/modules/schema/views/default/create.php new file mode 100755 index 0000000..a50ee31 --- /dev/null +++ b/backend/modules/schema/views/default/create.php @@ -0,0 +1,27 @@ +title = Yii::t('schema', 'Добавить'); +$this->params['breadcrumbs'][] = ['label' => Yii::t('schema', 'Schema'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; + +?> + +
+
+

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
+
diff --git a/backend/modules/schema/views/default/index.php b/backend/modules/schema/views/default/index.php new file mode 100755 index 0000000..c361350 --- /dev/null +++ b/backend/modules/schema/views/default/index.php @@ -0,0 +1,97 @@ +title = Yii::t('schema', 'Стоп-слова'); +$this->params['breadcrumbs'][] = $this->title; +?> + +
+
+

title) ?>

+
+ 'btn btn-outline-primary btn-sm']) ?> +
+ 'schema-form', 'method' => 'get']); ?> +
+
+ field($searchModel, 'name')->textInput() ?> +
+
+ field($searchModel, 'type')->dropDownList(schema::getTypeList(), ['prompt' => Yii::t('schema', 'Все')]) ?> +
+
+ field($searchModel, 'created_at')->widget(DatePicker::class, [ + 'language' => 'ru', + 'containerOptions' => ['class' => 'form-group'], + 'options' => ['class' => 'form-control'], + 'dateFormat' => 'php:d.m.Y', + ])->label() ?> +
+
+
+
+
+ 'btn btn-sm btn-success']) ?> + 'btn btn-outline-dark btn-sm']) ?> +
+
+ +
+
+ ['class' => 'table table-striped table-bordered'], + 'dataProvider' => $dataProvider, + 'pager' => [ + 'firstPageLabel' => Yii::t('schema', 'В начало'), + 'lastPageLabel' => Yii::t('schema', 'В конец'), + ], + 'columns' => [ + ['class' => yii\grid\SerialColumn::class], + 'name', + [ + 'attribute' => 'type', + 'value' => function ($model) { + return schema::getTypeList($model->type); + }, + ], + 'created_at:date', + [ + 'class' => yii\grid\ActionColumn::class, + 'template' => '{update}', + 'buttons' => [ + 'update' => function ($url, $model, $key) { + return Html::a(Yii::t('schema', '', [ + 'icon' => HtmlHelper::ICON_UPDATE, + ]), $url); + }, + ], + ], + [ + // todo ajax refactor + 'class' => yii\grid\ActionColumn::class, + 'template' => '{delete}', + 'buttons' => [ + 'delete' => function ($url, $model, $key) { + return Html::a(Yii::t('schema', '', [ + 'icon' => HtmlHelper::ICON_DELETE, + ]), $url, ['id' => "delete-bad-word-$model->id"]); + }, + ], + ], + ], + ]) ?> +
+
+
diff --git a/backend/modules/schema/views/default/update.php b/backend/modules/schema/views/default/update.php new file mode 100755 index 0000000..de1cecc --- /dev/null +++ b/backend/modules/schema/views/default/update.php @@ -0,0 +1,24 @@ +title = Yii::t('schema', 'Обновить') . ": " . Yii::t('schema', 'стоп-слово') . "#$model->id"; +$this->params['breadcrumbs'][] = ['label' => Yii::t('schema', 'Стоп-слова'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $model->id; +?> + +
+
+

title) ?>

+ render('_form', [ + 'model' => $model, + ]) ?> + +
+
diff --git a/backend/modules/user/Module.php b/backend/modules/user/Module.php new file mode 100644 index 0000000..1e26698 --- /dev/null +++ b/backend/modules/user/Module.php @@ -0,0 +1,47 @@ +registerTranslations(); + } + + public function registerTranslations() + { + Yii::$app->i18n->translations['user*'] = [ + 'class' => PhpMessageSource::class, + 'sourceLanguage' => 'ru-RU', + 'basePath' => '@backend/modules/user/messages', + 'fileMap' => [ + 'user' => 'user.php', + ], + ]; + } + + public static function t($category, $message, $params = [], $language = null): string + { + return Yii::t('user' . $category, $message, $params, $language); + } + + public function bootstrap($app) + { + if ($app instanceof Application) { + $app->getUrlManager()->addRules([ + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id, 'route' => $this->id . '/default/index'], + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id . '', 'route' => $this->id . '/default/view'], + ['class' => 'yii\web\UrlRule', 'pattern' => $this->id . '/', 'route' => $this->id . '//'], + ], false); + } + } +} diff --git a/backend/modules/user/README.md b/backend/modules/user/README.md new file mode 100644 index 0000000..cab7f28 --- /dev/null +++ b/backend/modules/user/README.md @@ -0,0 +1,62 @@ +# Модуль User + +## Подключение модуля + + 'modules' => [ + 'user' => [ + 'class' => backend\modules\user\Module::class, + ], + ] + +Прописываем nameSpace в сгенерированном файле для подключения к проекту + + namespace backend\modules\user\migrations; + +Добавляем миграции в настройки проекта + + 'controllerMap' => [ + 'migrate' => [ + 'class' => yii\console\controllers\MigrateController::class, + 'migrationNamespaces' => [ + 'backend\modules\user\migrations', + ], + ], + ], + + docker-compose run --rm php ./yii migrate --migrationPath=@yii/rbac/migrations + + docker-compose run --rm php ./yii migrate + +Добавление миграций + + docker-compose run --rm php ./yii migrate/create --migrationPath=@backend/modules/user/migrations create_users_table + + +##Roles + +user_customer: + + - customer (заказчик); + +user_employee: + + - author (автор/исполнитель); + - technic (ТЗ-мейкер); + - auditor (аудитор); + - manager (контент-менеджер); + +user_admin: + + - supervisor (супервайзер); + - admin (администратор); + +test data: + + - admin@content.local:admin + - supervisor@content.local:supervisor + - customer@content.local:customer + - technic@content.local:technic + - author@content.local:author + - auditor@content.local:auditor + - manager@content.local:manager + diff --git a/backend/modules/user/controllers/DefaultController.php b/backend/modules/user/controllers/DefaultController.php new file mode 100644 index 0000000..56dc2de --- /dev/null +++ b/backend/modules/user/controllers/DefaultController.php @@ -0,0 +1,174 @@ + [ + 'class' => AccessControl::class, + 'denyCallback' => function () { + return $this->goHome(); + }, + 'rules' => [ + [ + 'allow' => true, + 'roles' => [UserHelper::ROLE_SUPERVISOR], + ], + ], + ], + ]; + } + + public function actionIndex(): string + { + $searchModel = new UserSearch(); + $params = Yii::$app->request->queryParams; + $dataProvider = $searchModel->search($params); + + return $this->render('index', [ + 'dataProvider' => $dataProvider, + 'searchModel' => $searchModel, + ]); + } + + public function actionCreate(): string|Response + { + $auth = Yii::$app->authManager; + $model = new User(); + $model->setScenario(User::SCENARIO_USER_CREATE); + + if ($model->load(Yii::$app->request->post())) { + $model->generateAuthKey(); + $model->setPassword(Yii::$app->security->generateRandomKey(Yii::$app->params['user.passwordMinLength'])); + + $model->type = match ($model->role) { + UserHelper::ROLE_AUDITOR, UserHelper::ROLE_MANAGER, UserHelper::ROLE_TECHNIC, UserHelper::ROLE_AUTHOR => UserHelper::TYPE_EMPLOYEE, + UserHelper::ROLE_ADMIN, UserHelper::ROLE_SUPERVISOR => UserHelper::TYPE_ADMIN, + default => UserHelper::TYPE_CUSTOMER, + }; + + if ($model->save()) { + $userRole = $auth->getRole($model->role); + $auth->assign($userRole, $model->id); + + Yii::$app->session->setFlash('success', Yii::t('user', 'Создан')); + + return $this->redirect(['update', 'id' => $model->id]); + } else { + if ($model->getErrors()) { + Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + } + } + } + return $this->render('create', [ + 'model' => $model, + ]); + } + + public function actionUpdate($id): Response|string + { + $model = $this->findModel($id); + + $userType = $model->typeName; + $model->$userType = $model->meta; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + if ($model->role) { + $model->setRole($model->role); + + $model->meta->load($model->$userType, ''); + $model->meta->save(); + + Yii::$app->session->setFlash('success', Yii::t('user', 'Пользватель {email} обновлён', [ + 'email' => $model->email, + ])); + return $this->redirect(['index']); + } + + Yii::$app->session->setFlash('error', Yii::t('user', 'Роль не указана')); + return $this->render('update', [ + 'model' => $model, + ]); + } else { + if ($model->getErrors()) Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + return $this->render('update', [ + 'model' => $model, + ]); + } + } + + public function actionBan($id): Response + { + $model = $this->findModel($id); + $model->status = UserHelper::STATUS_BLOCKED_MANUAL; + if ($model->save()) { + Yii::$app->session->setFlash('success', Yii::t('user', '{email} заблокирован', [ + 'email' => $model->email, + ])); + } + if ($model->getErrors()) { + Yii::$app->session->setFlash('error', json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); + } + + return $this->redirect(['index']); + } + + public function actionResetPassword($id): Response + { + $model = $this->findModel($id); + + if ($model->status == UserHelper::STATUS_ACTIVE || $model->status == UserHelper::STATUS_NEW || $model->status == UserHelper::STATUS_TEST) { + $user = new PasswordResetRequestForm(); + $user->email = $model->email; + + if ($user->validate()) { + if ($token = $user->sendEmail()) { + $message = Yii::t('user', 'Пароль сброшен для {email}: {link}', [ + 'email' => $model->email, + 'link' => Yii::$app->params['webUrl'] . Url::to(['/reset-password', 'token' => $token]), + ]); + + Yii::$app->telegram->sendMessage(Yii::$app->params['telegram']['accountExpirationChatId'], $message); + Yii::$app->session->setFlash('success', $message); + } else { + Yii::$app->session->setFlash('error', 'Нельзя отправить письмо на {email}', [ + 'email' => $model->email, + ]); + } + } + } else { + Yii::$app->session->setFlash('error', Yii::t('user', 'Пользователь не должен быть забанен')); + } + + return $this->redirect(['/user']); + } + + protected function findModel($id): array|User + { + $model = User::find() + ->select([User::tableName() . '.*', 'auth_assignment.item_name as role']) + ->where([User::tableName() . '.id' => $id]) + ->leftJoin('auth_assignment', 'auth_assignment.user_id = ' . User::tableName() . '.id') + ->one(); + + if ($model !== null) { + return $model; + } else { + throw new NotFoundHttpException(Yii::t('app/error', 'The requested page does not exist.')); + } + } +} diff --git a/backend/modules/user/messages/ru-RU/user.php b/backend/modules/user/messages/ru-RU/user.php new file mode 100644 index 0000000..e8080b5 --- /dev/null +++ b/backend/modules/user/messages/ru-RU/user.php @@ -0,0 +1,73 @@ + 'Номер', + 'Пользователь' => 'Пользователь', + 'Пароль' => 'Пароль', + 'Email' => 'Email', + 'Роль' => 'Роль', + 'Роли' => 'Роли', + 'Имя' => 'Имя', + 'Фамилия' => 'Фамилия', + 'Отчество' => 'Отчество', + 'Полное имя' => 'Полное имя', + 'День рождения' => 'День рождения', + 'Аватар' => 'Аватар', + 'Локация' => 'Локация', + 'Телефон' => 'Телефон', + 'Телеграм' => 'Телеграм', + + 'Ник' => 'Ник', + 'Соцсеть' => 'Соцсеть', + 'Попыток тестирования' => 'Попыток тестирования', + 'Результат тестирования' => 'Результат тестирования', + 'Дата тестирования' => 'Дата тестирования', + 'Аккаунт подтверждён' => 'Аккаунт подтверждён', + 'Заблокирован' => 'Заблокирован', + + //userStatus + 'Забанен вручную' => 'Забанен вручную', + 'Забанен автоматически' => 'Забанен автоматически', + 'Новый' => 'Новый', + 'Подтверждён' => 'Подтверждён', + 'Прошёл тест' => 'Прошёл тест', + 'Активный' => 'Активный', + + // event + 'Новый аккаунт {role} создан: {email}' => 'Новый аккаунт {role} создан: {email}', + 'Ошибка при создании пользователя: {error}' => 'Ошибка при создании пользователя: {error}', + + + // userType + 'Администратор' => 'Администратор', + 'Заказчик' => 'Заказчик', + 'Исполнитель' => 'Исполнитель', + + //userRole + 'Супервайзер' => 'Супервайзер', + 'ТЗ мейкер' => 'ТЗ мейкер', + 'Аудитор' => 'Аудитор', + 'Контент менеджер' => 'Контент менеджер', + + // user + 'Все' => 'Все', + 'Фильтр' => 'Фильтр', + 'Добавить пользователя' => 'Добавить пользователя', + 'Сбросить фильтр' => 'Сбросить фильтр', + 'В начало' => 'В начало', + 'В конец' => 'В конец', + 'Сброс пароля' => 'Сброс пароля', + '{email} заблокирован' => '{email} заблокирован', + 'Пользватель {email} обновлён' => 'Пользватель {email} обновлён', + 'Создан' => 'Создан', + 'Пользователь не должен быть забанен' => 'Пользователь не должен быть забанен', + 'Нельзя отправить письмо на {email}' => 'Нельзя отправить письмо на {email}', + 'Пароль сброшен для {email}: {link}' => 'Пароль сброшен для {email}: {link}', + 'Выбери роль' => 'Выбери роль', + 'Добавить' => 'Добавить', + 'Обновить' => 'Обновить', + 'Обновление {email}' => 'Обновление {email}', + 'Добавление' => 'Добавление', + 'Роль не указана' => 'Роль не указана', + 'Статус изменён: {email}' => 'Статус изменён: {email}', +]; diff --git a/backend/modules/user/migrations/m240226_083100_modify_user_table.php b/backend/modules/user/migrations/m240226_083100_modify_user_table.php new file mode 100644 index 0000000..50b5cfe --- /dev/null +++ b/backend/modules/user/migrations/m240226_083100_modify_user_table.php @@ -0,0 +1,33 @@ +db->schema->getTableSchema($this->userTable); + if ($table) { + if (!isset($table->columns['type'])) { + $this->addColumn($this->userTable, 'type', $this->smallInteger()->notNull()->after('status')); + } + + return true; + } + + return false; + } + + public function safeDown(): bool + { + if (YII_ENV_PROD) { + return false; + } + + return true; + } +} diff --git a/backend/modules/user/migrations/m240226_083103_create_employee_table.php b/backend/modules/user/migrations/m240226_083103_create_employee_table.php new file mode 100644 index 0000000..9fcd40b --- /dev/null +++ b/backend/modules/user/migrations/m240226_083103_create_employee_table.php @@ -0,0 +1,69 @@ +db->driverName === 'mysql') { + $tableOptions = 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB'; + } + + if ($this->db->schema->getTableSchema($this->userTable)) { + if ($this->db->schema->getTableSchema($this->employeeTable) === null) { + $this->createTable($this->employeeTable, [ + 'id' => $this->primaryKey(), + 'user_id' => $this->integer()->notNull(), + 'first_name' => $this->string()->notNull(), + 'last_name' => $this->string()->null(), + 'middle_name' => $this->string()->null(), + 'full_name' => $this->string(), + 'birthday' => $this->integer(), + 'avatar' => $this->string(), + 'phone' => $this->string(), + 'telegram' => $this->string(), + 'location' => $this->string(), + 'verified_at' => $this->integer(), + 'blocked_at' => $this->integer(), + ], $tableOptions); + + $this->addForeignKey('fk-employee-user', $this->employeeTable, 'user_id', $this->userTable, 'id', 'CASCADE', 'NO ACTION'); + + $this->createIndex('idx-user_id', $this->employeeTable, 'user_id'); + $this->createIndex('idx-full_name', $this->employeeTable, 'full_name'); + } + + return true; + } + + return false; + } + + public function safeDown(): bool + { + if (YII_ENV_PROD) { + return false; + } + + $table = $this->db->schema->getTableSchema($this->employeeTable); + if ($table != null) { + if (isset($table->foreignKeys) && array_key_exists('fk-employee-user', $table->foreignKeys) == true) { + $this->dropForeignKey('fk-employee-user', $this->employeeTable); + } + + $this->dropTable($this->employeeTable); + } + + return true; + } +} diff --git a/backend/modules/user/migrations/m240226_083135_create_customer_table.php b/backend/modules/user/migrations/m240226_083135_create_customer_table.php new file mode 100644 index 0000000..1f0086d --- /dev/null +++ b/backend/modules/user/migrations/m240226_083135_create_customer_table.php @@ -0,0 +1,70 @@ +db->driverName === 'mysql') { + $tableOptions = 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB'; + } + + if ($this->db->schema->getTableSchema($this->userTable)) { + if ($this->db->schema->getTableSchema($this->customerTable) == null) { + $this->createTable($this->customerTable, [ + 'id' => $this->primaryKey(), + 'user_id' => $this->integer()->notNull(), + 'first_name' => $this->string()->notNull(), + 'last_name' => $this->string()->null(), + 'middle_name' => $this->string()->null(), + 'full_name' => $this->string(), + 'birthday' => $this->integer(), + 'avatar' => $this->string(), + 'phone' => $this->string(), + 'telegram' => $this->string(), + 'location' => $this->string(), + 'verified_at' => $this->integer(), + 'blocked_at' => $this->integer(), + ], $tableOptions); + + $this->addForeignKey('fk-customer-user', $this->customerTable, 'user_id', $this->userTable, 'id', 'CASCADE', 'NO ACTION'); + + $this->createIndex('idx-user_id', $this->customerTable, 'user_id'); + $this->createIndex('idx-full_name', $this->customerTable, 'full_name'); + } + + return true; + } + + return false; + } + + public function safeDown(): bool + { + if (YII_ENV_PROD) { + return false; + } + + $table = $this->db->schema->getTableSchema($this->customerTable); + + if ($table != null) { + if (isset($table->foreignKeys) && array_key_exists('fk-customer-user', $table->foreignKeys) == true) { + $this->dropForeignKey('fk-customer-user', $this->customerTable); + } + + $this->dropTable($this->customerTable); + } + + return true; + } +} diff --git a/backend/modules/user/migrations/m240226_083203_create_admin_table.php b/backend/modules/user/migrations/m240226_083203_create_admin_table.php new file mode 100644 index 0000000..32e8a7c --- /dev/null +++ b/backend/modules/user/migrations/m240226_083203_create_admin_table.php @@ -0,0 +1,66 @@ +db->driverName === 'mysql') { + $tableOptions = 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB'; + } + + if ($this->db->schema->getTableSchema($this->userTable)) { + if ($this->db->schema->getTableSchema($this->adminTable) == null) { + $this->createTable($this->adminTable, [ + 'id' => $this->primaryKey(), + 'user_id' => $this->integer()->notNull(), + 'first_name' => $this->string()->notNull(), + 'last_name' => $this->string()->null(), + 'middle_name' => $this->string()->null(), + 'full_name' => $this->string(), + 'birthday' => $this->integer(), + 'avatar' => $this->string(), + 'phone' => $this->string(), + 'telegram' => $this->string(), + 'location' => $this->string(), + ], $tableOptions); + + $this->addForeignKey('fk-admin-user', $this->adminTable, 'user_id', $this->userTable, 'id', 'CASCADE', 'NO ACTION'); + + $this->createIndex('idx-user_id', $this->adminTable, 'user_id'); + $this->createIndex('idx-full_name', $this->adminTable, 'full_name'); + } + return true; + } + + return false; + } + + public function safeDown(): bool + { + if (YII_ENV_PROD) { + return false; + } + + $table = $this->db->schema->getTableSchema($this->adminTable); + if ($table != null) { + if (isset($table->foreignKeys) && array_key_exists('fk-admin-user', $table->foreignKeys) == true) { + $this->dropForeignKey('fk-admin-user', $this->adminTable); + } + + $this->dropTable($this->adminTable); + } + + return true; + } +} diff --git a/backend/modules/user/migrations/m240226_083212_create_users_roles.php b/backend/modules/user/migrations/m240226_083212_create_users_roles.php new file mode 100644 index 0000000..3cb7a77 --- /dev/null +++ b/backend/modules/user/migrations/m240226_083212_create_users_roles.php @@ -0,0 +1,223 @@ +authManager; + + $dataUsers = [ + UserHelper::TYPE_ADMIN => [ + UserHelper::ROLE_ADMIN, + UserHelper::ROLE_SUPERVISOR, + ], + UserHelper::TYPE_CUSTOMER => [ + UserHelper::ROLE_CUSTOMER, + ], + UserHelper::TYPE_EMPLOYEE => [ + UserHelper::ROLE_MANAGER, + ], + ]; + + + // create permission create_customer + if (!$auth->getPermission('create_customer')) { + $createCustomer = $auth->createPermission('create_customer'); + $createCustomer->description = 'create_customer permission'; + $auth->add($createCustomer); + echo "create_customer perm created\n"; + } else { + $createCustomer = $auth->getPermission('create_customer'); + } + + // create permission update_customer + if (!$auth->getPermission('update_customer')) { + $updateCustomer = $auth->createPermission('update_customer'); + $updateCustomer->description = 'update_customer permission'; + $auth->add($updateCustomer); + echo "update_customer permission created\n"; + } else { + $updateCustomer = $auth->getPermission('update_customer'); + } + + // create customer role + if (!$auth->getRole(UserHelper::ROLE_CUSTOMER)) { + $customer = $auth->createRole(UserHelper::ROLE_CUSTOMER); + $customer->description = UserHelper::ROLE_CUSTOMER; + $auth->add($customer); + $auth->addChild($customer, $updateCustomer); + echo UserHelper::ROLE_CUSTOMER . " role created\n"; + } else { + $customer = $auth->getRole('customer'); + } + + // create permission create_supervisor + if (!$auth->getPermission('create_supervisor')) { + $createSupervisor = $auth->createPermission('create_supervisor'); + $createSupervisor->description = 'create_supervisor permission'; + $auth->add($createSupervisor); + echo "create_supervisor perm created\n"; + } else { + $createSupervisor = $auth->getPermission('create_supervisor'); + } + + // create permission update_supervisor + if (!$auth->getPermission('update_supervisor')) { + $updateSupervisor = $auth->createPermission('update_supervisor'); + $updateSupervisor->description = 'update_supervisor permission'; + $auth->add($updateSupervisor); + echo "update_supervisor perm created\n"; + } else { + $updateSupervisor = $auth->getPermission('update_supervisor'); + } + + // create permission create_admin + if (!$auth->getPermission('create_admin')) { + $createAdmin = $auth->createPermission('create_admin'); + $createAdmin->description = 'create_admin permission'; + $auth->add($createAdmin); + echo "create_admin perm created\n"; + } else { + $createAdmin = $auth->getPermission('create_admin'); + } + + // create permission update_admin + if (!$auth->getPermission('update_admin')) { + $updateAdmin = $auth->createPermission('update_admin'); + $updateAdmin->description = 'update_admin permission'; + $auth->add($updateAdmin); + echo "update_admin perm created\n"; + } else { + $updateAdmin = $auth->getPermission('update_admin'); + } + + // create manager role + foreach ($dataUsers[UserHelper::TYPE_EMPLOYEE] as $employee) { + if (!$auth->getPermission("create_$employee")) { + $createEmployee = $auth->createPermission("create_$employee"); + $createEmployee->description = "create_$employee permission"; + $auth->add($createEmployee); + echo "create_$employee perm created\n"; + } + + if (!$auth->getPermission("update_$employee")) { + $updateEmployee = $auth->createPermission("update_$employee"); + $updateEmployee->description = "update_$employee permission"; + $auth->add($updateEmployee); + echo "update_$employee perm created\n"; + } else { + $updateEmployee = $auth->getPermission("update_$employee"); + } + + if (!$auth->getRole($employee)) { + $$employee = $auth->createRole($employee); + $$employee->description = $employee; + $auth->add($$employee); + $auth->addChild($$employee, $updateEmployee); + echo "$employee role created\n"; + } + } + + // create supervisor role + if (!$auth->getRole(UserHelper::ROLE_SUPERVISOR)) { + $supervisor = $auth->createRole(UserHelper::ROLE_SUPERVISOR); + $supervisor->description = UserHelper::ROLE_SUPERVISOR; + $auth->add($supervisor); + $auth->addChild($supervisor, $updateSupervisor); + $auth->addChild($supervisor, $createCustomer); + $auth->addChild($supervisor, $customer); + + foreach ($dataUsers[UserHelper::TYPE_EMPLOYEE] as $employee) { + $auth->addChild($supervisor, $$employee); + $auth->addChild($supervisor, $auth->getPermission("create_$employee")); + } + + echo UserHelper::ROLE_SUPERVISOR . " role created\n"; + } else { + $supervisor = $auth->getRole(UserHelper::ROLE_SUPERVISOR); + } + + // create admin role + if (!$auth->getRole(UserHelper::ROLE_ADMIN)) { + $admin = $auth->createRole(UserHelper::ROLE_ADMIN); + $admin->description = UserHelper::ROLE_ADMIN; + $auth->add($admin); + $auth->addChild($admin, $supervisor); + $auth->addChild($admin, $createSupervisor); + $auth->addChild($admin, $createAdmin); + $auth->addChild($admin, $updateAdmin); + echo UserHelper::ROLE_ADMIN . " role created\n"; + } + + if (YII_ENV_PROD) { + echo "Rbac is OK\n"; + return true; + } + + foreach ($dataUsers as $type => $users) { + foreach ($users as $role) { + self::createUser($role, $type, $auth); + } + } + + echo "Rbac is OK\n"; + return true; + } + + public function safeDown(): bool + { + if (YII_ENV_PROD) { + return false; + } + + $auth = Yii::$app->authManager; + $auth->removeAll(); + User::deleteAll(); + return true; + } + + private function createUser($role, $type, $auth): void + { + if (!User::findOne(['email' => "$role@web.local"])) { + $model = new User(); + $model->email = "$role@web.local"; + $model->username = $role; + $model->status = UserHelper::STATUS_ACTIVE; + $model->type = $type; + $model->role = $role; + $model->setPassword($role); + $model->generateAuthKey(); + if ($model->save()) { + $userMeta = new UserCustomer(); + if ($model->type == UserHelper::TYPE_ADMIN) { + $userMeta = new UserAdmin(); + } elseif ($model->type == UserHelper::TYPE_EMPLOYEE) { + $userMeta = new UserEmployee(); + } elseif ($model->type == UserHelper::TYPE_EMPLOYEE) { + $userMeta = new UserEmployee(); + } + + $authRole = $auth->getRole($role); + $auth->assign($authRole, $model->getId()); + + $userMeta->first_name = $model->email; + $userMeta->link('user', $model); + + echo "$role is created\n"; + } else { + echo json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE) . "\n"; + echo "$role creation is fail\n"; + } + } + } +} diff --git a/backend/modules/user/views/default/_form.php b/backend/modules/user/views/default/_form.php new file mode 100755 index 0000000..9b9eff7 --- /dev/null +++ b/backend/modules/user/views/default/_form.php @@ -0,0 +1,34 @@ + +
+ +
+ field($model, 'email')->textInput(['maxlength' => 100]) ?> +
+ + isNewRecord) { ?> +
+ field($model, 'role')->dropDownList(UserHelper::roleNameList(), ['prompt' => Yii::t('user', 'Выбери роль')]) ?> +
+ render('userMeta', ['model' => $model, 'form' => $form]); + } ?> + +
+ isNewRecord ? Yii::t('user', 'Добавить') : Yii::t('user', 'Обновить'), ['class' => 'btn btn-outline-primary btn-sm']) ?> +
+ +
diff --git a/backend/modules/user/views/default/create.php b/backend/modules/user/views/default/create.php new file mode 100755 index 0000000..c5841da --- /dev/null +++ b/backend/modules/user/views/default/create.php @@ -0,0 +1,27 @@ +title = Yii::t('user', 'Добавление'); +$this->params['breadcrumbs'][] = ['label' => Yii::t('user', 'Пользователи'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; + +?> + +
+
+

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
+
diff --git a/backend/modules/user/views/default/index.php b/backend/modules/user/views/default/index.php new file mode 100755 index 0000000..fd07ebd --- /dev/null +++ b/backend/modules/user/views/default/index.php @@ -0,0 +1,154 @@ +title = Yii::t('user', 'Пользователи'); +$this->params['breadcrumbs'][] = $this->title; + +$script = <<< JS +//Активация/Деактивация пользователя +$("input[type=checkbox].status").on('change',function () { + let id = $(this).attr('data-id'); + $.ajax({ + type: "get", + url: "/user/default/activate", + data: { + id: id + } + }).done(function(response) { + if(response.status) { + $('#alert-error').hide(); + $('#alert-success').html(response.message).fadeIn().delay(300).fadeOut(); + if(response.activate) { + $('.reset-password-' + id).removeClass('d-none'); + } else { + $('.reset-password-' + id).addClass('d-none'); + } + } else { + $('#alert-success').hide(); + $('#alert-error').html(response.message).fadeIn().delay(300).fadeOut(); + } + }); +}); +JS; + +$this->registerJs($script, yii\web\View::POS_END); +?> + +
+
+

title) ?>

+
+ 'btn btn-outline-primary btn-sm']) ?> +
+ 'user-form', + 'method' => 'get', + 'action' => '/user', + ]); ?> + +
+
+ field($searchModel, 'role')->dropDownList(UserHelper::roleNameList(), ['prompt' => Yii::t('user', 'Все')]) ?> +
+
+ field($searchModel, 'status')->dropDownList(UserHelper::statusNameList(), ['prompt' => Yii::t('user', 'Все')]) ?> +
+
+
+
+
+ 'btn btn-sm btn-success']) ?> + 'btn btn-outline-dark btn-sm']) ?> +
+
+ +
+
+ ['class' => 'table table-striped table-bordered'], + 'dataProvider' => $dataProvider, + 'pager' => [ + 'firstPageLabel' => Yii::t('user', 'В начало'), + 'lastPageLabel' => Yii::t('user', 'В конец'), + ], + 'columns' => [ + ['class' => yii\grid\SerialColumn::class], + 'email', + [ + 'attribute' => 'role', + 'format' => 'raw', + 'value' => function ($model) { + if ($model->role) { + return UserHelper::roleNameList($model->role); + } else { + return Yii::t('user', 'Роль не указана'); + } + }, + ], + [ + 'attribute' => 'status', + 'format' => 'raw', + 'value' => function ($model) { + return UserHelper::statusNameList($model->status); + }, + ], + [ + 'class' => yii\grid\ActionColumn::class, + 'template' => '{reset-password}', + 'buttons' => [ + 'reset-password' => function ($url, $model, $key) { + $hidden = 'd-none'; + if ($model->status == UserHelper::STATUS_ACTIVE) { + $hidden = ''; + } + return Html::a(Yii::t('user', 'Сброс пароля'), $url, ['class' => "btn btn-sm btn-outline-secondary reset-password-{$model->id} $hidden", 'data-id' => $model->id]); + }, + ], + ], + [ + 'class' => yii\grid\ActionColumn::class, + 'template' => '{update}', + 'buttons' => [ + 'update' => function ($url, $model, $key) { + + return Html::a(Yii::t('user', '', [ + 'icon' => HtmlHelper::ICON_UPDATE, + ]), $url); + }, + ], + ], + [ + 'class' => yii\grid\ActionColumn::class, + 'template' => '{ban}', + 'buttons' => [ + 'ban' => function ($url, $model, $key) { + if ($model->status != UserHelper::STATUS_BLOCKED_MANUAL && $model->status != UserHelper::STATUS_BLOCKED_AUTO) { + return Html::a(Yii::t('user', '', [ + 'icon' => HtmlHelper::ICON_DELETE, + ]), $url); + } else { + return ''; + } + }, + ], + ], + ], + ]); ?> +
+
+
diff --git a/backend/modules/user/views/default/update.php b/backend/modules/user/views/default/update.php new file mode 100755 index 0000000..9369740 --- /dev/null +++ b/backend/modules/user/views/default/update.php @@ -0,0 +1,26 @@ +title = Yii::t('user', 'Обновление {email}', [ + 'email' => $model->email +]); +$this->params['breadcrumbs'][] = ['label' => Yii::t('user', 'Пользователи'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $model->username; +?> + +
+
+

title) ?>

+ render('_form', [ + 'model' => $model, + ]) ?> + +
+
diff --git a/backend/modules/user/views/default/userMeta.php b/backend/modules/user/views/default/userMeta.php new file mode 100755 index 0000000..3927dea --- /dev/null +++ b/backend/modules/user/views/default/userMeta.php @@ -0,0 +1,70 @@ +type == UserHelper::TYPE_ADMIN) { + $attribute = 'admin'; + ?> +
+ field($model, $attribute . '[birthday]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'День рождения')) ?> +
+type == UserHelper::TYPE_EMPLOYEE) { + $attribute = 'employee'; + ?> +
+ field($model, $attribute . '[birthday]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'День рождения')) ?> +
+
+ field($model, $attribute . '[about]')->textInput(['maxlength' => 255])->label(Yii::t('user', 'О себе')) ?> +
+
+ field($model, $attribute . '[nick_name]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Ник')) ?> +
+
+ field($model, $attribute . '[web]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Соц.сети')) ?> +
+
+ field($model, $attribute . '[test_count]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Попытка тестирования')) ?> +
+
+ field($model, $attribute . '[test_result]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Результат тестирования')) ?> +
+type == UserHelper::TYPE_CUSTOMER) { + $attribute = 'customer'; +} ?> + +
+
+ field($model, $attribute . '[location]')->dropDownList(UserHelper::locationNames(), ['prompt' => Yii::t('user', '...')])->label(Yii::t('user', 'Код страны')) ?> +
+
+ field($model, $attribute . '[phone]')->textInput(['maxlength' => 100, 'placeholder' => '901 234 56 78'])->label(Yii::t('user', 'Телефон')) ?> +
+
+ +
+ field($model, $attribute . '[last_name]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Фамилия')) ?> +
+
+ field($model, $attribute . '[first_name]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Имя')) ?> +
+
+ field($model, $attribute . '[middle_name]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Отчество')) ?> +
+
+ field($model, $attribute . '[telegram]')->textInput(['maxlength' => 100])->label(Yii::t('user', 'Телеграм')) ?> +
diff --git a/common/components/schema/models/Schema.php b/common/components/schema/models/Schema.php new file mode 100644 index 0000000..0a184cf --- /dev/null +++ b/common/components/schema/models/Schema.php @@ -0,0 +1,68 @@ + 255], + ]; + } + + public function attributeLabels(): array + { + return [ + 'id' => Yii::t('schema', 'ID'), + 'name' => Yii::t('schema', 'Название'), + 'created_at' => Yii::t('schema', 'Создано'), + 'updated_at' => Yii::t('schema', 'Изменено'), + ]; + } + + public function behaviors(): array + { + return [ + TimestampBehavior::class, + ]; + } + + public static function getTypeList($type = null) + { + $typeList = [ + self::TYPE_ACCURATE => Yii::t('schema', 'Точное'), + self::TYPE_SOFT => Yii::t('schema', 'Разбавочное'), + ]; + + if ($type) { + return isset($typeList[$type]) ? $typeList[$type] : null; + } + + return $typeList; + } +} diff --git a/common/components/schema/models/search/SchemaSearch.php b/common/components/schema/models/search/SchemaSearch.php new file mode 100644 index 0000000..01a7969 --- /dev/null +++ b/common/components/schema/models/search/SchemaSearch.php @@ -0,0 +1,55 @@ + 255], + ]; + } + + public function search($params): ?ActiveDataProvider + { + $query = Schema::find(); + + $dataProvider = new ActiveDataProvider([ + 'query' => $query, + 'sort' => [ + 'defaultOrder' => [ + 'created_at' => SORT_DESC, + 'id' => SORT_DESC, + ], + ], + ]); + + $this->load($params); + + if (!$this->validate()) { + return $dataProvider; + } + + $query->andFilterWhere([ + 'like', 'name', $this->name, + ]); + + if ($this->created_at) { + $query->andFilterWhere([ + 'between', 'created_at', strtotime(date('d.m.Y', strtotime($this->created_at))), strtotime(date('d.m.Y', strtotime($this->created_at))) + 86400, // +1 days + ]); + } + + return $dataProvider; + } +} diff --git a/common/components/user/handlers/UserCreateEventHandler.php b/common/components/user/handlers/UserCreateEventHandler.php new file mode 100644 index 0000000..b3d650b --- /dev/null +++ b/common/components/user/handlers/UserCreateEventHandler.php @@ -0,0 +1,87 @@ +sender; + + if (!$user || !$user->email) { + try { + self::sendTelegram($user, self::errorMessage()); + } catch (Exception $e) { + } + return; + } + + $userMeta = new UserCustomer(); + + $auth = Yii::$app->authManager; + + if ($user->type == UserHelper::TYPE_ADMIN) { + $userMeta = new UserAdmin(); + } elseif ($user->type == UserHelper::TYPE_EMPLOYEE) { + $userMeta = new UserEmployee(); + } elseif ($user->type == UserHelper::TYPE_EMPLOYEE) { + $userMeta = new UserEmployee(); + } + + $authRole = $auth->getRole($user->role); + $auth->assign($authRole, $user->getId()); + + $userMeta->first_name = $user->email; + $userMeta->link('user', $user); + + $verifyLink = Yii::$app->urlManager->createAbsoluteUrl(['/verify-email', 'token' => $user->verification_token]); + + if(!YII_ENV_PROD) { + Yii::$app->telegram->sendMessage(Yii::$app->params['telegram']['accountExpirationChatId'], "Ссылка для верификации (test): " . $verifyLink); + } + + try { + self::sendTelegram($user, self::successMessage($user)); + } catch (Exception $e) { + //todo mock + } + } + } + + static private function sendEmail($email): bool + { + // todo mock + return true; + } + + static private function sendTelegram(User $user, $message) + { + Yii::$app->telegram->sendMessage(Yii::$app->params['telegram']['accountExpirationChatId'], $message); + } + + static private function errorMessage(): string + { + return Yii::t('user', 'Ошибка при создании пользователя'); + } + + static private function successMessage(User $user): string + { + return Yii::t('user', 'Новый аккаунт {role} создан: {email}', [ + 'role' => UserHelper::roleNameList($user->role), + 'email' => $user->email, + ]); + } +} + diff --git a/common/components/user/handlers/UserStatusChangeEventHandler.php b/common/components/user/handlers/UserStatusChangeEventHandler.php new file mode 100644 index 0000000..213619a --- /dev/null +++ b/common/components/user/handlers/UserStatusChangeEventHandler.php @@ -0,0 +1,45 @@ +sender; + + if (!$user || !$user->email) { + return; + } + + self::sendTelegram($user); +// self::sendEmail($user->email); + } + + static private function sendTelegram(User $user): bool + { + return Yii::$app->telegram->sendMessage(Yii::$app->params['telega']['accountExpirationChatId'], Yii::t('user', 'Статус изменён: {email}', [ + 'email' => $user->email, + ])); + } + + static private function sendEmail($email): bool + { + return MailHelper::sendMail( + $email, + null, + Yii::t('app', 'Статус изменён'), + [ + 'title' => Yii::t('app', 'Статус изменён'), + 'body' => Yii::t('user', 'Ваш статус изменился, {link}', [ + 'link' => Yii::$app->params['webUrl'], + ]), + ]); + } +} diff --git a/common/components/user/models/User.php b/common/components/user/models/User.php new file mode 100644 index 0000000..9811b0e --- /dev/null +++ b/common/components/user/models/User.php @@ -0,0 +1,362 @@ + Yii::t('app', 'Почта уже занята')], + [['username'], 'unique', 'message' => Yii::t('app', 'Логин уже занят')], + [['email'], 'required'], + [['role', 'email'], 'string'], + ['status', 'in', 'range' => UserHelper::statusList()], + ['type', 'in', 'range' => UserHelper::typeList()], + ['role', 'in', 'range' => UserHelper::roleList()], + [['agree', 'payment_bank'], 'safe'], + ['role', 'required', 'on' => self::SCENARIO_USER_CREATE], + [['employee', 'customer', 'admin'], 'safe'], + ]; + } + + public function behaviors(): array + { + return [ + TimestampBehavior::class, + [ + 'class' => AttributeBehavior::class, + 'attributes' => [ + ActiveRecord::EVENT_BEFORE_INSERT => 'username', + ActiveRecord::EVENT_BEFORE_UPDATE => 'username', + ], + 'value' => function ($event) { + return $this->email; + }, + ], + ]; + } + + public function afterSave($insert, $changedAttributes) + { + if ($insert) { + if ($this->scenario === self::SCENARIO_USER_CREATE) { + $this->trigger(self::EVENT_USER_CREATE); + } + + //todo add scenario user status change + } + + parent::afterSave($insert, $changedAttributes); + } + + public function scenarios() + { + $scenarios = parent::scenarios(); + $scenarios[self::SCENARIO_USER_CREATE] = ['type', 'status', 'email', 'agree', 'role']; + $scenarios[self::SCENARIO_USER_ADMIN_UPDATE] = ['type', 'status', 'email', 'role', 'admin']; + $scenarios[self::SCENARIO_USER_EMPLOYEE_UPDATE] = ['type', 'status', 'email', 'role', 'employee']; + $scenarios[self::SCENARIO_USER_CUSTOMER_UPDATE] = ['type', 'status', 'email', 'role', 'customer']; + return $scenarios; + } + + public function attributeLabels(): array + { + return [ + 'id' => Yii::t('user', 'ID'), + 'email' => Yii::t('user', 'Email'), + 'name' => Yii::t('user', 'Имя'), + 'username' => Yii::t('user', 'Логин'), + 'status' => Yii::t('user', 'Статус'), + 'type' => Yii::t('user', 'Тип'), + 'role' => Yii::t('user', 'Роль'), + 'created_at' => Yii::t('user', 'Создан'), + 'updated_at' => Yii::t('user', 'Обновлён'), + ]; + } + + public function setRole($role): void + { + if (!isset($role)) { + throw new BadRequestHttpException(); + } + $auth = Yii::$app->authManager; + $role = $auth->getRole($role); + if ($role) { + $auth->revokeAll($this->id); + $auth->assign($role, $this->id); + } + } + + public function getRole() + { + $role = Yii::$app->authManager->getRolesByUser($this->id); + if ($role) { + return $role; + } + return false; + } + + public function getTypeName(): string + { + return match ($this->type) { + UserHelper::TYPE_CUSTOMER => 'customer', + UserHelper::TYPE_EMPLOYEE => 'employee', + UserHelper::TYPE_ADMIN => 'admin', + }; + } + + public function getUserAdmin(): ActiveQuery + { + return $this->hasOne(UserAdmin::class, ['user_id' => 'id']); + } + + public function getUserCustomer(): ActiveQuery + { + return $this->hasOne(UserCustomer::class, ['user_id' => 'id']); + } + + public function getUserEmployee(): ActiveQuery + { + return $this->hasOne(UserEmployee::class, ['user_id' => 'id']); + } + + public function getMeta(): UserAdmin|UserEmployee|UserCustomer + { + return match ($this->type) { + UserHelper::TYPE_ADMIN => $this->userAdmin, + UserHelper::TYPE_EMPLOYEE => $this->userEmployee, + default => $this->userCustomer, + }; + } + + static public function current(): User|IdentityInterface|null + { + return Yii::$app->user->identity; + } + + public static function findIdentity($id): User|IdentityInterface|null + { + return static::findOne(['and', + ['id' => $id], + ['>=', 'status', UserHelper::STATUS_NEW], + ] + ); + } + + public static function findIdentityByAccessToken($token, $type = null): ?IdentityInterface + { + //todo translate + throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); + } + + public static function findByUsername(string $email) + { + $user = User::find()->where(['and', + ['or', + ['email' => $email], + ['username' => $email], + ], + ['>=', 'status', UserHelper::STATUS_NEW], + ])->one(); + + return $user ?? null; + } + + public static function findByPasswordResetToken($token): array|ActiveRecord|null + { + if (!static::isPasswordResetTokenValid($token)) { + return null; + } + + return static::find()->where(['and', + ['password_reset_token' => $token], + ['>=', 'status', UserHelper::STATUS_NEW], + ])->one(); + } + + public static function findByVerificationToken($token): array|ActiveRecord|null + { + return static::find()->where(['and', + ['verification_token' => $token], + ['>=', 'status', UserHelper::STATUS_NEW], + ])->one(); + } + + public static function isPasswordResetTokenValid($token): bool + { + if (empty($token)) { + return false; + } + + $timestamp = (int)substr($token, strrpos($token, '_') + 1); + $expire = Yii::$app->params['user.passwordResetTokenExpire']; + + return $timestamp + $expire >= time(); + } + + public function getId() + { + return $this->getPrimaryKey(); + } + + public function getAuthKey(): ?string + { + return $this->auth_key; + } + + public function validatePhone(string $phone): bool + { + return true; + } + + public function validateAuthKey($authKey): bool + { + return $this->getAuthKey() === $authKey; + } + + public function validatePassword(string $password): bool + { + return Yii::$app->security->validatePassword($password, $this->password_hash); + } + + public function setPassword(string $password) + { + $this->password_hash = Yii::$app->security->generatePasswordHash($password); + } + + public function generateAuthKey() + { + $this->auth_key = Yii::$app->security->generateRandomString(); + } + + public function generatePasswordResetToken() + { + $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); + } + + public function generateEmailVerificationToken() + { + $this->verification_token = Yii::$app->security->generateRandomString() . '_' . time(); + } + + public function removePasswordResetToken() + { + $this->password_reset_token = null; + } + + public function quizStart($count, $time): void + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + $user = UserEmployee::find()->where(['user_id' => $this->id])->one(); + if ($user) { + $user->test_try_count = $count; + $user->test_at = $time; + $user->test_result = null; + $user->save(false); + } + } + } + + public function quizFailed(): void + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + $this->status = UserHelper::STATUS_BLOCKED_AUTO; + $this->save(false); + } + } + + public function setTestResult(bool $result): void + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + if ($result) { + $this->status = UserHelper::STATUS_TEST; + $this->save(false); + } + $this->meta->test_result = time(); + $this->meta->save(false); + } + } + + public function testAt(): int|null + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + return $this->meta->test_at; + } + return null; + } + + public function testTryCount(): int + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + return $this->meta->test_try_count ?? 0; + } + return 0; + } + + public function getTestResult(): int|null + { + if (UserHelper::TYPE_EMPLOYEE == $this->type) { + return $this->meta->test_result ?? null; + } + return null; + } +} diff --git a/common/components/user/models/UserAdmin.php b/common/components/user/models/UserAdmin.php new file mode 100644 index 0000000..910353b --- /dev/null +++ b/common/components/user/models/UserAdmin.php @@ -0,0 +1,86 @@ + 255], + [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::class, 'targetAttribute' => ['user_id' => 'id']], + ]; + } + + public function attributeLabels(): array + { + return [ + 'id' => Yii::t('user', 'ID'), + 'user_id' => Yii::t('user', 'Пользователь'), + 'first_name' => Yii::t('user', 'Имя'), + 'last_name' => Yii::t('user', 'Фамилия'), + 'middle_name' => Yii::t('user', 'Отчество'), + 'full_name' => Yii::t('user', 'Полное имя'), + 'birthday' => Yii::t('user', 'День рождения'), + 'avatar' => Yii::t('user', 'Аватар'), + 'location' => Yii::t('user', 'Локация'), + 'phone' => Yii::t('user', 'Телефон'), + 'telegram' => Yii::t('user', 'Телеграм'), + ]; + } + + public function getUser(): \yii\db\ActiveQuery + { + return $this->hasOne(User::class, ['id' => 'user_id']); + } + + public function getFullName(): string + { + return implode(' ', [$this->last_name, $this->first_name, $this->middle_name]); + } + + // todo refactor + public function behaviors(): array + { + return [ + [ + 'class' => AttributeBehavior::class, + 'attributes' => [ + ActiveRecord::EVENT_BEFORE_INSERT => 'full_name', + ActiveRecord::EVENT_BEFORE_UPDATE => 'full_name', + ], + 'value' => function ($event) { + return self::getFullName(); + }, + ], + ]; + } +} diff --git a/common/components/user/models/UserCustomer.php b/common/components/user/models/UserCustomer.php new file mode 100644 index 0000000..e0adec7 --- /dev/null +++ b/common/components/user/models/UserCustomer.php @@ -0,0 +1,82 @@ + 255], + [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::class, 'targetAttribute' => ['user_id' => 'id']], + ]; + } + + public function attributeLabels() + { + return [ + 'id' => Yii::t('user', 'ID'), + 'user_id' => Yii::t('user', 'Пользователь'), + 'first_name' => Yii::t('user', 'Имя'), + 'last_name' => Yii::t('user', 'Фамилия'), + 'middle_name' => Yii::t('user', 'Отчество'), + 'full_name' => Yii::t('user', 'Полное имя'), + 'telegram' => Yii::t('user', ' Телеграм'), + 'location' => Yii::t('user', 'Локация'), + 'phone' => Yii::t('user', 'Телефон'), + ]; + } + + public function getUser(): \yii\db\ActiveQuery + { + return $this->hasOne(User::class, ['id' => 'user_id']); + } + + public function getFullName(): string + { + return implode(' ', [$this->last_name, $this->first_name, $this->middle_name]); + } + + // todo refactor + public function behaviors(): array + { + return [ + [ + 'class' => AttributeBehavior::class, + 'attributes' => [ + ActiveRecord::EVENT_BEFORE_INSERT => 'full_name', + ActiveRecord::EVENT_BEFORE_UPDATE => 'full_name', + ], + 'value' => function ($event) { + return self::getFullName(); + }, + ], + ]; + } +} diff --git a/common/components/user/models/UserEmployee.php b/common/components/user/models/UserEmployee.php new file mode 100644 index 0000000..646c82f --- /dev/null +++ b/common/components/user/models/UserEmployee.php @@ -0,0 +1,103 @@ + 255], + [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::class, 'targetAttribute' => ['user_id' => 'id']], + ]; + } + + public function attributeLabels(): array + { + return [ + 'id' => Yii::t('user', 'ID'), + 'user_id' => Yii::t('user', 'Пользователь'), + 'first_name' => Yii::t('user', 'Имя'), + 'last_name' => Yii::t('user', 'Фамилия'), + 'middle_name' => Yii::t('user', 'Отчество'), + 'full_name' => Yii::t('user', 'Полное имя'), + 'about' => Yii::t('user', ''), + 'nick_name' => Yii::t('user', 'Ник'), + 'web' => Yii::t('user', 'Соцсеть'), + 'telegram' => Yii::t('user', 'Телеграм'), + 'birthday' => Yii::t('user', 'День рождения'), + 'avatar' => Yii::t('user', 'Аватар'), + 'location' => Yii::t('user', 'Локация'), + 'phone' => Yii::t('user', 'Телефон'), + 'test_try_count' => Yii::t('user', 'Попыток тестирования'), + 'test_result' => Yii::t('user', 'Результат тестирования'), + 'test_at' => Yii::t('user', 'Дата тестирования'), + 'verified_at' => Yii::t('user', 'Аккаунт подтверждён'), + 'blocked_at' => Yii::t('user', 'Заблокирован'), + ]; + } + + public function getUser(): ActiveQuery + { + return $this->hasOne(User::class, ['id' => 'user_id']); + } + + public function getFullName(): string + { + return implode(' ', [$this->last_name, $this->first_name, $this->middle_name]); + } + + // todo refactor all usersTypes + public function behaviors(): array + { + return [ + [ + 'class' => AttributeBehavior::class, + 'attributes' => [ + ActiveRecord::EVENT_BEFORE_INSERT => 'full_name', + ActiveRecord::EVENT_BEFORE_UPDATE => 'full_name', + ], + 'value' => function ($event) { + return self::getFullName(); + }, + ], + ]; + } +} diff --git a/common/components/user/models/UserPassword.php b/common/components/user/models/UserPassword.php new file mode 100644 index 0000000..9e4579b --- /dev/null +++ b/common/components/user/models/UserPassword.php @@ -0,0 +1,32 @@ + Yii::t('user', 'Пароль'), + 'passwordConfirm' => Yii::t('user', 'Повторите пароль'), + ]; + } +} diff --git a/common/components/user/models/search/UserSearch.php b/common/components/user/models/search/UserSearch.php new file mode 100644 index 0000000..caa3825 --- /dev/null +++ b/common/components/user/models/search/UserSearch.php @@ -0,0 +1,42 @@ +select([User::tableName() . '.*', 'auth_assignment.item_name as role']) + ->leftJoin('auth_assignment', 'auth_assignment.user_id = ' . User::tableName() . '.id'); + + $dataProvider = new ActiveDataProvider([ + 'query' => $query, + 'sort' => [ + 'defaultOrder' => ['id' => SORT_ASC], + ], + ]); + + $this->load($params); + + if (!$this->validate()) { + return $dataProvider; + } + + $query->andFilterWhere([ + 'status' => $this->status, + 'auth_assignment.item_name' => $this->role, + ]); + + return $dataProvider; + } +} diff --git a/common/helpers/HtmlHelper.php b/common/helpers/HtmlHelper.php new file mode 100644 index 0000000..d0a8317 --- /dev/null +++ b/common/helpers/HtmlHelper.php @@ -0,0 +1,34 @@ +'; + const ICON_UPDATE = ''; + const ICON_DELETE = ''; + const ICON_REFRESH = ''; + const ICON_BAN = ''; + const ICON_MAIN_SETTINGS = ''; + const ICON_SETTINGS = ''; + const ICON_HELP = ''; + const ICON_INFO = ''; + const ICON_USER = ''; + const ICON_PEOPLE = ''; + const ICON_LOGIN = ''; + const ICON_LOGOUT = ''; + const ICON_EMAIL = ''; + const ICON_ABC = ''; + const ICON_BOOK = ''; + const ICON_STAT = ''; + const ICON_MAIN = ''; + const ICON_FAQ = ''; + const ICON_HELP_SQUARE = ''; + const ICON_STOP = ''; + const ICON_VIRUS = ''; + const ICON_TOOLS = ''; + const ICON_FINGERPRINT = ''; + const ICON_CHECK_TEXT = ''; +} diff --git a/common/helpers/MailHelper.php b/common/helpers/MailHelper.php new file mode 100644 index 0000000..00cf04d --- /dev/null +++ b/common/helpers/MailHelper.php @@ -0,0 +1,26 @@ +params['senderEmail'] => Yii::$app->params['senderName']]; + } + + return Yii::$app + ->mailer + ->compose( + $view, + $body + ) + ->setFrom($emailFrom) + ->setTo($emailTo) + ->setSubject($subject) + ->send(); + } +} diff --git a/common/helpers/UserHelper.php b/common/helpers/UserHelper.php new file mode 100644 index 0000000..5b53c11 --- /dev/null +++ b/common/helpers/UserHelper.php @@ -0,0 +1,172 @@ + Yii::t('user', 'Забанен'), + self::STATUS_NEW => Yii::t('user', 'Новый'), + self::STATUS_ACTIVE => Yii::t('user', 'Активен'), + ]; + + if ($status) { + return isset($statusList[$status]) ? $statusList[$status] : null; + } + + return $statusList; + } + + public static function typeList(): array + { + return [ + self::TYPE_ADMIN, + self::TYPE_CUSTOMER, + self::TYPE_EMPLOYEE, + ]; + } + + public static function clientTypeList(): array + { + return [ + self::TYPE_CUSTOMER, + self::TYPE_EMPLOYEE, + ]; + } + + public static function typeNameList($type = null): array|string|null + { + $typeNames = [ + self::TYPE_ADMIN => Yii::t('user', 'Администратор'), + self::TYPE_CUSTOMER => Yii::t('user', 'Заказчик'), + self::TYPE_EMPLOYEE => Yii::t('user', 'Сотрудник'), + ]; + + if ($type) { + return isset($typeNames[$type]) ? $typeNames[$type] : null; + } + + return $typeNames; + } + + public static function roleList(): array + { + return [ + self::ROLE_ADMIN, + self::ROLE_SUPERVISOR, + self::ROLE_CUSTOMER, + self::ROLE_MANAGER, + ]; + } + + public static function roleNameList($role = null) + { + $roleNames = [ + self::ROLE_ADMIN => Yii::t('user', 'Администратор'), + self::ROLE_SUPERVISOR => Yii::t('user', 'Супервайзер'), + self::ROLE_CUSTOMER => Yii::t('user', 'Заказчик'), + self::ROLE_MANAGER => Yii::t('user', 'Контент менеджер'), + ]; + + if ($role) { + return isset($roleNames[$role]) ? $roleNames[$role] : null; + } + + return $roleNames; + } + + public function locationPhoneCodes($country = null) + { + $phoneCodes = [ + 'rus' => '+7', + 'blr' => '+375', + 'kaz' => '+7', + 'arm' => '+374', + 'kgz' => '+996', + ]; + + if ($country) { + return isset($phoneCodes[$country]) ? $phoneCodes[$country] : null; + } + + return $phoneCodes; + } + + public static function locationNames($country = null) + { + $countryNames = [ + 'rus' => Yii::t('user', 'Россия'), + 'blr' => Yii::t('user', 'Белоруссия'), + 'kaz' => Yii::t('user', 'Казахстан'), + 'arm' => Yii::t('user', 'Армения'), + 'kgs' => Yii::t('user', 'Кыргызстан'), + ]; + + if ($country) { + return isset($countryNames[$country]) ? $countryNames[$country] : null; + } + + return $countryNames; + } + + public static function phoneRuFormat($phone) + { + $phone = trim($phone); + + $result = preg_replace( + [ + '/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{3})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/', + '/[\+]?([7|8])[-|\s]?(\d{3})[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/', + '/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/', + '/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/', + '/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{3})/', + '/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{3})[-|\s]?(\d{3})/', + ], + [ + '+7$2$3$4$5', + '+7$2$3$4$5', + '+7$2$3$4$5', + '+7$2$3$4$5', + '+7$2$3$4', + '+7$2$3$4', + ], + $phone + ); + $result = preg_replace('~\\D+~u', '', $result); + return $result; + } +} diff --git a/composer.json b/composer.json index 888f14f..d1e1a9f 100644 --- a/composer.json +++ b/composer.json @@ -1,57 +1,80 @@ { - "name": "yiisoft/yii2-app-advanced", - "description": "Yii 2 Advanced Project Template", - "keywords": ["yii2", "framework", "advanced", "project template"], - "homepage": "https://www.yiiframework.com/", - "type": "project", - "license": "BSD-3-Clause", - "support": { - "issues": "https://github.com/yiisoft/yii2/issues?state=open", - "forum": "https://www.yiiframework.com/forum/", - "wiki": "https://www.yiiframework.com/wiki/", - "irc": "ircs://irc.libera.chat:6697/yii", - "source": "https://github.com/yiisoft/yii2" + "name": "yiisoft/yii2-app-advanced", + "description": "Yii 2 Advanced Project Template", + "keywords": [ + "yii2", + "framework", + "advanced", + "project template" + ], + "homepage": "https://www.yiiframework.com/", + "type": "project", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "forum": "https://www.yiiframework.com/forum/", + "wiki": "https://www.yiiframework.com/wiki/", + "irc": "ircs://irc.libera.chat:6697/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "minimum-stability": "dev", + "require": { + "php": ">=8.0", + "ext-json": "*", + "yiisoft/yii2": "~2.0.45", + "yiisoft/yii2-bootstrap5": "~2.0.2", + "yiisoft/yii2-symfonymailer": "~2.0.3", + "bower-asset/font-awesome": "~4.7", + "unclead/yii2-multiple-input": "~2.27.0", + "yiisoft/yii2-jui": "~2.0.0", + "2amigos/yii2-tinymce-widget" : "~1.1", + "ckeditor/ckeditor": "~4.22.1", + "sunhater/kcfinder": "*", + "bower-asset/slick-carousel": "*", + "kartik-v/yii2-widget-select2": "dev-master" + }, + "require-dev": { + "yiisoft/yii2-debug": "~2.1.0", + "yiisoft/yii2-gii": "~2.2.0", + "yiisoft/yii2-faker": "~2.0.0", + "phpunit/phpunit": "~9.5.0", + "codeception/codeception": "^5.0.0 || ^4.0", + "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1", + "codeception/module-asserts": "^3.0 || ^1.1", + "codeception/module-yii2": "^1.1", + "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1", + "codeception/verify": "^3.0 || ^2.2", + "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4" + }, + "autoload-dev": { + "psr-4": { + "common\\tests\\": [ + "common/tests/", + "common/tests/_support" + ], + "backend\\tests\\": [ + "backend/tests/", + "backend/tests/_support" + ], + "frontend\\tests\\": [ + "frontend/tests/", + "frontend/tests/_support" + ] + } + }, + "config": { + "allow-plugins": { + "yiisoft/yii2-composer": true }, - "minimum-stability": "dev", - "require": { - "php": ">=7.4.0", - "yiisoft/yii2": "~2.0.45", - "yiisoft/yii2-bootstrap5": "~2.0.2", - "yiisoft/yii2-symfonymailer": "~2.0.3" - }, - "require-dev": { - "yiisoft/yii2-debug": "~2.1.0", - "yiisoft/yii2-gii": "~2.2.0", - "yiisoft/yii2-faker": "~2.0.0", - "phpunit/phpunit": "~9.5.0", - "codeception/codeception": "^5.0.0 || ^4.0", - "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1", - "codeception/module-asserts": "^3.0 || ^1.1", - "codeception/module-yii2": "^1.1", - "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1", - "codeception/verify": "^3.0 || ^2.2", - "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4" - }, - "autoload-dev": { - "psr-4": { - "common\\tests\\": ["common/tests/", "common/tests/_support"], - "backend\\tests\\": ["backend/tests/", "backend/tests/_support"], - "frontend\\tests\\": ["frontend/tests/", "frontend/tests/_support"] - } - }, - "config": { - "allow-plugins": { - "yiisoft/yii2-composer" : true - }, - "process-timeout": 1800, - "fxp-asset": { - "enabled": false - } - }, - "repositories": [ - { - "type": "composer", - "url": "https://asset-packagist.org" - } - ] + "process-timeout": 1800, + "fxp-asset": { + "enabled": false + } + }, + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org" + } + ] } diff --git a/composer.lock b/composer.lock deleted file mode 100644 index b5ad320..0000000 --- a/composer.lock +++ /dev/null @@ -1,5640 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "54772b701dc006304263b231f6ce63ac", - "packages": [ - { - "name": "bower-asset/bootstrap", - "version": "v5.3.3", - "source": { - "type": "git", - "url": "https://github.com/twbs/bootstrap.git", - "reference": "6e1f75f420f68e1d52733b8e407fc7c3766c9dba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/6e1f75f420f68e1d52733b8e407fc7c3766c9dba", - "reference": "6e1f75f420f68e1d52733b8e407fc7c3766c9dba" - }, - "type": "bower-asset" - }, - { - "name": "bower-asset/inputmask", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/RobinHerbots/Inputmask.git", - "reference": "8a211a89a8528d85da5e1de5ea1d45258f42b02a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/8a211a89a8528d85da5e1de5ea1d45258f42b02a", - "reference": "8a211a89a8528d85da5e1de5ea1d45258f42b02a" - }, - "require": { - "bower-asset/jquery": ">=1.7" - }, - "type": "bower-asset", - "license": [ - "http://opensource.org/licenses/mit-license.php" - ] - }, - { - "name": "bower-asset/jquery", - "version": "3.7.1", - "source": { - "type": "git", - "url": "https://github.com/jquery/jquery-dist.git", - "reference": "fde1f76e2799dd877c176abde0ec836553246991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/fde1f76e2799dd877c176abde0ec836553246991", - "reference": "fde1f76e2799dd877c176abde0ec836553246991" - }, - "type": "bower-asset", - "license": [ - "MIT" - ] - }, - { - "name": "bower-asset/punycode", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/mathiasbynens/punycode.js.git", - "reference": "9e1b2cda98d215d3a73fcbfe93c62e021f4ba768" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mathiasbynens/punycode.js/zipball/9e1b2cda98d215d3a73fcbfe93c62e021f4ba768", - "reference": "9e1b2cda98d215d3a73fcbfe93c62e021f4ba768" - }, - "type": "bower-asset" - }, - { - "name": "bower-asset/yii2-pjax", - "version": "2.0.8", - "source": { - "type": "git", - "url": "git@github.com:yiisoft/jquery-pjax.git", - "reference": "a9298d57da63d14a950f1b94366a864bc62264fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/a9298d57da63d14a950f1b94366a864bc62264fb", - "reference": "a9298d57da63d14a950f1b94366a864bc62264fb" - }, - "require": { - "bower-asset/jquery": ">=1.8" - }, - "type": "bower-asset", - "license": [ - "MIT" - ] - }, - { - "name": "cebe/markdown", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cebe/markdown.git", - "reference": "2b2461bed9e15305486319ee552bafca75d1cdaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cebe/markdown/zipball/2b2461bed9e15305486319ee552bafca75d1cdaa", - "reference": "2b2461bed9e15305486319ee552bafca75d1cdaa", - "shasum": "" - }, - "require": { - "lib-pcre": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "cebe/indent": "*", - "facebook/xhprof": "*@dev", - "phpunit/phpunit": "4.1.*" - }, - "default-branch": true, - "bin": [ - "bin/markdown" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "cebe\\markdown\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", - "role": "Creator" - } - ], - "description": "A super fast, highly extensible markdown parser for PHP", - "homepage": "https://github.com/cebe/markdown#readme", - "keywords": [ - "extensible", - "fast", - "gfm", - "markdown", - "markdown-extra" - ], - "support": { - "issues": "https://github.com/cebe/markdown/issues", - "source": "https://github.com/cebe/markdown" - }, - "time": "2020-02-26T01:55:18+00:00" - }, - { - "name": "doctrine/lexer", - "version": "3.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "cd03cc3c085aa94b046bd2d342b08d6b0e5d834f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/cd03cc3c085aa94b046bd2d342b08d6b0e5d834f", - "reference": "cd03cc3c085aa94b046bd2d342b08d6b0e5d834f", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.1.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2024-02-05T12:02:27+00:00" - }, - { - "name": "egulias/email-validator", - "version": "4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "92c1ab0cc1d38e188f858cea12bbb90711fa759a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92c1ab0cc1d38e188f858cea12bbb90711fa759a", - "reference": "92c1ab0cc1d38e188f858cea12bbb90711fa759a", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^2.0 || ^3.0", - "php": ">=8.1", - "symfony/polyfill-intl-idn": "^1.26" - }, - "require-dev": { - "phpunit/phpunit": "^10.2", - "vimeo/psalm": "^5.12" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.x" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2024-05-01T13:20:12+00:00" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.17.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", - "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", - "shasum": "" - }, - "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "require-dev": { - "cerdic/css-tidy": "^1.7 || ^2.0", - "simpletest/simpletest": "dev-master" - }, - "suggest": { - "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", - "ext-bcmath": "Used for unit conversion and imagecrash protection", - "ext-iconv": "Converts text to and from non-UTF-8 encodings", - "ext-tidy": "Used for pretty-printing HTML" - }, - "type": "library", - "autoload": { - "files": [ - "library/HTMLPurifier.composer.php" - ], - "psr-0": { - "HTMLPurifier": "library/" - }, - "exclude-from-classmap": [ - "/library/HTMLPurifier/Language/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "support": { - "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" - }, - "time": "2023-11-17T15:01:25+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "64f3265002e9e181436942aac2fbd482e186dc55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/64f3265002e9e181436942aac2fbd482e186dc55", - "reference": "64f3265002e9e181436942aac2fbd482e186dc55", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "default-branch": true, - "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2022-06-19T18:08:39+00:00" - }, - { - "name": "psr/container", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "707984727bd5b2b670e59559d3ed2500240cf875" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/707984727bd5b2b670e59559d3ed2500240cf875", - "reference": "707984727bd5b2b670e59559d3ed2500240cf875", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container" - }, - "time": "2023-09-22T11:11:30+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", - "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "suggest": { - "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "source": "https://github.com/php-fig/event-dispatcher" - }, - "time": "2024-03-17T21:29:03+00:00" - }, - { - "name": "psr/log", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" - }, - "time": "2021-07-14T16:46:02+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/mailer", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "76326421d44c07f7824b19487cfbf87870b37efc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/76326421d44c07f7824b19487cfbf87870b37efc", - "reference": "76326421d44c07f7824b19487cfbf87870b37efc", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", - "psr/event-dispatcher": "^1", - "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mailer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps sending emails", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/mailer/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/mime", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "5a659bac90eba7e8eda6bd5e8b0cf13443b6f8fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5a659bac90eba7e8eda6bd5e8b0cf13443b6f8fb", - "reference": "5a659bac90eba7e8eda6bd5e8b0cf13443b6f8fb", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", - "symfony/serializer": "<6.4.3|>7.0,<7.0.3" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-03T06:42:25+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "872bf457bc23bdabf298c0246acf98abe3ed1493" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/872bf457bc23bdabf298c0246acf98abe3ed1493", - "reference": "872bf457bc23bdabf298c0246acf98abe3ed1493", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-19T06:31:17+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "098e36a5b73de12beeb5ac17e80abf3696f7ad5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/098e36a5b73de12beeb5ac17e80abf3696f7ad5f", - "reference": "098e36a5b73de12beeb5ac17e80abf3696f7ad5f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "06b6fc633edab1c62fe2ad67ee3fe343938f846f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/06b6fc633edab1c62fe2ad67ee3fe343938f846f", - "reference": "06b6fc633edab1c62fe2ad67ee3fe343938f846f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-19T06:31:17+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "yiisoft/yii2", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-framework.git", - "reference": "23e546d383b0b6da9810caa9684c798c2a35c8d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/23e546d383b0b6da9810caa9684c798c2a35c8d8", - "reference": "23e546d383b0b6da9810caa9684c798c2a35c8d8", - "shasum": "" - }, - "require": { - "bower-asset/inputmask": "^5.0.8 ", - "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", - "bower-asset/punycode": "^2.2", - "bower-asset/yii2-pjax": "~2.0.1", - "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", - "ext-ctype": "*", - "ext-mbstring": "*", - "ezyang/htmlpurifier": "^4.17", - "lib-pcre": "*", - "paragonie/random_compat": ">=1", - "php": ">=7.3.0", - "yiisoft/yii2-composer": "~2.0.4" - }, - "default-branch": true, - "bin": [ - "yii" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com", - "homepage": "https://www.yiiframework.com/", - "role": "Founder and project lead" - }, - { - "name": "Alexander Makarov", - "email": "sam@rmcreative.ru", - "homepage": "https://rmcreative.ru/", - "role": "Core framework development" - }, - { - "name": "Maurizio Domba", - "homepage": "http://mdomba.info/", - "role": "Core framework development" - }, - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "https://www.cebe.cc/", - "role": "Core framework development" - }, - { - "name": "Timur Ruziev", - "email": "resurtm@gmail.com", - "homepage": "http://resurtm.com/", - "role": "Core framework development" - }, - { - "name": "Paul Klimov", - "email": "klimov.paul@gmail.com", - "role": "Core framework development" - }, - { - "name": "Dmitry Naumenko", - "email": "d.naumenko.a@gmail.com", - "role": "Core framework development" - }, - { - "name": "Boudewijn Vahrmeijer", - "email": "info@dynasource.eu", - "homepage": "http://dynasource.eu", - "role": "Core framework development" - } - ], - "description": "Yii PHP Framework Version 2", - "homepage": "https://www.yiiframework.com/", - "keywords": [ - "framework", - "yii2" - ], - "support": { - "forum": "https://forum.yiiframework.com/", - "irc": "ircs://irc.libera.chat:6697/yii", - "issues": "https://github.com/yiisoft/yii2/issues?state=open", - "source": "https://github.com/yiisoft/yii2", - "wiki": "https://www.yiiframework.com/wiki" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:13:26+00:00" - }, - { - "name": "yiisoft/yii2-bootstrap5", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-bootstrap5.git", - "reference": "1a4f4d66c9ef3a076dc327999f8dc8b52caa5ac0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap5/zipball/1a4f4d66c9ef3a076dc327999f8dc8b52caa5ac0", - "reference": "1a4f4d66c9ef3a076dc327999f8dc8b52caa5ac0", - "shasum": "" - }, - "require": { - "bower-asset/bootstrap": "^5.1.0", - "ext-json": "*", - "php": ">=7.0", - "yiisoft/yii2": "^2.0.42" - }, - "require-dev": { - "phpunit/phpunit": "^6.5.14", - "twbs/bootstrap-icons": "^1.7.2", - "yiisoft/yii2-coding-standards": "~2.0" - }, - "suggest": { - "twbs/bootstrap-icons": "Add this package to the `require` section of your `composer.json` if you'd like to use the bootstrap icon asset." - }, - "default-branch": true, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "bootstrap": "yii\\bootstrap5\\i18n\\TranslationBootstrap" - }, - "autoload": { - "psr-4": { - "yii\\bootstrap5\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sergey Zhukovskiy", - "email": "mylistryx@gmail.com", - "homepage": "https://net23.ru/" - }, - { - "name": "Simon Karlen", - "email": "simi.albi@outlook.com" - } - ], - "description": "The Twitter Bootstrap v5 extension for the Yii framework", - "keywords": [ - "bootstrap", - "bootstrap5", - "yii2" - ], - "support": { - "issues": "https://github.com/yiisoft/yii2-bootstrap5/issues", - "source": "https://github.com/yiisoft/yii2-bootstrap5" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-bootstrap5", - "type": "tidelift" - } - ], - "time": "2023-10-20T14:56:35+00:00" - }, - { - "name": "yiisoft/yii2-composer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-composer.git", - "reference": "2cd6eee19e94b9e98f3516340138041683350fcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/2cd6eee19e94b9e98f3516340138041683350fcf", - "reference": "2cd6eee19e94b9e98f3516340138041683350fcf", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 | ^2.0" - }, - "require-dev": { - "composer/composer": "^1.0 | ^2.0@dev", - "phpunit/phpunit": "<7" - }, - "default-branch": true, - "type": "composer-plugin", - "extra": { - "class": "yii\\composer\\Plugin", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\composer\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - }, - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc" - } - ], - "description": "The composer plugin for Yii extension installer", - "keywords": [ - "composer", - "extension installer", - "yii2" - ], - "support": { - "forum": "https://www.yiiframework.com/forum/", - "irc": "ircs://irc.libera.chat:6697/yii", - "issues": "https://github.com/yiisoft/yii2-composer/issues", - "source": "https://github.com/yiisoft/yii2-composer", - "wiki": "https://www.yiiframework.com/wiki/" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-composer", - "type": "tidelift" - } - ], - "time": "2023-09-17T09:06:53+00:00" - }, - { - "name": "yiisoft/yii2-symfonymailer", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-symfonymailer.git", - "reference": "82f5902551a160633c4734b5096977ce76a809d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-symfonymailer/zipball/82f5902551a160633c4734b5096977ce76a809d9", - "reference": "82f5902551a160633c4734b5096977ce76a809d9", - "shasum": "" - }, - "require": { - "php": ">=7.4.0", - "symfony/mailer": ">=5.4.0", - "yiisoft/yii2": ">=2.0.4" - }, - "require-dev": { - "phpunit/phpunit": "9.5.10" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\symfonymailer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kirill Petrov", - "email": "archibeardrinker@gmail.com" - } - ], - "description": "The SymfonyMailer integration for the Yii framework", - "keywords": [ - "email", - "mail", - "mailer", - "symfony", - "symfonymailer", - "yii2" - ], - "support": { - "forum": "http://www.yiiframework.com/forum/", - "irc": "irc://irc.freenode.net/yii", - "issues": "https://github.com/yiisoft/yii2-symfonymailer/issues", - "source": "https://github.com/yiisoft/yii2-symfonymailer", - "wiki": "http://www.yiiframework.com/wiki/" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-symfonymailer", - "type": "tidelift" - } - ], - "time": "2022-09-04T10:48:21+00:00" - } - ], - "packages-dev": [ - { - "name": "behat/gherkin", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Behat/Gherkin.git", - "reference": "01379b1f9bc67a9040a472d069f1ee34cbe1b1b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/01379b1f9bc67a9040a472d069f1ee34cbe1b1b3", - "reference": "01379b1f9bc67a9040a472d069f1ee34cbe1b1b3", - "shasum": "" - }, - "require": { - "php": "~7.2|~8.0" - }, - "require-dev": { - "cucumber/cucumber": "dev-gherkin-24.0.0", - "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5" - }, - "suggest": { - "symfony/yaml": "If you want to parse features, represented in YAML files" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - } - ], - "description": "Gherkin DSL parser for PHP", - "homepage": "http://behat.org/", - "keywords": [ - "BDD", - "Behat", - "Cucumber", - "DSL", - "gherkin", - "parser" - ], - "support": { - "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/master" - }, - "time": "2022-07-07T14:25:02+00:00" - }, - { - "name": "codeception/codeception", - "version": "5.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Codeception.git", - "reference": "9909ac7bf747618abb60cca6add0aeb2dec30930" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9909ac7bf747618abb60cca6add0aeb2dec30930", - "reference": "9909ac7bf747618abb60cca6add0aeb2dec30930", - "shasum": "" - }, - "require": { - "behat/gherkin": "^4.6.2", - "codeception/lib-asserts": "^2.0", - "codeception/stub": "^4.1", - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.1", - "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", - "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", - "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", - "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", - "psy/psysh": "^0.11.2 || ^0.12", - "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", - "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", - "symfony/console": ">=4.4.24 <8.0", - "symfony/css-selector": ">=4.4.24 <8.0", - "symfony/event-dispatcher": ">=4.4.24 <8.0", - "symfony/finder": ">=4.4.24 <8.0", - "symfony/var-dumper": ">=4.4.24 <8.0", - "symfony/yaml": ">=4.4.24 <8.0" - }, - "conflict": { - "codeception/lib-innerbrowser": "<3.1.3", - "codeception/module-filesystem": "<3.0", - "codeception/module-phpbrowser": "<2.5" - }, - "replace": { - "codeception/phpunit-wrapper": "*" - }, - "require-dev": { - "codeception/lib-innerbrowser": "*@dev", - "codeception/lib-web": "^1.0", - "codeception/module-asserts": "*@dev", - "codeception/module-cli": "*@dev", - "codeception/module-db": "*@dev", - "codeception/module-filesystem": "*@dev", - "codeception/module-phpbrowser": "*@dev", - "codeception/util-universalframework": "*@dev", - "ext-simplexml": "*", - "jetbrains/phpstorm-attributes": "^1.0", - "symfony/dotenv": ">=4.4.24 <8.0", - "symfony/process": ">=4.4.24 <8.0", - "vlucas/phpdotenv": "^5.1" - }, - "suggest": { - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "ext-simplexml": "For loading params from XML files", - "stecman/symfony-console-completion": "For BASH autocompletion", - "symfony/dotenv": "For loading params from .env files", - "symfony/phpunit-bridge": "For phpunit-bridge support", - "vlucas/phpdotenv": "For loading params from .env files" - }, - "bin": [ - "codecept" - ], - "type": "library", - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Codeception\\": "src/Codeception", - "Codeception\\Extension\\": "ext" - }, - "classmap": [ - "src/PHPUnit/TestCase.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert.ua@gmail.com", - "homepage": "https://codeception.com" - } - ], - "description": "BDD-style testing framework", - "homepage": "https://codeception.com/", - "keywords": [ - "BDD", - "TDD", - "acceptance testing", - "functional testing", - "unit testing" - ], - "support": { - "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.2" - }, - "funding": [ - { - "url": "https://opencollective.com/codeception", - "type": "open_collective" - } - ], - "time": "2024-06-11T20:26:44+00:00" - }, - { - "name": "codeception/lib-asserts", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/Codeception/lib-asserts.git", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", - "shasum": "" - }, - "require": { - "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", - "ext-dom": "*", - "php": "^7.4 | ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" - }, - { - "name": "Gintautas Miselis" - }, - { - "name": "Gustavo Nieves", - "homepage": "https://medium.com/@ganieves" - } - ], - "description": "Assertion methods used by Codeception core and Asserts module", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception" - ], - "support": { - "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" - }, - "time": "2023-02-10T18:36:23+00:00" - }, - { - "name": "codeception/lib-innerbrowser", - "version": "3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/Codeception/lib-innerbrowser.git", - "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", - "reference": "10482f7e34c0537bf5b87bc82a3d65a1842a8b4f", - "shasum": "" - }, - "require": { - "codeception/codeception": "^5.0", - "codeception/lib-web": "^1.0.1", - "ext-dom": "*", - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "^4.4.24 || ^5.4 || ^6.0", - "symfony/dom-crawler": "^4.4.30 || ^5.4 || ^6.0" - }, - "require-dev": { - "codeception/util-universalframework": "dev-master" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "https://codegyre.com" - }, - { - "name": "Gintautas Miselis" - } - ], - "description": "Parent library for all Codeception framework modules and PhpBrowser", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception" - ], - "support": { - "issues": "https://github.com/Codeception/lib-innerbrowser/issues", - "source": "https://github.com/Codeception/lib-innerbrowser/tree/3.1.3" - }, - "time": "2022-10-03T15:33:34+00:00" - }, - { - "name": "codeception/lib-web", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/Codeception/lib-web.git", - "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", - "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "guzzlehttp/psr7": "^2.0", - "php": "^8.0", - "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", - "symfony/css-selector": ">=4.4.24 <8.0" - }, - "conflict": { - "codeception/codeception": "<5.0.0-alpha3" - }, - "require-dev": { - "php-webdriver/webdriver": "^1.12" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gintautas Miselis" - } - ], - "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception" - ], - "support": { - "issues": "https://github.com/Codeception/lib-web/issues", - "source": "https://github.com/Codeception/lib-web/tree/1.0.6" - }, - "time": "2024-02-06T20:50:08+00:00" - }, - { - "name": "codeception/module-asserts", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/Codeception/module-asserts.git", - "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", - "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", - "shasum": "" - }, - "require": { - "codeception/codeception": "*@dev", - "codeception/lib-asserts": "^2.0", - "php": "^8.0" - }, - "conflict": { - "codeception/codeception": "<5.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk" - }, - { - "name": "Gintautas Miselis" - }, - { - "name": "Gustavo Nieves", - "homepage": "https://medium.com/@ganieves" - } - ], - "description": "Codeception module containing various assertions", - "homepage": "https://codeception.com/", - "keywords": [ - "assertions", - "asserts", - "codeception" - ], - "support": { - "issues": "https://github.com/Codeception/module-asserts/issues", - "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" - }, - "time": "2022-02-16T19:48:08+00:00" - }, - { - "name": "codeception/module-filesystem", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/Codeception/module-filesystem.git", - "reference": "0fd78cf941cb72dc2a650c6132c5999c26ad4f9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/0fd78cf941cb72dc2a650c6132c5999c26ad4f9a", - "reference": "0fd78cf941cb72dc2a650c6132c5999c26ad4f9a", - "shasum": "" - }, - "require": { - "codeception/codeception": "*@dev", - "php": "^8.0", - "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" - }, - "conflict": { - "codeception/codeception": "<5.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk" - }, - { - "name": "Gintautas Miselis" - } - ], - "description": "Codeception module for testing local filesystem", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception", - "filesystem" - ], - "support": { - "issues": "https://github.com/Codeception/module-filesystem/issues", - "source": "https://github.com/Codeception/module-filesystem/tree/3.0.1" - }, - "time": "2023-12-08T19:23:28+00:00" - }, - { - "name": "codeception/module-yii2", - "version": "1.1.10", - "source": { - "type": "git", - "url": "https://github.com/Codeception/module-yii2.git", - "reference": "2971f1fb44cd3088f7ecbe78bc51161c037a6551" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-yii2/zipball/2971f1fb44cd3088f7ecbe78bc51161c037a6551", - "reference": "2971f1fb44cd3088f7ecbe78bc51161c037a6551", - "shasum": "" - }, - "require": { - "codeception/codeception": "^5.0.8", - "codeception/lib-innerbrowser": "^3.0 | ^4.0", - "php": "^8.0" - }, - "require-dev": { - "codeception/module-asserts": "^3.0", - "codeception/module-filesystem": "^3.0", - "codeception/verify": "^3.0", - "codemix/yii2-localeurls": "^1.7", - "yiisoft/yii2": "dev-master", - "yiisoft/yii2-app-advanced": "dev-master" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander Makarov" - }, - { - "name": "Sam Mouse" - }, - { - "name": "Michael Bodnarchuk" - } - ], - "description": "Codeception module for Yii2 framework", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception", - "yii2" - ], - "support": { - "issues": "https://github.com/Codeception/module-yii2/issues", - "source": "https://github.com/Codeception/module-yii2/tree/1.1.10" - }, - "time": "2023-12-04T09:18:47+00:00" - }, - { - "name": "codeception/stub", - "version": "4.1.3", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Stub.git", - "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", - "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", - "shasum": "" - }, - "require": { - "php": "^7.4 | ^8.0", - "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" - }, - "conflict": { - "codeception/codeception": "<5.0.6" - }, - "require-dev": { - "consolidation/robo": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Codeception\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "support": { - "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.3" - }, - "time": "2024-02-02T19:21:00+00:00" - }, - { - "name": "codeception/verify", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Verify.git", - "reference": "25b84a96f0fe7dcf28e8021f02b57643b751a707" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Verify/zipball/25b84a96f0fe7dcf28e8021f02b57643b751a707", - "reference": "25b84a96f0fe7dcf28e8021f02b57643b751a707", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": "^7.4 || ^8.0", - "phpunit/phpunit": "^9.5 | ^10.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/Codeception/bootstrap.php" - ], - "psr-4": { - "Codeception\\": "src\\Codeception" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@codeception.com" - }, - { - "name": "Gustavo Nieves", - "homepage": "https://medium.com/@ganieves" - } - ], - "description": "BDD assertion library for PHPUnit", - "support": { - "issues": "https://github.com/Codeception/Verify/issues", - "source": "https://github.com/Codeception/Verify/tree/3.0.0" - }, - "time": "2023-02-09T07:33:00+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "9955122a490d18ce723cf9014b196c126222c180" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/9955122a490d18ce723cf9014b196c126222c180", - "reference": "9955122a490d18ce723cf9014b196c126222c180", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.4" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2024-05-05T15:09:38+00:00" - }, - { - "name": "fakerphp/faker", - "version": "1.23.x-dev", - "source": { - "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "doctrine/persistence": "^1.3 || ^2.0", - "ext-intl": "*", - "phpunit/phpunit": "^9.5.26", - "symfony/phpunit-bridge": "^5.4.16" - }, - "suggest": { - "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." - }, - "type": "library", - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/1.23" - }, - "time": "2024-01-02T13:46:09+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.6.x-dev", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a243f80a1ca7fe8ceed4deee17f12c1930efe662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a243f80a1ca7fe8ceed4deee17f12c1930efe662", - "reference": "a243f80a1ca7fe8ceed4deee17f12c1930efe662", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "default-branch": true, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2024-03-31T10:09:24+00:00" - }, - { - "name": "masterminds/html5", - "version": "2.9.0", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" - }, - "time": "2024-03-31T07:05:07+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "default-branch": true, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:39:25+00:00" - }, - { - "name": "nikic/php-parser", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "3ef0811e45ba7e91fb0f066af5af7d52c3b24469" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3ef0811e45ba7e91fb0f066af5af7d52c3b24469", - "reference": "3ef0811e45ba7e91fb0f066af5af7d52c3b24469", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "default-branch": true, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/master" - }, - "time": "2024-06-12T18:31:58+00:00" - }, - { - "name": "phar-io/manifest", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpspec/php-diff", - "version": "v1.1.3", - "source": { - "type": "git", - "url": "https://github.com/phpspec/php-diff.git", - "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/fc1156187f9f6c8395886fe85ed88a0a245d72e9", - "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9", - "shasum": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Diff": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Chris Boulton", - "homepage": "http://github.com/chrisboulton" - } - ], - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "support": { - "source": "https://github.com/phpspec/php-diff/tree/v1.1.3" - }, - "time": "2020-09-18T13:47:07+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "3352293d9e91513d5508c415835014881b420218" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/3352293d9e91513d5508c415835014881b420218", - "reference": "3352293d9e91513d5508c415835014881b420218", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T05:16:32+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "38b24367e1b340aa78b96d7cab042942d917bb84" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/38b24367e1b340aa78b96d7cab042942d917bb84", - "reference": "38b24367e1b340aa78b96d7cab042942d917bb84", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-02-11T16:23:04+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.28", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2023-01-14T12:32:24+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psy/psysh", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "^5.0 || ^4.0", - "php": "^8.0 || ^7.4", - "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" - }, - "conflict": { - "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." - }, - "default-branch": true, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - }, - "bamarni-bin": { - "bin-links": false, - "forward-command": false - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" - }, - "time": "2024-06-10T01:18:23+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:27:43+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "b247957a1c8dc81a671770f74b479c0a78a818f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b247957a1c8dc81a671770f74b479c0a78a818f1", - "reference": "b247957a1c8dc81a671770f74b479c0a78a818f1", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-09-14T12:46:14+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:19:30+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:30:58+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:03:51+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:33:00+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T06:35:11+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:20:34+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25", - "reference": "ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/main" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-14T18:47:08+00:00" - }, - { - "name": "sebastian/type", - "version": "3.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:13:03+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "symfony/browser-kit", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/62ab90b92066ef6cce5e79365625b4b1432464c8", - "reference": "62ab90b92066ef6cce5e79365625b4b1432464c8", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0|^7.0" - }, - "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/browser-kit/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/console", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/be5854cee0e8c7b110f00d695d11debdfa1a2a91", - "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/css-selector", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Converts CSS selectors to XPath expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/dom-crawler", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "105b56a0305d219349edeb60a800082eca864e4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/105b56a0305d219349edeb60a800082eca864e4b", - "reference": "105b56a0305d219349edeb60a800082eca864e4b", - "shasum": "" - }, - "require": { - "masterminds/html5": "^2.6", - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases DOM navigation for HTML and XML documents", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dom-crawler/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/finder", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/filesystem": "^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "0a1df740cbb01859ce1bac85b0ad58ffe02f69b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/0a1df740cbb01859ce1bac85b0ad58ffe02f69b6", - "reference": "0a1df740cbb01859ce1bac85b0ad58ffe02f69b6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-19T06:31:17+00:00" - }, - { - "name": "symfony/string", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "04753031ec588aff2d77d5851192d0c4a9686e95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/04753031ec588aff2d77d5851192d0c4a9686e95", - "reference": "04753031ec588aff2d77d5851192d0c4a9686e95", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-04T06:37:32+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad23ca4312395f0a8a8633c831ef4c4ee542ed25", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<5.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "symfony/yaml", - "version": "6.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.4" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/6.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:49:08+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - }, - { - "name": "yiisoft/yii2-debug", - "version": "2.1.25", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-debug.git", - "reference": "4d011b9bfc83bde71cde43c9f6837f5a74685ea7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/4d011b9bfc83bde71cde43c9f6837f5a74685ea7", - "reference": "4d011b9bfc83bde71cde43c9f6837f5a74685ea7", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.4", - "yiisoft/yii2": "~2.0.13" - }, - "require-dev": { - "cweagans/composer-patches": "^1.7", - "phpunit/phpunit": "4.8.34", - "yiisoft/yii2-coding-standards": "~2.0", - "yiisoft/yii2-swiftmailer": "*" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "composer-exit-on-patch-failure": true, - "patches": { - "phpunit/phpunit-mock-objects": { - "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" - }, - "phpunit/phpunit": { - "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", - "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", - "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" - } - } - }, - "autoload": { - "psr-4": { - "yii\\debug\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - }, - { - "name": "Simon Karlen", - "email": "simi.albi@outlook.com" - } - ], - "description": "The debugger extension for the Yii framework", - "keywords": [ - "debug", - "debugger", - "yii2" - ], - "support": { - "forum": "http://www.yiiframework.com/forum/", - "irc": "irc://irc.freenode.net/yii", - "issues": "https://github.com/yiisoft/yii2-debug/issues", - "source": "https://github.com/yiisoft/yii2-debug", - "wiki": "http://www.yiiframework.com/wiki/" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-debug", - "type": "tidelift" - } - ], - "time": "2023-09-26T15:50:00+00:00" - }, - { - "name": "yiisoft/yii2-faker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-faker.git", - "reference": "e269bfd508588b8dbc2a70b852e4a0e37e31afea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/e269bfd508588b8dbc2a70b852e4a0e37e31afea", - "reference": "e269bfd508588b8dbc2a70b852e4a0e37e31afea", - "shasum": "" - }, - "require": { - "fakerphp/faker": "~1.9|~1.10", - "yiisoft/yii2": "~2.0.0" - }, - "require-dev": { - "cweagans/composer-patches": "^1.7", - "phpunit/phpunit": "4.8.34" - }, - "default-branch": true, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "composer-exit-on-patch-failure": true, - "patches": { - "phpunit/phpunit-mock-objects": { - "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" - }, - "phpunit/phpunit": { - "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", - "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch" - } - } - }, - "autoload": { - "psr-4": { - "yii\\faker\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Mark Jebri", - "email": "mark.github@yandex.ru" - } - ], - "description": "Fixture generator. The Faker integration for the Yii framework.", - "keywords": [ - "Fixture", - "faker", - "yii2" - ], - "support": { - "forum": "https://www.yiiframework.com/forum/", - "irc": "ircs://irc.libera.chat:6697/yii", - "issues": "https://github.com/yiisoft/yii2-faker/issues", - "source": "https://github.com/yiisoft/yii2-faker", - "wiki": "https://www.yiiframework.com/wiki/" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-faker", - "type": "tidelift" - } - ], - "time": "2024-01-01T19:37:09+00:00" - }, - { - "name": "yiisoft/yii2-gii", - "version": "2.2.6", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-gii.git", - "reference": "ac574e7e2c29fd865145c8688719f252d19aae23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/ac574e7e2c29fd865145c8688719f252d19aae23", - "reference": "ac574e7e2c29fd865145c8688719f252d19aae23", - "shasum": "" - }, - "require": { - "phpspec/php-diff": "^1.1.0", - "yiisoft/yii2": "~2.0.46" - }, - "require-dev": { - "cweagans/composer-patches": "^1.7", - "phpunit/phpunit": "4.8.34", - "yiisoft/yii2-coding-standards": "~2.0" - }, - "type": "yii2-extension", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - }, - "composer-exit-on-patch-failure": true, - "patches": { - "phpunit/phpunit-mock-objects": { - "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" - }, - "phpunit/php-file-iterator": { - "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch" - }, - "phpunit/phpunit": { - "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", - "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", - "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" - } - } - }, - "autoload": { - "psr-4": { - "yii\\gii\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The Gii extension for the Yii framework", - "keywords": [ - "code generator", - "gii", - "yii2" - ], - "support": { - "forum": "https://www.yiiframework.com/forum/", - "irc": "irc://irc.freenode.net/yii", - "issues": "https://github.com/yiisoft/yii2-gii/issues", - "source": "https://github.com/yiisoft/yii2-gii", - "wiki": "https://www.yiiframework.com/wiki/" - }, - "funding": [ - { - "url": "https://github.com/yiisoft", - "type": "github" - }, - { - "url": "https://opencollective.com/yiisoft", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-gii", - "type": "tidelift" - } - ], - "time": "2023-05-22T20:55:37+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.4.0" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/docker/logs/nginx/access.log b/docker/logs/nginx/access.log index 3a8a42d..bf870f3 100644 --- a/docker/logs/nginx/access.log +++ b/docker/logs/nginx/access.log @@ -6,3 +6,13 @@ 192.168.65.1 - - [13/Jun/2024:16:49:29 +0300] "GET /assets/f5fa1b4e/jquery.js HTTP/1.1" 200 285314 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" 192.168.65.1 - - [13/Jun/2024:16:49:29 +0300] "GET /assets/e5b7c8da/yii.js HTTP/1.1" 200 20981 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" 192.168.65.1 - - [13/Jun/2024:16:49:29 +0300] "GET /assets/46f1484b/dist/js/bootstrap.bundle.js HTTP/1.1" 200 207819 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:12:31 +0300] "GET / HTTP/1.1" 200 1545 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:12:31 +0300] "GET /assets/f5fa1b4e/jquery.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:12:31 +0300] "GET /assets/46f1484b/dist/css/bootstrap.css HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:12:31 +0300] "GET /assets/e5b7c8da/yii.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:12:31 +0300] "GET /assets/46f1484b/dist/js/bootstrap.bundle.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:15:11 +0300] "GET / HTTP/1.1" 200 1545 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:15:11 +0300] "GET /assets/46f1484b/dist/css/bootstrap.css HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:15:11 +0300] "GET /assets/f5fa1b4e/jquery.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:15:11 +0300] "GET /assets/e5b7c8da/yii.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" +192.168.65.1 - - [13/Jun/2024:17:15:11 +0300] "GET /assets/46f1484b/dist/js/bootstrap.bundle.js HTTP/1.1" 304 0 "http://web.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" diff --git a/environments/stage/backend/config/codeception-local.php b/environments/stage/backend/config/codeception-local.php new file mode 100644 index 0000000..2d875dd --- /dev/null +++ b/environments/stage/backend/config/codeception-local.php @@ -0,0 +1,11 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; + +if (!YII_ENV_TEST) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => \yii\debug\Module::class, + ]; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => \yii\gii\Module::class, + ]; +} + +return $config; diff --git a/environments/stage/backend/config/params-local.php b/environments/stage/backend/config/params-local.php new file mode 100644 index 0000000..b625128 --- /dev/null +++ b/environments/stage/backend/config/params-local.php @@ -0,0 +1,4 @@ +run(); diff --git a/environments/stage/backend/web/index.php b/environments/stage/backend/web/index.php new file mode 100644 index 0000000..d0b6601 --- /dev/null +++ b/environments/stage/backend/web/index.php @@ -0,0 +1,18 @@ +run(); diff --git a/environments/stage/backend/web/robots.txt b/environments/stage/backend/web/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/environments/stage/backend/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/environments/stage/common/config/codeception-local.php b/environments/stage/common/config/codeception-local.php new file mode 100644 index 0000000..654f801 --- /dev/null +++ b/environments/stage/common/config/codeception-local.php @@ -0,0 +1,16 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], + ] +); diff --git a/environments/stage/common/config/main-local.php b/environments/stage/common/config/main-local.php new file mode 100644 index 0000000..495f4c8 --- /dev/null +++ b/environments/stage/common/config/main-local.php @@ -0,0 +1,43 @@ + [ + 'db' => [ + 'class' => \yii\db\Connection::class, + 'dsn' => 'mysql:host=localhost;dbname=web', + 'username' => 'root', + 'password' => 'root', + 'charset' => 'utf8', + ], + 'mailer' => [ + 'class' => \yii\symfonymailer\Mailer::class, + 'viewPath' => '@common/mail', + // send all mails to a file by default. + 'useFileTransport' => true, + // You have to set + // + // 'useFileTransport' => false, + // + // and configure a transport for the mailer to send real emails. + // + // SMTP server example: + // 'transport' => [ + // 'scheme' => 'smtps', + // 'host' => '', + // 'username' => '', + // 'password' => '', + // 'port' => 465, + // 'dsn' => 'native://default', + // ], + // + // DSN example: + // 'transport' => [ + // 'dsn' => 'smtp://user:pass@smtp.example.com:25', + // ], + // + // See: https://symfony.com/doc/current/mailer.html#using-built-in-transports + // Or if you use a 3rd party service, see: + // https://symfony.com/doc/current/mailer.html#using-a-3rd-party-transport + ], + ], +]; diff --git a/environments/stage/common/config/params-local.php b/environments/stage/common/config/params-local.php new file mode 100644 index 0000000..b625128 --- /dev/null +++ b/environments/stage/common/config/params-local.php @@ -0,0 +1,4 @@ + [ + 'db' => [ + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced_test', + ], + ], +]; diff --git a/environments/stage/console/config/main-local.php b/environments/stage/console/config/main-local.php new file mode 100644 index 0000000..a3246e0 --- /dev/null +++ b/environments/stage/console/config/main-local.php @@ -0,0 +1,8 @@ + ['gii'], + 'modules' => [ + 'gii' => 'yii\gii\Module', + ], +]; diff --git a/environments/stage/console/config/params-local.php b/environments/stage/console/config/params-local.php new file mode 100644 index 0000000..b625128 --- /dev/null +++ b/environments/stage/console/config/params-local.php @@ -0,0 +1,4 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; + +if (!YII_ENV_TEST) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => \yii\debug\Module::class, + ]; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => \yii\gii\Module::class, + ]; +} + +return $config; diff --git a/environments/stage/frontend/config/params-local.php b/environments/stage/frontend/config/params-local.php new file mode 100644 index 0000000..b625128 --- /dev/null +++ b/environments/stage/frontend/config/params-local.php @@ -0,0 +1,4 @@ +run(); diff --git a/environments/stage/frontend/web/index.php b/environments/stage/frontend/web/index.php new file mode 100644 index 0000000..d0b6601 --- /dev/null +++ b/environments/stage/frontend/web/index.php @@ -0,0 +1,18 @@ +run(); diff --git a/environments/stage/frontend/web/robots.txt b/environments/stage/frontend/web/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/environments/stage/frontend/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/environments/stage/yii b/environments/stage/yii new file mode 100644 index 0000000..b93b5cf --- /dev/null +++ b/environments/stage/yii @@ -0,0 +1,24 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/environments/stage/yii_test b/environments/stage/yii_test new file mode 100644 index 0000000..63a4e7a --- /dev/null +++ b/environments/stage/yii_test @@ -0,0 +1,28 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/environments/stage/yii_test.bat b/environments/stage/yii_test.bat new file mode 100644 index 0000000..29fbbea --- /dev/null +++ b/environments/stage/yii_test.bat @@ -0,0 +1,15 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii_test" %* + +@endlocal