Full Code of vania-dart/framework for AI

dev a8a5f382a506 cached
280 files
599.6 KB
157.8k tokens
1679 symbols
1 requests
Download .txt
Showing preview only (674K chars total). Download the full file or copy to clipboard to get everything.
Repository: vania-dart/framework
Branch: dev
Commit: a8a5f382a506
Files: 280
Total size: 599.6 KB

Directory structure:
gitextract_qi8hzr2l/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── documentation-issue.md
│   │   └── feature_request.md
│   ├── stale.yml
│   └── workflows/
│       └── vania-dart.yml
├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README.tr.md
├── analysis_options.yaml
├── example/
│   ├── app_exception_handler.dart
│   └── main.dart
├── lib/
│   ├── application.dart
│   ├── authentication.dart
│   ├── database.dart
│   ├── http/
│   │   ├── controller.dart
│   │   ├── form_validation.dart
│   │   ├── middleware.dart
│   │   ├── request.dart
│   │   └── response.dart
│   ├── mail.dart
│   ├── migration.dart
│   ├── orm/
│   │   └── model.dart
│   ├── query_builder.dart
│   ├── route.dart
│   ├── service_provider.dart
│   ├── src/
│   │   ├── authentication/
│   │   │   ├── authenticate.dart
│   │   │   ├── authentication.dart
│   │   │   ├── gate/
│   │   │   │   └── gate.dart
│   │   │   ├── has_api_tokens.dart
│   │   │   ├── model/
│   │   │   │   └── personal_access_token.dart
│   │   │   └── redirect_if_authenticated.dart
│   │   ├── aws/
│   │   │   └── s3_client.dart
│   │   ├── cache/
│   │   │   ├── cache.dart
│   │   │   ├── cache_driver.dart
│   │   │   ├── file_cache_driver.dart
│   │   │   └── redis_cache_driver.dart
│   │   ├── config/
│   │   │   ├── config.dart
│   │   │   ├── defined_regexp.dart
│   │   │   └── http_cors.dart
│   │   ├── container.dart
│   │   ├── contract/
│   │   │   ├── database/
│   │   │   │   ├── _connectors/
│   │   │   │   │   └── _database_connection.dart
│   │   │   │   └── query_builder/
│   │   │   │       ├── _bulk_operations_builder.dart
│   │   │   │       ├── _cte_builder.dart
│   │   │   │       ├── _delete_query_builder.dart
│   │   │   │       ├── _insert_query_builder.dart
│   │   │   │       ├── _join_clause_builder.dart
│   │   │   │       ├── _query_executor_builder.dart
│   │   │   │       ├── _select_query_builder.dart
│   │   │   │       ├── _union_clause_builder.dart
│   │   │   │       ├── _update_query_builder.dart
│   │   │   │       ├── _where_clauses_builder.dart
│   │   │   │       ├── _window_functions_builder.dart
│   │   │   │       └── query_builder.dart
│   │   │   ├── http/
│   │   │   │   └── request/
│   │   │   │       └── form_validation.dart
│   │   │   └── orm/
│   │   │       ├── morph_relation.dart
│   │   │       └── relation.dart
│   │   ├── cryptographic/
│   │   │   ├── hash.dart
│   │   │   └── vania_encryption.dart
│   │   ├── database/
│   │   │   ├── _connection_manager.dart
│   │   │   ├── _connectors/
│   │   │   │   ├── _database_connection_factory.dart
│   │   │   │   └── _database_connection_proxy.dart
│   │   │   ├── _database_utils/
│   │   │   │   ├── _db_config.dart
│   │   │   │   ├── _paginated_result.dart
│   │   │   │   ├── _raw_expression.dart
│   │   │   │   └── _singularize.dart
│   │   │   ├── adapters/
│   │   │   │   ├── _mysql_connector.dart
│   │   │   │   ├── _postgres_connector.dart
│   │   │   │   └── _sqlite_connector.dart
│   │   │   ├── db.dart
│   │   │   ├── isolate_db.dart
│   │   │   ├── migration/
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── grammar/
│   │   │   │   │   │   ├── mysql_grammar.dart
│   │   │   │   │   │   ├── postgresql_grammar.dart
│   │   │   │   │   │   ├── sql_grammar.dart
│   │   │   │   │   │   └── sqlite_grammar.dart
│   │   │   │   │   ├── mysql_adapter.dart
│   │   │   │   │   ├── postgresql_adapter.dart
│   │   │   │   │   └── sqlite_adapter.dart
│   │   │   │   ├── builders/
│   │   │   │   │   ├── column_definition.dart
│   │   │   │   │   ├── column_types.dart
│   │   │   │   │   ├── schema.dart
│   │   │   │   │   └── table_definition.dart
│   │   │   │   ├── contracts/
│   │   │   │   │   ├── database_adapter_interface.dart
│   │   │   │   │   ├── migration_connection_interface.dart
│   │   │   │   │   └── schema_interface.dart
│   │   │   │   ├── migration.dart
│   │   │   │   ├── migration_connection.dart
│   │   │   │   └── runners/
│   │   │   │       └── migration_runner.dart
│   │   │   ├── monitoring/
│   │   │   │   └── database_monitor.dart
│   │   │   ├── orm/
│   │   │   │   ├── belongs_to.dart
│   │   │   │   ├── belongs_to_many.dart
│   │   │   │   ├── has_many.dart
│   │   │   │   ├── has_one.dart
│   │   │   │   ├── model.dart
│   │   │   │   └── polymorphic/
│   │   │   │       ├── morph_many.dart
│   │   │   │       ├── morph_one.dart
│   │   │   │       ├── morph_to.dart
│   │   │   │       ├── morph_to_many.dart
│   │   │   │       └── morphed_by_many.dart
│   │   │   ├── query_builder/
│   │   │   │   ├── _bulk_operations_builder_impl.dart
│   │   │   │   ├── _cte/
│   │   │   │   │   ├── _cte_cache.dart
│   │   │   │   │   ├── _cte_configuration.dart
│   │   │   │   │   ├── _cte_definition.dart
│   │   │   │   │   ├── _cte_exception.dart
│   │   │   │   │   ├── _cte_feature.dart
│   │   │   │   │   ├── _database_type.dart
│   │   │   │   │   ├── _duplicate_cte_name_exception.dart
│   │   │   │   │   ├── _invalid_cte_configuration_exception.dart
│   │   │   │   │   ├── _sql_identifier_escaper.dart
│   │   │   │   │   ├── _standard_escaping_strategy.dart
│   │   │   │   │   └── _unsupported_cte_feature_exception.dart
│   │   │   │   ├── _cte_builder_impl.dart
│   │   │   │   ├── _delete_query_builder_impl.dart
│   │   │   │   ├── _insert_query_builder_impl.dart
│   │   │   │   ├── _join_clause_builder_impl.dart
│   │   │   │   ├── _query_builder_impl.dart
│   │   │   │   ├── _query_executor_builder_impl.dart
│   │   │   │   ├── _select_query_builder_impl.dart
│   │   │   │   ├── _union_clause_builder_impl.dart
│   │   │   │   ├── _update_query_builder_impl.dart
│   │   │   │   ├── _where_clauses_builder_impl.dart
│   │   │   │   └── _window_functions_builder_impl.dart
│   │   │   └── seeder/
│   │   │       ├── seeder.dart
│   │   │       ├── seeder_factory.dart
│   │   │       └── seeder_runner.dart
│   │   ├── enum/
│   │   │   ├── column_index.dart
│   │   │   └── http_request_method.dart
│   │   ├── env_handler/
│   │   │   └── env.dart
│   │   ├── exception/
│   │   │   ├── base_http_exception.dart
│   │   │   ├── database_exception.dart
│   │   │   ├── exception_handler.dart
│   │   │   ├── forbidden_exception.dart
│   │   │   ├── http_exception.dart
│   │   │   ├── internal_server_error.dart
│   │   │   ├── invalid_argument_exception.dart
│   │   │   ├── not_found_exception.dart
│   │   │   ├── page_expired_exception.dart
│   │   │   ├── query_exception.dart
│   │   │   ├── redirect_exception.dart
│   │   │   ├── throttle_exception.dart
│   │   │   ├── unauthenticated.dart
│   │   │   ├── unauthorized_exception.dart
│   │   │   └── validation_exception.dart
│   │   ├── extensions/
│   │   │   ├── date_time_extension.dart
│   │   │   ├── extensions.dart
│   │   │   ├── localization_extension.dart
│   │   │   ├── map_extension.dart
│   │   │   ├── number_extension.dart
│   │   │   ├── string_extension.dart
│   │   │   └── string_list_extension.dart
│   │   ├── http/
│   │   │   ├── controller/
│   │   │   │   ├── controller.dart
│   │   │   │   └── controller_handler.dart
│   │   │   ├── middleware/
│   │   │   │   ├── middleware.dart
│   │   │   │   ├── middleware_handler.dart
│   │   │   │   └── web_socket_middleware_handler.dart
│   │   │   ├── request/
│   │   │   │   ├── request.dart
│   │   │   │   ├── request_body.dart
│   │   │   │   ├── request_file.dart
│   │   │   │   ├── request_form_data.dart
│   │   │   │   └── request_handler.dart
│   │   │   ├── response/
│   │   │   │   ├── response.dart
│   │   │   │   └── stream_file.dart
│   │   │   ├── session/
│   │   │   │   ├── session_file_store.dart
│   │   │   │   └── session_manager.dart
│   │   │   └── validation/
│   │   │       ├── custom_validation_rule.dart
│   │   │       ├── field_validation.dart
│   │   │       ├── nested_validation.dart
│   │   │       ├── rules.dart
│   │   │       ├── validation_chain/
│   │   │       │   ├── export_chain_validation.dart
│   │   │       │   ├── rules/
│   │   │       │   │   ├── between.dart
│   │   │       │   │   ├── confirmed.dart
│   │   │       │   │   ├── end_width.dart
│   │   │       │   │   ├── greater_than.dart
│   │   │       │   │   ├── in_array.dart
│   │   │       │   │   ├── is_alpha.dart
│   │   │       │   │   ├── is_alpha_dash.dart
│   │   │       │   │   ├── is_alpha_numeric.dart
│   │   │       │   │   ├── is_array.dart
│   │   │       │   │   ├── is_boolean.dart
│   │   │       │   │   ├── is_date.dart
│   │   │       │   │   ├── is_double.dart
│   │   │       │   │   ├── is_email.dart
│   │   │       │   │   ├── is_file.dart
│   │   │       │   │   ├── is_image.dart
│   │   │       │   │   ├── is_integer.dart
│   │   │       │   │   ├── is_ip.dart
│   │   │       │   │   ├── is_json.dart
│   │   │       │   │   ├── is_numeric.dart
│   │   │       │   │   ├── is_required.dart
│   │   │       │   │   ├── is_string.dart
│   │   │       │   │   ├── is_url.dart
│   │   │       │   │   ├── is_uuid.dart
│   │   │       │   │   ├── lenght_between.dart
│   │   │       │   │   ├── less_than.dart
│   │   │       │   │   ├── max.dart
│   │   │       │   │   ├── max_lenght.dart
│   │   │       │   │   ├── min.dart
│   │   │       │   │   ├── min_lenght.dart
│   │   │       │   │   ├── not_in_array.dart
│   │   │       │   │   ├── required_if.dart
│   │   │       │   │   ├── required_if_not.dart
│   │   │       │   │   └── start_with.dart
│   │   │       │   ├── validation.dart
│   │   │       │   └── validation_rule.dart
│   │   │       ├── validation_item.dart
│   │   │       └── validator.dart
│   │   ├── ioc_container.dart
│   │   ├── localization_handler/
│   │   │   └── localization.dart
│   │   ├── logger/
│   │   │   └── logger.dart
│   │   ├── mail/
│   │   │   ├── content.dart
│   │   │   ├── envelope.dart
│   │   │   ├── mail.dart
│   │   │   ├── mail_view.dart
│   │   │   └── mailable.dart
│   │   ├── redis/
│   │   │   ├── command/
│   │   │   │   ├── client.dart
│   │   │   │   ├── codec.dart
│   │   │   │   └── commands.dart
│   │   │   ├── exception.dart
│   │   │   ├── lowlevel/
│   │   │   │   ├── protocol_client.dart
│   │   │   │   └── resp.dart
│   │   │   ├── redis.dart
│   │   │   └── vania_redis.dart
│   │   ├── route/
│   │   │   ├── middleware/
│   │   │   │   ├── csrf_middleware.dart
│   │   │   │   └── throttle.dart
│   │   │   ├── route.dart
│   │   │   ├── route_data.dart
│   │   │   ├── route_handler.dart
│   │   │   ├── route_history.dart
│   │   │   ├── router.dart
│   │   │   ├── set_static_path.dart
│   │   │   └── throttle_requests.dart
│   │   ├── server/
│   │   │   ├── base_http_server.dart
│   │   │   └── initialize_config.dart
│   │   ├── service/
│   │   │   └── service_provider.dart
│   │   ├── storage/
│   │   │   ├── local_storage.dart
│   │   │   ├── s3_storage.dart
│   │   │   ├── storage.dart
│   │   │   └── storage_driver.dart
│   │   ├── utils/
│   │   │   ├── _pluralize.dart
│   │   │   ├── functions.dart
│   │   │   ├── helper.dart
│   │   │   └── request_helper.dart
│   │   ├── view_engine/
│   │   │   ├── helper.dart
│   │   │   ├── processor_engine/
│   │   │   │   ├── abs_processor.dart
│   │   │   │   ├── assets_processor.dart
│   │   │   │   ├── comment_processor.dart
│   │   │   │   ├── csrf_processor.dart
│   │   │   │   ├── csrf_token_processor.dart
│   │   │   │   ├── error_processor.dart
│   │   │   │   ├── evaluate_expression.dart
│   │   │   │   ├── extends_processor.dart
│   │   │   │   ├── for_loop_processor.dart
│   │   │   │   ├── if_statement_processor.dart
│   │   │   │   ├── include_processor.dart
│   │   │   │   ├── old_processor.dart
│   │   │   │   ├── route_processor.dart
│   │   │   │   ├── section_processor.dart
│   │   │   │   ├── session_processor.dart
│   │   │   │   ├── switch_cases_processor.dart
│   │   │   │   ├── translate_processor.dart
│   │   │   │   └── variables_processor.dart
│   │   │   ├── template_engine.dart
│   │   │   └── template_reader.dart
│   │   └── websocket/
│   │       ├── web_socket_handler.dart
│   │       ├── websocket_client.dart
│   │       ├── websocket_constants.dart
│   │       ├── websocket_event.dart
│   │       └── websocket_session.dart
│   ├── vania.dart
│   └── websocket.dart
├── pubspec.yaml
└── test/
    ├── src/
    │   └── extensions/
    │       ├── date_time_extension_test.dart
    │       ├── number_extension_test.dart
    │       ├── string_extension_test.dart
    │       └── string_list_extension_test.dart
    └── unit/
        ├── hash_test.dart
        ├── route_test.dart
        └── validation_test.dart

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve Vania
title: "[BUG] - Short Description of Issue"
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environment (please complete the following information):** 
- Dart Version: [e.g. 2.10.5]
- Vania Version: [e.g. 1.0.3]
- Operating System: [e.g. Ubuntu 20.04, Windows 10]
- Database: [e.g. PostgreSQL version, MySQL version]
- Any other relevant backend services or middleware

**Additional context**
Add any other context about the problem here.

**Logs**
If applicable, include logs to help diagnose the issue.


================================================
FILE: .github/ISSUE_TEMPLATE/documentation-issue.md
================================================
---
name: Documentation Issue
about: Report errors, improvements, or suggestions for the documentation.
title: "[Documentation] - Brief description of the issue"
labels: documentation
assignees: ''

---

## Description
Provide a clear and concise description of the issue or suggestion with the documentation.

## Location
Link to the documentation page or specify the section where the issue occurs.

## Type of Issue
- [ ] Typo
- [ ] Inaccuracy
- [ ] Enhancement
- [ ] Other

## Suggested Resolution
Describe your suggested resolution, if you have one, or what you would expect to see.

## Additional Context
Add any other context or screenshots about the documentation issue here.

## Would you like to work on this issue?
- [ ] Yes
- [ ] No


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[Feature Request] - Brief Description of Feature"
labels: feature request
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/stale.yml
================================================
daysUntilStale: 60
daysUntilClose: 7
staleLabel: wontfix
exemptLabels:
  - bug
  - enhancement
  - feature request
markComment: >
  This issue has been automatically marked as stale because it has not had
  recent activity. It will be closed if no further activity occurs. Thank you
  for your contributions.
closeComment: false


================================================
FILE: .github/workflows/vania-dart.yml
================================================
name: Vania Dart

on:
  push:
    branches: [ "main", "dev"]
  pull_request:
    branches: [ "main", "dev"]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Setup Dart
        uses: dart-lang/setup-dart@v1.2
        with:
          sdk: stable

      # Get Flutter packages
      - name: Install dependencies
        run: dart pub get

      # Check formatting
      - name: Format check
        run: dart format --output=none --set-exit-if-changed .
        
      # Analyze the source code
      - name: Analyze project source
        run: dart analyze

      # Run tests
      - name: Run tests
        run: dart test


================================================
FILE: .gitignore
================================================
# https://dart.dev/guides/libraries/private-files
# Created by `dart pub`
.dart_tool/
.idea/
.vscode/

# Avoid committing pubspec.lock for library packages; see
# https://dart.dev/guides/libraries/private-files#pubspeclock.
pubspec.lock


================================================
FILE: CHANGELOG.md
================================================
## 1.1.1

- Fix(db): switch from mysql_dart to mysql_client to fix UTF-8 encoding issues
- Chore update dependencies

## 1.1.0

- Add(FormValidation): add support for request validation using FormValidation
- Add(RequestHelper): introduce helper methods for accessing query strings, IP, and request data
- Add(Database): add database health check for non-pooled connections
- Add(Validation): implement builder pattern for defining validation rules (e.g. `field('name').required().string()`)
- Update(Pagination): use `getParam()` for retrieving `page` parameter in pagination
- Fix(RequestFile): handle `List<int>` stream in RequestFile.store
- Improve(Exception): enhance exception handling and error messages

## 1.0.2+2

- Fix(querybuilder): fixed `postgres` params name

## 1.0.2+1

- Fix(querybuilder): remove unnecessary `update_` prefix from update bindings

## 1.0.2

- Fix(Cache): fixed cache issue
- Fix(Request): fix `hasFile()` and `has()` method behavior
- Add(Request): add `asList()` method to get the data as a List
- Add(CSRF): add `CSRF_PROTECTION_ENABLED` config to toggle CSRF protection

## 1.0.1

- Refactor(ORM): fix eager-loading for polymorphic relations (`MorphTo`, `MorphToMany`, `MorphedByMany`) 
- Refactor(ORM): enhance eager-loading for core relations (`hasOne`, `hasMany`, `belongsTo`, `belongsToMany`)
- Fix(Database): decode byte arrays to `UTF-8` strings in query results

## 1.0.0

- Release stable version 1.0.0  
- Refactor and improve `QueryBuilder`: remove Eloquent package and implement core version  
- Implement full ORM functionality in core  
- Optimize routing system  
- Enhance request validation  
- Remove extraneous code and optimize core performance  

## 0.8.2

- Fix (Session): session file locking issue on Linux.  
- Fix (Static File): Automatically load `index.html` if the `/` route is not defined in web routes.  

## 0.8.1

- Fix(Request Validation): Custom validation rule Future
- fix(upload): prevent "Exhausted heap space" error on large file uploads

## 0.8.0

- Fix session bug
- Add `RedirectIfAuthenticated` Middleware
- Add(Response): Back with input
- Add(Request Validation): `RegExp` rule [#167](https://github.com/vania-dart/framework/issues/167)
- Add(Request Validation): Custom Validation Rule
- Add lockFile method for atomic session file handling
- Remove Isolate from code
- Refactor HttpRequest handler method to class-based structure

## 0.7.4+1

- chore: Upgraded project dependencies

## 0.7.4

- Add Route name
- Add(Template engine): Route `{@ route('home') @}` , `{@ route('home', {"id":1}) @}`
- Add(Template engine): assets `{@ asset('css/style.css') @}`
- Fix `csrf` url excluded

## 0.7.3

- Fix Authentication bug
- Refactor vania hash
- Fix incoming requests bug
- Fix csrf and session issue
- Fix Authentication issue
- Add(Template engine): `comment` tag to the template engine `{@# Comments here #@}`
- Add(Template engine): translate tag to the template engine `{@ trans('welcome', {"name": "Vania"}) @}`

## 0.7.2

- Add(Template engine): error handler `hasError('email')` , `{@ error('email') @}`
- Add(Template engine): session message handler `hasSession('email')` , `{@ session('success') @}`
- Add(Template engine): Cross-Site Request Forgery (`CSRF`) `{@ CSRF @}` , `{@ csrf_token() @}`
- Add `back()` to the response
- Refactor exception handling
- Refactor and sanitize route
- Add Basic Auth with session to the `Authenticate`
- chore: Upgraded project dependencies

## 0.7.1

- Add delete Session to the helper
- Add `async-await` for all Session methods

## 0.7.0

- Feat(Session Management): Session handling capabilities to manage user sessions effectively.
- Feat(Template engine): Support for rendering HTML templates using a template engine. To handle dynamic HTML rendering with support for control structures.
- chore: Upgraded project dependencies

## 0.6.2

- Add redirect method [#144](https://github.com/vania-dart/framework/issues/144)
- Add custom 404 error handling via HTML file [#145](https://github.com/vania-dart/framework/issues/145)

## 0.6.1

- Fix get language path

## 0.6.0

- Refactor incoming route log
- Remove unnecessary library name
- Add Multi-language support [#141](https://github.com/vania-dart/framework/issues/141) [Localization](https://vdart.dev/docs/the-basics/localization)

## 0.5.1

- Add support for unique constraints in migrations. Thanks to [WellingtonNico](https://github.com/WellingtonNico) for the contribution.
- Refactor configuration initialization by moving database setup before service provider registration, ensuring a more reliable startup sequence.
- Fix Resolved an issue with WebSocket middleware that caused unexpected behavior. See [#132](https://github.com/vania-dart/framework/issues/132) for details.
- Chore Upgraded dependencies to their latest versions.

## 0.5.0

- Feat: Gate feature for defining user permissions
- Add WebSocket connect, disconnect, and error handling on the server side (#126)
- Add user getter method to Request class

## 0.4.3

- Fix nested JSON [#128](https://github.com/vania-dart/framework/issues/128)
- Add JSON to the request `request.json()`

## 0.4.2

- Fix id auto-increment for PostgreSQL compatibility [#127](https://github.com/vania-dart/framework/issues/118)

## 0.4.1

- Refactor validation rule customErrorMessage to message
- Fix JSON response for API
- Fix PostgreSQL sslmode [#118](https://github.com/vania-dart/framework/issues/118)
- Add enable support for list item submission `form/data` request
- chore: upgrade dependencies

## 0.4.0

- Feat: a new field validation mechanism by [alirezat66](https://github.com/alirezat66) - [PR 99](https://github.com/vania-dart/framework/pull/99)
- Fix nested route group [#98](https://github.com/vania-dart/framework/issues/98)
- Fix middleware issue

## 0.3.5+1

- Fix send message to room

## 0.3.5

- Fix WebSocket session id
- Add get room members
- Add is active session
- Add get active room
- Add get active sessions

## 0.3.4

- Fix route camel-case issue
- Add get cookie from the request

## 0.3.3+1

- Fix encoding char-set for form input handling

## 0.3.3

- Fix group route issue
- Fix uuid issue (#88)
- Add `Server-Sent Events (SSE)` response (#89) Thank you [Dartly](https://github.com/Dartly)

## 0.3.2

- Refactor Response class
- Add jsonWithHeader response
- Add QueryException to model class
- Add Databse helper
- Add Create and InsertMany to the ORM
- Add DB Transaction
- Add Cookies,Integer,asDouble to request class
- Fix request body int fields
- Fix PostgreSQL typo
- Fix drop table issue when table has foreign key

## 0.3.1

- Fix Refresh token bug([#83](https://github.com/vania-dart/framework/issues/83))
- Fix WebSocket connect event

## 0.3.0

- Add Parameter validation conditions for the router([#79](https://github.com/vania-dart/framework/issues/79))
- Add Resource and Any route ([#80](https://github.com/vania-dart/framework/issues/80))
- Refactor Router, Route Handler
- Refactor Controller handler for increasing RPS and decreasing latency
- Refactor Request handler for increase RPS
- Fix Null params ([#81](https://github.com/vania-dart/framework/issues/81))

## 0.2.7

- Optimize PRS
- Refactor Controller handler
- Refactor Request handler
- Refactor Request class
- Add none to response type and await for res close
- Refactor route handler
- Export Database client
- Add URL assets to helper

## 0.2.6

- Refactor Local storage class
- Refactor Cache class
- Refactor Storage class
- Refactor Response class
- Add AWS S3 storage driver
- Add Storage env config

```env
    STORAGE=s3
    STORAGE_S3_BUCKET=''
    STORAGE_S3_SECRET_KEY=''
    STORAGE_S3_ACCESS_KEY=''
    STORAGE_S3_REGION=''
```

## 0.2.5

- Fix Authentication middleware issue
- Fix static file url encoding
- Add Domian to router
- Add JWT env config

```env
    JWT_SECRET_KEY
    JWT_AUDIENCE
    JWT_ID
    JWT_ISSUER
    JWT_SUBJECT
 ```

## 0.2.4

- Fix Route bug
- Add WebSocket middleware
- Refactor Auth middleware

## 0.2.3

- Fix Database connection issue with Isolate

## 0.2.2

- Fix Websocket Join and Left room issue([#63](https://github.com/vania-dart/framework/issues/63))
- Refactor Migration and model
- Add DatabseClient class

## 0.2.1

- Fix Postgresql bug

## 0.2.0

- Add Redis (base code from dedis dart package)
- Add Redis Cache Driver

## 0.1.9

- Fix Isolate bug

## 0.1.8

- Fix public and storage file path
- Refactor Mailable Config to env
- Refactor Migration class, created migration timestamp Add by [S.M. SHAHi](https://github.com/shahi5472)
- Refactor Local cache class name to File cache

## 0.1.7+5

- Add pool and poolsize to DatabaseConfig

## 0.1.7+4

- Fix pgsql bug
- Add alter column to the migration

## 0.1.7+3

- Refactor HttpException to HttpResponseException
- Add abort method to the helper file

## 0.1.7+2

- Fix route group bug

## 0.1.7+1

- Fix env issue

## 0.1.7

- Add deleteTokens and deleteCurrentToken Auth class
- Refactor group routing to use a callback function instead of a list
- Refactor websocket data to payload
- Add Middleware Handler
- Fix Webscoket Route bug
- Update Dependencies
- Add secure bind

## 0.1.6+1

- Fix Storage issues

## 0.1.6

- Fix Websocket bugs
- Refactor Storage Converted Instance Methods to Static Methods
- Refactor Cache Converted Instance Methods to Static Methods

## 0.1.5+1

- Fix env issues

## 0.1.5

- Add Logger
- Add env file

## 0.1.4

- Add Throttle middleware
- Add move for upload file in custom folder
- Add paginate and simplePagination in Eloquent

## 0.1.3

- Add mail

## 0.1.2

- Add multi-isolate server

## 0.1.1+4

- Fix Validation issue on non-required fields

## 0.1.1+3

- Add Singleton base route preFix   to static
- Readme file

## 0.1.1+2

- Fix bug: Cors file and class name

## 0.1.1+1

- Fix bug: http method options and cors error

- ## 0.1.1

- Add Hash class

## 0.1.0

- Initial beta release
- Fix a bug related to WebSocket data events
- Fix authentication check functionality
- Add `isAuthorized` feature
- Add `query_builder` from Eloquent package for enhanced functionality

## 0.0.4

- Fix bug: Authentication refresh token

## 0.0.3+1

- Fix bug: migration columns length
- Add sslmode to the MySqldriver

## 0.0.3

- Fix Bug: Resolved issue with table creation in PostgreSQL

## 0.0.2+1

- Add bigIncrements and  softDeletes columns

## 0.0.2

- Add column index to vania file
- Code formatted

## 0.0.1

- Initial version.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Vania

## Creating a Pull Request

Before creating a pull request, please follow these steps:

1. Fork the repository and create your branch from `dev`.
2. Install all dependencies (`dart pub get`).
3. Squash your commits and ensure you have a meaningful, [semantic](https://www.conventionalcommits.org/en/v1.0.0/) commit message.
4. Add tests! Pull Requests without 100% test coverage will not be approved.
5. Ensure the existing test suite passes locally.
6. Format your code (`dart format .`).
7. Analyze your code (`dart analyze --fatal-infos --fatal-warnings .`).
8. Create the Pull Request targeting the `dev` branch.
9. Verify that all status checks are passing.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2024 Vania

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Introduction

[Vania Dart Documentation](https://vdart.dev)

[Contributing to Vania](https://github.com/vania-dart/framework/blob/main/CONTRIBUTING.md)

Vania is a robust backend framework designed for building high-performance web applications using Dart. With its straightforward approach and powerful features, Vania streamlines the development process for both beginners and experienced developers alike.

## Features

✅ ***Scalability***: Built to handle high traffic, Vania effortlessly scales alongside your application's growth.

✅ ***Developer-Friendly***: Enjoy an intuitive API and clear documentation, making web application development a breeze.

✅ ***Simple Routing***: Define and manage routes effortlessly with Vania's efficient routing system, ensuring robust application architecture.

✅ ***ORM Support***: Interact seamlessly with databases using Vania's powerful ORM system, simplifying data management.

✅ ***Request Data Validation***: Easily validate incoming request data to maintain data integrity and enhance security.

✅ ***Database Migration***: Manage and apply schema changes with ease using Vania's built-in database migration support.

✅ ***WebSocket***: Enable real-time communication between server and clients with WebSocket support, enhancing user experience.

✅ ***Command-Line Interface (CLI)***: Streamline development tasks with Vania's simple CLI, offering commands for creating migrations, generating models, and more.

Experience the simplicity and power of Vania for your next web application project

# Quick Start 🚀

Ensure that you have the [Dart SDK](https://dart.dev) installed on your machine.

YouTube Video [Quick Start](https://www.youtube.com/watch?v=k8ol0F4bDKs)

YouTube Video [Dart & flutter Fullstack with Vania](https://youtu.be/1tfqpusIXwQ)

[![Quick Start](https://img.youtube.com/vi/k8ol0F4bDKs/0.jpg)](https://www.youtube.com/watch?v=k8ol0F4bDKs "Quick Start")

## Installing 🧑‍💻

```shell
# 📦 Install the vania cli from pub.dev
dart pub global activate vania_cli
```

## Creating a Project ✨

Use the `vania create` command to create a new project.

```shell
# 🚀 Create a new project called "blog"
vania create blog
```

## Start the Dev Server 🏁

Open the newly created project and start the development server.

```shell
# 🏁 Start the dev server
vania serve
```

You can also include the `--vm` flag to enable VM service.

## Create a Production Build 📦

Create a production build:

```shell
# 📦 Create a production build
vania build
```

For production use, deploy using the provided `Dockerfile` and `docker-compose.yml` files to deploy anywhere.

Example CRUD API Project [Github](https://github.com/vania-dart/example)


================================================
FILE: README.tr.md
================================================

# Introduction

Vania, Dart kullanarak yüksek performanslı web uygulamaları oluşturmak için tasarlanmış sağlam bir backend çerçevesidir. Basit yaklaşımı ve güçlü özellikleriyle Vania, hem yeni başlayanlar hem de deneyimli geliştiriciler için geliştirme sürecini kolaylaştırır.

## Features

✅ ***Ölçeklenebilirlik***: Yüksek trafikle başa çıkmak için tasarlanan Vania, uygulamanızın büyümesiyle birlikte zahmetsizce kendini ölçekler.

✅ ***Geliştici Dostu***: Web uygulaması geliştirmeyi çocuk oyuncağı haline getiren bir API ve açık kaynağın keyfini çıkarın.

✅ ***Kolay Rota Oluşturma***: Vania'nın verimli yönlendirme sistemi ile rotaları zahmetsizce tanımlayın ve yönetin, sağlam bir uygulama mimarisi elde edin.

✅ ***ORM Desteği***: Vania'nın güçlü ORM sistemini kullanarak veritabanlarıyla sorunsuz bir şekilde etkileşim kurun ve veri yönetimini basitleştirin.

✅ ***İstek Verisi Doğrulama***: Veri bütünlüğünü korumak ve güvenliği artırmak için gelen talep verilerini kolayca doğrulayarak kontrol altında tutun.

✅ ***Veritabanı Yönetimi***: Vania'nın yerleşik veritabanı taşıma desteğini kullanarak şema değişikliklerini kolaylıkla yönetin ve uygulayın.

✅ ***WebSocket***: WebSocket desteği ile sunucu ve istemciler arasında gerçek zamanlı iletişim sağlayarak kullanıcı deneyimini geliştirin.

✅ ***Komut Satırı Arayüzü (CLI)***: Vania'nın veritabanı oluşturma, model oluşturma ve daha fazlası için komutlar sunan basit CLI'si ile geliştirme işlemlerini kolaylaştırın.

Bir sonraki web uygulaması projeniz için Vania'nın basitliğini ve gücünü deneyimleyin

Dokümantasyona buradan göz atın: [Vania Dart Dokümantasyonu](https://vdart.dev)

# Hızlı Başlangıç 🚀

[Dart SDK](https://dart.dev) 'in makinenizde kurulu olduğundan emin olun.

YouTube Video [Hızlı Başlangıç](https://www.youtube.com/watch?v=5LiDQlqhNto)

[![Quick Start](http://img.youtube.com/vi/5LiDQlqhNto/0.jpg)](https://www.youtube.com/watch?v=5LiDQlqhNto "Hızlı Başlangıç")

## Kurulum 🧑‍💻

```shell
# 📦 pub.dev adresinden Vania CLI kurulumunu gerçekleştirin
dart pub global activate vania_cli
```

## Proje Oluşturma ✨

Oluşturmak için `vania create` komutunu kullanın.

```shell
# 🚀 "blog" isminde yeni bir proje oluşturun
vania create blog
```

## Geliştirme Sunucusunu Başlatın 🏁

Yeni oluşturulan projeyi açın ve geliştirme sunucusunu başlatın.

```shell
# 🏁 Sunucuyu başlat
vania serve
```

Sanal Makine (VM) hizmetini etkinleştirmek için `--vm` bayrağını da ekleyebilirsiniz.

## Projeyi Derleyin 📦

Hazırladığınız projeyi derleyin

```shell
# 📦 Projeyi derleyin
vania build
```

Proje kullanımı için, herhangi bir yere dağıtmak üzere sağlanan `Dockerfile` ve `docker-compose.yml` dosyalarını kullanarak dağıtın.

Örnek CRUD API Projesi [Github](https://github.com/vania-dart/example)


================================================
FILE: analysis_options.yaml
================================================
# This file configures the static analysis results for your project (errors,
# warnings, and lints).
#
# This enables the 'recommended' set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format.
#
# If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints
# (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages.

include: package:lints/recommended.yaml

# Uncomment the following section to specify additional rules.

# linter:
#   rules:
#     - camel_case_types

# analyzer:
#   exclude:
#     - path/to/excluded/files/**

# For more information about the core and recommended set of lints, see
# https://dart.dev/go/core-lints

# For additional information about configuring this file, see
# https://dart.dev/guides/language/analysis-options


================================================
FILE: example/app_exception_handler.dart
================================================
import 'package:vania/src/exception/database_exception.dart';
import 'package:vania/src/exception/exception_handler.dart';
import 'package:vania/src/exception/not_found_exception.dart';
import 'package:vania/src/exception/query_exception.dart';
import 'package:vania/src/exception/validation_exception.dart';
import 'package:vania/src/http/request/request.dart';
import 'package:vania/src/http/response/response.dart';
import 'package:vania/src/service/service_provider.dart';
import 'package:vania/application.dart';

class DatabaseExceptionHandler extends ExceptionHandler<DatabaseException> {
  @override
  Response handle(DatabaseException exception, Request? request) {
    return Response.json({
      'success': false,
      'message': 'Database error occurred',
      'error': exception.message,
    }, 500);
  }
}

class QueryExceptionHandler extends ExceptionHandler<QueryException> {
  @override
  Response handle(QueryException exception, Request? request) {
    return Response.json({
      'success': false,
      'message': 'Query error occurred',
      'error': exception.cause,
    }, 500);
  }
}

class NotFoundExceptionHandler extends ExceptionHandler<NotFoundException> {
  @override
  Response handle(NotFoundException exception, Request? request) {
    return Response.json({
      'success': false,
      'message': exception.message,
    }, 404);
  }
}

class ValidationExceptionHandler extends ExceptionHandler<ValidationException> {
  @override
  Response handle(ValidationException exception, Request? request) {
    return Response.json({
      'success': false,
      'message': 'Validation failed',
      'errors': exception.message,
    }, 422);
  }
}

class ThirdPartyExceptionHandler extends GeneralExceptionHandler {
  @override
  Response? handle(dynamic exception, Request? request) {
    return Response.json({
      'success': false,
      'message': 'An unexpected error occurred',
      'error': exception.toString(),
    }, 500);
  }
}

class AppExceptionServiceProvider extends ServiceProvider {
  @override
  Future<void> boot() async {}

  @override
  Future<void> register() async {
    Application().addExceptionHandlers({
      DatabaseException: DatabaseExceptionHandler(),
      QueryException: QueryExceptionHandler(),
      NotFoundException: NotFoundExceptionHandler(),
      ValidationException: ValidationExceptionHandler(),
    });
    Application().setGeneralExceptionHandler(
      ThirdPartyExceptionHandler(),
    );
  }
}


================================================
FILE: example/main.dart
================================================
import 'package:vania/vania.dart';
import 'app_exception_handler.dart';

void main() async {
  Application().initialize(
    config: {
      'providers': [AppExceptionServiceProvider()],
    },
  );
}


================================================
FILE: lib/application.dart
================================================
import 'src/container.dart';
import 'src/exception/exception_handler.dart';
import 'src/ioc_container.dart';
import 'src/localization_handler/localization.dart';
import 'src/server/base_http_server.dart';
import 'src/env_handler/env.dart';
import 'src/http/request/request_handler.dart';
import 'src/http/session/session_manager.dart';
import 'src/utils/helper.dart' show env;

class Application extends Container {
  static Application? _singleton;

  final Map<Type, ExceptionHandler> _exceptionHandlers = {};
  GeneralExceptionHandler? _generalExceptionHandler;

  factory Application() {
    if (_singleton == null) {
      _singleton = Application._internal();
      Env().load();
      Localization().init();
    }
    return _singleton!;
  }

  Application._internal();

  void addExceptionHandler<T>(ExceptionHandler<T> handler) {
    _exceptionHandlers[T] = handler;
  }

  void addExceptionHandlers(Map<Type, ExceptionHandler> handlers) {
    _exceptionHandlers.addAll(handlers);
  }

  void setGeneralExceptionHandler(GeneralExceptionHandler handler) {
    _generalExceptionHandler = handler;
  }

  ExceptionHandler? getExceptionHandler(Type type) {
    return _exceptionHandlers[type];
  }

  GeneralExceptionHandler? getGeneralExceptionHandler() {
    return _generalExceptionHandler;
  }

  late BaseHttpServer _server;

  Future<void> initialize({
    required Map<String, dynamic> config,
    List<String> args = const [],
  }) async {
    IoCContainer().register<RequestHandler>(() => RequestHandler());
    IoCContainer().register<SessionManager>(
      () => SessionManager(),
      singleton: true,
    );
    if (env('APP_KEY') == '' || env('APP_KEY') == null) {
      throw Exception('Key not found');
    }

    _server = BaseHttpServer(config: config, args: args);
    _server.startServer();
  }

  Future<void> close() async {
    _server.httpServer?.close();
  }
}


================================================
FILE: lib/authentication.dart
================================================
export 'src/authentication/authentication.dart';
export 'src/authentication/authenticate.dart';
export 'src/authentication/redirect_if_authenticated.dart';
export 'src/authentication/has_api_tokens.dart';
export 'src/authentication/gate/gate.dart';


================================================
FILE: lib/database.dart
================================================
export 'src/database/seeder/seeder.dart';
export 'src/database/seeder/seeder_runner.dart';
export 'src/database/seeder/seeder_factory.dart';
export 'src/enum/column_index.dart';


================================================
FILE: lib/http/controller.dart
================================================
export '../src/http/controller/controller.dart';


================================================
FILE: lib/http/form_validation.dart
================================================
export '../src/contract/http/request/form_validation.dart';


================================================
FILE: lib/http/middleware.dart
================================================
export '../src/route/middleware/throttle.dart';
export '../src/http/middleware/middleware.dart';


================================================
FILE: lib/http/request.dart
================================================
export '../src/http/request/request.dart';
export '../src/http/request/request_file.dart';
export '../src/http/validation/validation_chain/export_chain_validation.dart';
export '../src/http/validation/custom_validation_rule.dart';
export '../src/exception/base_http_exception.dart';
export '../src/exception/http_exception.dart';
export '../src/exception/redirect_exception.dart';
export '../src/utils/request_helper.dart';


================================================
FILE: lib/http/response.dart
================================================
export '../src/http/response/response.dart';
export '../src/view_engine/helper.dart';


================================================
FILE: lib/mail.dart
================================================
export 'src/mail/mailable.dart';
export 'src/mail/content.dart';
export 'src/mail/envelope.dart';
export 'src/mail/mail_view.dart';
export 'package:mailer/src/entities/address.dart';
export 'package:mailer/src/entities/attachment.dart';


================================================
FILE: lib/migration.dart
================================================
export 'src/database/migration/runners/migration_runner.dart';
export 'src/database/migration/migration.dart';
export 'src/database/migration/builders/column_types.dart';
export 'src/database/migration/builders/schema.dart';
export 'src/database/migration/migration_connection.dart';


================================================
FILE: lib/orm/model.dart
================================================
export '../src/database/orm/model.dart';


================================================
FILE: lib/query_builder.dart
================================================
export 'src/database/db.dart';
export 'src/contract/database/query_builder/query_builder.dart';
export 'src/database/monitoring/database_monitor.dart';
export 'src/exception/database_exception.dart';
export 'src/exception/query_exception.dart';
export 'src/database/isolate_db.dart';


================================================
FILE: lib/route.dart
================================================
export 'src/route/router.dart';
export 'src/route/route.dart';


================================================
FILE: lib/service_provider.dart
================================================
export 'package:vania/src/service/service_provider.dart';


================================================
FILE: lib/src/authentication/authenticate.dart
================================================
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:meta/meta.dart';
import 'package:vania/src/authentication/authentication.dart';
import 'package:vania/src/exception/unauthenticated.dart';
import 'package:vania/src/http/middleware/middleware.dart';
import 'package:vania/src/http/request/request.dart';
import 'package:vania/src/http/response/response.dart';
import 'package:vania/src/utils/helper.dart';

class Authenticate extends Middleware {
  final String? guard;
  final bool basic;
  final String loginPath;
  Authenticate({this.guard, this.basic = false, this.loginPath = '/login'});

  @mustCallSuper
  @override
  handle(Request req) async {
    if (basic) {
      bool loggedIn = await getSession<bool?>('logged_in') ?? false;
      String guard = await getSession<String?>('auth_guard') ?? '';
      if (loggedIn && guard.isNotEmpty) {
        Map<String, dynamic> user =
            await getSession<Map<String, dynamic>?>('auth_user') ?? {};
        Auth().guard(guard).login(user[guard]);
      } else {
        throw Unauthenticated(
          message: loginPath,
          responseType: ResponseType.html,
        );
      }
    } else {
      String? token = req.header('authorization')?.replaceFirst('Bearer ', '');
      try {
        if (guard == null) {
          await Auth().check(token ?? '');
        } else {
          await Auth().guard(guard!).check(token ?? '');
        }
      } on JWTExpiredException {
        throw Unauthenticated(message: 'Token expired');
      }
    }
  }
}


================================================
FILE: lib/src/authentication/authentication.dart
================================================
import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:vania/src/config/config.dart';
import 'package:vania/src/database/orm/model.dart';
import 'package:vania/src/exception/invalid_argument_exception.dart';
import 'package:vania/src/exception/unauthenticated.dart';
import 'package:vania/src/utils/helper.dart';

import 'has_api_tokens.dart';
import 'model/personal_access_token.dart';

class Auth {
  static final Auth _singleton = Auth._internal();
  factory Auth() => _singleton;
  Auth._internal();

  String _userGuard = 'default';

  bool _loggedIn = false;

  final Map<String, dynamic> _user = {};

  bool get loggedIn => _loggedIn;

  Map<String, dynamic> user() => _user[_userGuard];

  dynamic id() => _user[_userGuard]['id'] ?? _user[_userGuard]['_id'];

  dynamic get(String filed) => _user[_userGuard][filed];

  /// Sets the authentication guard to the specified guard name.
  ///
  /// This method changes the current user guard to the specified guard, which
  /// determines the user provider and authentication logic to use. If the
  /// specified guard is not defined in the configuration, an
  /// [InvalidArgumentException] is thrown.
  ///
  /// Returns the current instance of the `Auth` class.
  ///
  /// Throws:
  /// - [InvalidArgumentException] if the specified guard is not defined.
  ///
  Auth guard(String guard) {
    if (Config().get('auth')['guards'][guard] == null) {
      throw InvalidArgumentException('Auth guard [$guard] is not defined.');
    }

    _userGuard = guard;
    return this;
  }

  /// Set the current user from a given user object.
  ///
  /// The object is expected to contain at least the `id` key.
  ///
  /// The user object will be stored in the `_user` map with the key being the
  /// current guard.
  ///
  /// Returns the current instance of the `Auth` class.
  Auth login(Map<String, dynamic> user, [bool basic = false]) {
    _user[_userGuard] = user;
    if (basic) {
      _updateSession();
    }
    return this;
  }

  Future<void> logout() async {
    await deleteSession('logged_in');
    await deleteSession('auth_guard');
    await deleteSession('auth_user');
    _loggedIn = false;
  }

  /// Updates the current session with the given user and guard.
  ///
  /// The function sets the `logged_in` session key to true, and updates the
  /// `auth_user` and `auth_guard` session keys if they are not already set or
  /// have changed. The function also sets the `_isAuthorized` flag to true.
  ///
  /// The session is only updated if the user and guard have changed, and the
  /// function does not return anything.
  Future<void> _updateSession() async {
    await setSession('logged_in', true);
    await setSession('auth_guard', _userGuard);
    await setSession('auth_user', _user);
    _loggedIn = true;
  }

  /// Create new token for the given user.
  ///
  /// The token created is a JWT token that contains the user's ID and the
  /// guard's name. The token is then signed with the secret key from the
  /// environment variable `JWT_SECRET_KEY`.
  ///
  /// If `withRefreshToken` is true, a refresh token is also created and
  /// returned in the `refresh_token` key of the map.
  ///
  /// If `customToken` is true, the token is not stored in the database and
  /// is returned as is.
  ///
  /// The `expiresIn` parameter is the duration after which the token will
  /// expire. If not provided, the token will expire after 1 hour.
  ///
  /// Returns a map containing the following keys:
  ///
  /// * `access_token`: the JWT token
  /// * `refresh_token`: the refresh token if `withRefreshToken` is true
  /// * `expires_in`: the duration after which the token will expire in seconds
  Future<Map<String, dynamic>> createToken({
    Duration? expiresIn,
    bool withRefreshToken = false,
    bool customToken = false,
  }) async {
    Map<String, dynamic> token = HasApiTokens()
        .setPayload(_user[_userGuard])
        .createToken(_userGuard, expiresIn, withRefreshToken);

    if (!customToken) {
      await PersonalAccessToken().query.insert({
        'name': _userGuard,
        'tokenable_id': _user[_userGuard]['id'],
        'token': md5.convert(utf8.encode(token['access_token'])).toString(),
        'created_at': DateTime.now(),
      });
    }

    return token;
  }

  /// Create a new token by given refresh token.
  //
  /// The given token must be a valid refresh token.
  //
  /// The `expiresIn` parameter is the duration after which the token will
  /// expire. If not provided, the token will expire after 1 hour.
  //
  /// The `customToken` parameter determines if the token should be stored in
  /// the database or not. If `customToken` is true, the token is not stored
  /// in the database.
  //
  /// Returns a map containing the following keys:
  //
  /// * `access_token`: the JWT token
  /// * `refresh_token`: the refresh token
  /// * `expires_in`: the duration after which the token will expire in seconds
  Future<Map<String, dynamic>> createTokenByRefreshToken(
    String token, {
    Duration? expiresIn,
    bool customToken = false,
  }) async {
    final newToken = HasApiTokens().refreshToken(
      token.replaceFirst('Bearer ', ''),
      _userGuard,
      expiresIn,
    );

    if (!customToken) {
      Map<String, dynamic> payload = HasApiTokens().verify(
        token.replaceFirst('Bearer ', ''),
        _userGuard,
        'refresh_token',
      );

      Model? authenticatable = Config().get(
        'auth',
      )['guards'][_userGuard]['provider'];

      if (authenticatable == null) {
        throw InvalidArgumentException('Authenticatable class not found');
      }

      Map? user = await authenticatable.query
          .where('id', '=', payload['id'])
          .first();

      if (user == null) {
        throw Unauthenticated(message: 'Invalid token');
      }

      _user[_userGuard] = user;
      await PersonalAccessToken().query.insert({
        'name': _userGuard,
        'tokenable_id': user['id'],
        'token': md5.convert(utf8.encode(newToken['access_token'])).toString(),
        'created_at': DateTime.now(),
      });
    }

    return newToken;
  }

  /// Delete all the tokens for the user that is currently logged in.
  ///
  /// This is useful when a user logs out and you want to delete all of their
  /// tokens.
  ///
  /// Returns true if the operation was successful.
  Future<bool> deleteTokens(dynamic userId) async {
    await PersonalAccessToken().query.where('tokenable_id', '=', userId).update(
      {'deleted_at': DateTime.now()},
    );

    return true;
  }

  /// Delete the current token for the user that is currently logged in.
  ///
  /// This function marks the current token as deleted by setting the `deleted_at`
  /// field to the current time in the database. This operation helps to effectively
  /// invalidate the token.
  ///
  /// Returns a Future that resolves to true if the operation was successful.
  ///
  Future<bool> deleteCurrentToken(String token) async {
    await PersonalAccessToken().query
        .where('token', '=', md5.convert(utf8.encode(token)).toString())
        .update({'deleted_at': DateTime.now()});
    return true;
  }

  /// Validates and checks the provided token for authentication.
  ///
  /// This function verifies the provided JWT access token and checks its validity
  /// against stored personal access tokens. If the token is valid, it updates the
  /// token's last used timestamp and sets the current user context, marking them
  /// as authorized.
  ///
  /// The function handles both custom and stored tokens. For custom tokens, it
  /// sets the user payload directly. For stored tokens, it ensures the token exists
  /// and is not marked as deleted, then retrieves the associated user.
  ///
  /// Throws:
  /// - [Unauthenticated] if the token is invalid or not found.
  /// - [InvalidArgumentException] if the authenticatable provider class is not found.
  ///
  /// Returns a Future that resolves to true if the token is valid and the user is successfully authenticated.
  ///
  Future<bool> check(
    String token, {
    Map<String, dynamic>? user,
    bool isCustomToken = false,
  }) async {
    Map<String, dynamic> payload = HasApiTokens().verify(
      token.replaceFirst('Bearer ', ''),
      _userGuard,
      'access_token',
    );

    if (isCustomToken) {
      _user[_userGuard] = payload;
      _loggedIn = true;
      return true;
    } else {
      Map<String, dynamic>? exists = await PersonalAccessToken().query
          .where('token', '=', md5.convert(utf8.encode(token)).toString())
          .whereNull('deleted_at')
          .first(['id']);
      // Throw 401 Error if token not found
      if (exists == null) {
        throw Unauthenticated(message: 'Invalid token');
      }

      await PersonalAccessToken().query
          .where('token', '=', md5.convert(utf8.encode(token)).toString())
          .update({'last_used_at': DateTime.now()});

      if (user == null) {
        Model? authenticatable = Config().get(
          'auth',
        )['guards'][_userGuard]['provider'];

        if (authenticatable == null) {
          throw InvalidArgumentException('Authenticatable class not found');
        }
        user = await authenticatable.query
            .where('id', '=', payload['id'])
            .first();
      }

      if (user != null) {
        _user[_userGuard] = user;
        _loggedIn = true;
        return true;
      } else {
        throw Unauthenticated(message: 'Invalid token');
      }
    }
  }
}


================================================
FILE: lib/src/authentication/gate/gate.dart
================================================
class Gate {
  static final Gate _instance = Gate._internal();

  factory Gate() {
    return _instance;
  }

  Gate._internal();

  /// All of the defined abilities.
  final Map<String, Function> _abilities = {};

  /// Define a new ability.
  /// Gate().define('canDeletePost', () {
  ///   return user.id == post.user_id;
  /// });
  void define(String ability, Function callback) {
    _abilities[ability] = callback;
  }

  /// Determine if all of the given abilities should be granted for the current user.
  /// Gate().allows('canDeletePost');
  bool allows(String ability) {
    final gate = _abilities[ability];
    if (gate != null) {
      return gate();
    }
    return false;
  }

  /// Determine if a given ability has been defined.
  bool has(String ability) {
    return _abilities.containsKey(ability);
  }

  /// Determine if any of the given abilities should be denied for the current user.
  bool denies(String ability) {
    return !allows(ability);
  }
}


================================================
FILE: lib/src/authentication/has_api_tokens.dart
================================================
import 'dart:convert';

import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:vania/src/exception/unauthenticated.dart';
import 'package:vania/src/utils/helper.dart' show env;

class HasApiTokens {
  static final HasApiTokens _singleton = HasApiTokens._internal();
  factory HasApiTokens() => _singleton;
  HasApiTokens._internal();

  Map<String, dynamic>? _userPayload = {};

  HasApiTokens setPayload(Map<String, dynamic> payload) {
    _userPayload = payload;
    return this;
  }

  /// Create new token for the given user.
  ///
  /// The token created is a JWT token that contains the user's ID, the
  /// guard's name, and the user's payload. The token is then signed with
  /// the secret key from the environment variable `JWT_SECRET_KEY`.
  ///
  /// If `withRefreshToken` is true, a refresh token is also created and
  /// returned in the `refresh_token` key of the map.
  ///
  /// The `expiresIn` parameter is the duration after which the token will
  /// expire. If not provided, the token will expire after 1 hour.
  ///
  /// Returns a map containing the following keys:
  ///
  /// * `access_token`: the JWT token
  /// * `refresh_token`: the refresh token if `withRefreshToken` is true
  /// * `expires_in`: the duration after which the token will expire in seconds
  Map<String, dynamic> createToken([
    String guard = '',
    Duration? expiresIn,
    bool withRefreshToken = false,
  ]) {
    String secretKey = env('JWT_SECRET_KEY') ?? env<String>('APP_KEY');
    Map<String, dynamic> userId = {'id': _userPayload?['id']};
    if (_userPayload?['id'] == null) {
      userId = {'_id': _userPayload?['_id']};
    }

    final jwt = JWT(
      {'user': jsonEncode(_userPayload), 'type': 'access_token', ...userId},
      audience: env('JWT_AUDIENCE') == null
          ? null
          : Audience.one(env<String>('JWT_AUDIENCE')),
      jwtId: env<String?>('JWT_ID'),
      issuer: env<String?>('JWT_ISSUER'),
      subject: env<String?>('JWT_SUBJECT'),
    );
    Map<String, dynamic> payload = {};
    Duration expirationTime = expiresIn ?? const Duration(hours: 1);

    String accessToken = jwt.sign(
      SecretKey('$secretKey$guard'),
      expiresIn: expirationTime,
    );

    payload['access_token'] = accessToken;

    if (withRefreshToken) {
      final jwtRefresh = JWT({...userId, 'type': 'refresh_token'});
      String refreshToken = jwtRefresh.sign(
        SecretKey('$secretKey$guard'),
        expiresIn: const Duration(days: 120),
      );
      payload['refresh_token'] = refreshToken;
    }

    payload['expires_in'] = DateTime.now()
        .add(expirationTime)
        .toIso8601String();

    return payload;
  }

  /// Creates a new token from a given refresh token.
  ///
  /// This function verifies the given refresh token and if it is valid, creates a
  /// new token using the `createToken` method.
  ///
  /// The `expiresIn` parameter is the duration after which the new token will
  /// expire. If not provided, the token will expire after 1 hour.
  ///
  /// Returns a map containing the following keys:
  ///
  /// * `access_token`: the new JWT token
  /// * `refresh_token`: the new refresh token
  /// * `expires_in`: the duration after which the new token will expire in seconds
  Map<String, dynamic> refreshToken(
    String token, [
    String guard = '',
    Duration? expiresIn,
  ]) {
    final jwt = verify(token, guard, 'refresh_token');
    _userPayload = jwt;
    return createToken(guard, expiresIn, true);
  }

  /// Verifies a given JWT token and returns the payload if it is valid.
  ///
  /// The `expectedType` parameter is the expected type of the token. If the
  /// token is not of this type, an `Unauthenticated` exception will be thrown.
  ///
  /// The `guard` parameter is the guard to use when verifying the token. The
  /// secret key will be concatenated with the guard before verifying the
  /// token.
  ///
  /// Returns a map containing the payload of the token if it is valid.
  ///
  /// Throws an `Unauthenticated` exception if the token is invalid or expired.
  Map<String, dynamic> verify(String token, String guard, String expectedType) {
    String secretKey = env('JWT_SECRET_KEY') ?? env<String>('APP_KEY');
    try {
      final jwt = JWT.verify(
        token,
        SecretKey('$secretKey$guard'),
        audience: env('JWT_AUDIENCE') == null
            ? null
            : Audience.one(env<String>('JWT_AUDIENCE')),
        jwtId: env<String?>('JWT_ID'),
        issuer: env<String?>('JWT_ISSUER'),
        subject: env<String?>('JWT_SUBJECT'),
      );

      final payload = jwt.payload;
      if (payload is! Map<String, dynamic>) {
        throw Unauthenticated(message: 'Invalid JWT payload type');
      }

      if (payload['type'] != expectedType) {
        throw Unauthenticated(message: 'Invalid token type');
      }

      return payload;
    } on JWTExpiredException {
      rethrow;
    } on JWTException {
      throw Unauthenticated(message: 'Invalid token');
    }
  }
}


================================================
FILE: lib/src/authentication/model/personal_access_token.dart
================================================
import 'package:vania/src/database/orm/model.dart';

class PersonalAccessToken extends Model {
  @override
  List<String> guarded = ['id'];
}


================================================
FILE: lib/src/authentication/redirect_if_authenticated.dart
================================================
import 'package:vania/src/exception/redirect_exception.dart';
import 'package:vania/src/http/middleware/middleware.dart';
import 'package:vania/src/http/request/request.dart';
import 'package:vania/src/http/response/response.dart';
import 'package:vania/src/utils/helper.dart' show getSession;

class RedirectIfAuthenticated extends Middleware {
  final String path;
  RedirectIfAuthenticated({required this.path});

  @override
  Future handle(Request req) async {
    bool loggedIn = await getSession<bool?>('logged_in') ?? false;
    if (loggedIn) {
      throw RedirectException(message: path, responseType: ResponseType.html);
    }
  }
}


================================================
FILE: lib/src/aws/s3_client.dart
================================================
import 'dart:convert';
import 'dart:typed_data';

import 'package:crypto/crypto.dart';
import 'package:vania/src/extensions/date_time_extension.dart';
import 'package:vania/src/utils/helper.dart';

class S3Client {
  static final S3Client _singleton = S3Client._internal();
  factory S3Client() => _singleton;
  S3Client._internal();

  final String _region = env<String>('STORAGE_S3_REGION', '');
  final String _bucket = env<String>('STORAGE_S3_BUCKET', '');
  final String _secretKey = env<String>('STORAGE_S3_SECRET_KEY', '');
  final String _accessKey = env<String>('STORAGE_S3_ACCESS_KEY', '');

  Uri buildUri(String key) {
    return Uri.https('$_bucket.s3.$_region.amazonaws.com', '/$key');
  }

  Uint8List _hmacSha256(Uint8List key, String data) {
    var hmac = Hmac(sha256, key);
    return Uint8List.fromList(hmac.convert(utf8.encode(data)).bytes);
  }

  Uint8List _getSignatureKey(
    String key,
    String date,
    String regionName,
    String serviceName,
  ) {
    var kDate = _hmacSha256(Uint8List.fromList(utf8.encode('AWS4$key')), date);
    var kRegion = _hmacSha256(kDate, regionName);
    var kService = _hmacSha256(kRegion, serviceName);
    var kSigning = _hmacSha256(kService, 'aws4_request');
    return kSigning;
  }

  Map<String, String> generateS3Headers(
    String method,
    String key, {
    String? hash,
  }) {
    final algorithm = 'AWS4-HMAC-SHA256';
    final service = 's3';
    final dateTime = DateTime.now().toUtc().toAwsFormat();
    final date = dateTime.substring(0, 8).toString();
    final scope = '$date/$_region/$service/aws4_request';

    final signedHeaders = 'host;x-amz-content-sha256;x-amz-date';
    hash ??= sha256.convert(utf8.encode('')).toString();
    final canonicalRequest = [
      method,
      '/$key',
      '',
      'host:$_bucket.s3.$_region.amazonaws.com',
      'x-amz-content-sha256:$hash',
      'x-amz-date:$dateTime',
      '',
      signedHeaders,
      hash,
    ].join('\n');

    final stringToSign = [
      algorithm,
      dateTime,
      scope,
      sha256.convert(utf8.encode(canonicalRequest)).toString(),
    ].join('\n');

    final signingKey = _getSignatureKey(_secretKey, date, _region, service);
    final signature = _hmacSha256(
      signingKey,
      stringToSign,
    ).map((e) => e.toRadixString(16).padLeft(2, '0')).join();

    final authorizationHeader = [
      '$algorithm Credential=$_accessKey/$scope',
      'SignedHeaders=$signedHeaders',
      'Signature=$signature',
    ].join(', ');

    return {
      'Authorization': authorizationHeader,
      'x-amz-content-sha256': hash,
      'x-amz-date': dateTime,
    };
  }
}


================================================
FILE: lib/src/cache/cache.dart
================================================
import 'package:vania/src/cache/file_cache_driver.dart';
import 'package:vania/src/utils/helper.dart' show env;

import 'cache_driver.dart';
import 'redis_cache_driver.dart';

class Cache {
  static final Cache _singleton = Cache._internal();
  factory Cache() => _singleton;
  Cache._internal();

  final CacheDriver _driver = switch (env<String>('CACHE_DRIVER', 'file')) {
    'file' => FileCacheDriver(),
    'redis' => RedisCacheDriver(),
    /*case 'memcached':
      case 'database':
      case 'memcache':
      break;*/
    _ => FileCacheDriver(),
  };

  /// set key => value to cache
  /// default duration is 1 hour
  /// ```
  /// await Cache.put('foo', 'bar');
  /// await Cache.put('foo', 'bar', duration: Duration(hours: 24));
  /// ```
  static Future<void> put(
    String key,
    dynamic value, {
    Duration duration = const Duration(hours: 1),
  }) async {
    if (value == null) {
      throw Exception("Value can't be null");
    }
    await Cache()._driver.put(key, value, duration: duration);
  }

  /// set key => value to cache forever
  /// ```
  /// await Cache.forever('foo', 'bar');
  /// ```
  static Future<void> forever(String key, String value) async {
    await Cache()._driver.forever(key, value);
  }

  /// remove a key from cache
  /// ```
  /// await Cache.delete('foo');
  ///
  static Future<void> delete(String key) async {
    await Cache()._driver.delete(key);
  }

  /// get a value from cache
  /// ```
  /// String? value = await Cache.get('foo');
  ///
  static Future<dynamic> get(String key, [dynamic defaultValue]) async {
    return await Cache()._driver.get(key, defaultValue);
  }

  /// get a value exist
  /// ```
  /// bool has = await Cache.has('foo');
  ///
  static Future<bool> has(String key) async {
    return await Cache()._driver.has(key);
  }
}


================================================
FILE: lib/src/cache/cache_driver.dart
================================================
abstract class CacheDriver {
  Future<void> put(String key, dynamic value, {Duration duration});

  Future<void> forever(String key, dynamic value);

  Future<void> delete(String key);

  Future<dynamic> get(String key, [dynamic defaultValue]);

  Future<bool> has(String key);
}


================================================
FILE: lib/src/cache/file_cache_driver.dart
================================================
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path;
import '../utils/helper.dart';
import 'cache_driver.dart';

class FileCacheDriver implements CacheDriver {
  static final FileCacheDriver _instance = FileCacheDriver._internal();
  factory FileCacheDriver() => _instance;
  FileCacheDriver._internal();

  final String _cacheDir = storagePath('framework/cache');

  @override
  Future<dynamic> get(String key, [dynamic defaultValue]) async {
    final file = _getCacheFile(key);
    if (!await file.exists()) return defaultValue;

    try {
      final data = await file.readAsString();
      final cache = jsonDecode(data);

      if (cache['expiration'] != null) {
        final expiration = DateTime.parse(cache['expiration']);
        if (DateTime.now().isAfter(expiration)) {
          await file.delete();
          return defaultValue;
        }
      }

      return cache['value'] ?? defaultValue;
    } catch (e) {
      await file.delete();
      return defaultValue;
    }
  }

  @override
  Future<void> put(
    String key,
    dynamic value, {
    Duration duration = const Duration(hours: 1),
  }) async {
    final file = _getCacheFile(key);
    await _ensureCacheDirectory();

    final cache = {
      'value': value,
      'expiration': DateTime.now().add(duration).toIso8601String(),
    };
    await file.writeAsString(jsonEncode(cache));
  }

  @override
  Future<void> forever(String key, dynamic value) async {
    if (value == null) {
      throw Exception("Value can't be null");
    }

    final file = _getCacheFile(key);
    await _ensureCacheDirectory();

    final cache = {'value': value, 'expiration': null};

    await file.writeAsString(jsonEncode(cache));
  }

  @override
  Future<bool> has(String key) async {
    final value = await get(key);
    return value != null;
  }

  @override
  Future<bool> delete(String key) async {
    final file = _getCacheFile(key);
    if (!await file.exists()) return false;

    try {
      await file.delete();
      return true;
    } catch (e) {
      return false;
    }
  }

  File _getCacheFile(String key) {
    final fileName = base64Url.encode(utf8.encode(key));
    return File(path.join(_cacheDir, fileName));
  }

  Future<void> _ensureCacheDirectory() async {
    final dir = Directory(_cacheDir);
    if (!await dir.exists()) {
      await dir.create(recursive: true);
    }
  }
}


================================================
FILE: lib/src/cache/redis_cache_driver.dart
================================================
import 'package:vania/src/redis/vania_redis.dart';
import 'package:vania/src/utils/helper.dart' show env;

import 'cache_driver.dart';

class RedisCacheDriver extends CacheDriver {
  String prefix = env('REDIS_PREFIX', '${env('APP_NAME', 'vania')}_database_');

  @override
  Future<void> delete(String key) async {
    await Redis().initialized;
    await Redis().command.del('$prefix$key');
  }

  @override
  Future<void> forever(String key, value) async {
    await Redis().initialized;
    await Redis().command.set('$prefix$key', value);
  }

  @override
  Future get(String key, [defaultValue]) async {
    await Redis().initialized;
    return await Redis().command.get('$prefix$key') ?? defaultValue;
  }

  @override
  Future<bool> has(String key) async {
    await Redis().initialized;
    return await Redis().command.exists('$prefix$key');
  }

  @override
  Future<void> put(String key, value, {Duration? duration}) async {
    duration ??= Duration(hours: 24);
    await Redis().initialized;
    await Redis().command.setEx('$prefix$key', duration.inSeconds, value);
  }
}


================================================
FILE: lib/src/config/config.dart
================================================
class Config {
  static final Config _singleton = Config._internal();
  factory Config() => _singleton;
  Config._internal();

  Map<String, dynamic> _config = {};
  set setApplicationConfig(Map<String, dynamic> conf) => _config = conf;

  dynamic get(String key) => _config[key];
}

class CORSConfig {
  final bool enabled;
  final dynamic origin;
  final dynamic methods;
  final dynamic headers;
  final dynamic exposeHeaders;
  final bool? credentials;
  final num? maxAge;

  const CORSConfig({
    this.enabled = true,
    this.origin,
    this.methods,
    this.headers,
    this.exposeHeaders,
    this.credentials,
    this.maxAge,
  });
}


================================================
FILE: lib/src/config/defined_regexp.dart
================================================
final ipRegExp = RegExp(
  r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',
);
final alphaDashRegExp = RegExp(r'^[a-zA-Z-_]+$');

final alphaNumericRegExp = RegExp(r'^[a-zA-Z0-9]+$');

final alphaRegExp = RegExp(r'^[a-zA-Z]+$');

final emailRegExp = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');

final uuidRegExp = RegExp(
  r'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$',
);


================================================
FILE: lib/src/config/http_cors.dart
================================================
import 'dart:io';

import 'config.dart';

class HttpCors {
  HttpCors(HttpRequest req) {
    CORSConfig? cors = Config().get('cors');
    if (cors != null && cors.enabled) {
      Map<String, dynamic> headers = <String, dynamic>{
        HttpHeaders.accessControlAllowOriginHeader: cors.origin,
        HttpHeaders.accessControlAllowMethodsHeader: cors.methods,
        HttpHeaders.accessControlAllowHeadersHeader: cors.headers,
        HttpHeaders.accessControlExposeHeadersHeader: cors.exposeHeaders,
        HttpHeaders.accessControlAllowCredentialsHeader: cors.credentials,
        HttpHeaders.accessControlMaxAgeHeader: cors.maxAge,
      };

      headers.forEach((String key, dynamic value) {
        _setCorsValue(req.response, key, value);
      });
    }
  }

  // set cors in header
  void _setCorsValue(HttpResponse res, String key, dynamic data) {
    if (data == null) {
      return;
    }

    /// when data is list of string, eg. ['GET', 'POST']
    if (data is List<String> && data.isNotEmpty) {
      res.headers.add(key, data.join(','));
      return;
    }

    /// when data is string, eg. 'GET'
    if (data is String && data.isNotEmpty) {
      res.headers.add(key, data);
      return;
    }

    /// when data is other type and has value, just convert to string
    if (data != null) {
      res.headers.add(key, data.toString());
    }
  }
}


================================================
FILE: lib/src/container.dart
================================================
class Container {}


================================================
FILE: lib/src/contract/database/_connectors/_database_connection.dart
================================================
abstract interface class DatabaseConnection {
  Future<void> connect();
  Future<List<Map<String, dynamic>>> select(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]);
  Future insert(String query, [Map<String, dynamic> bindings = const {}]);
  Future<bool> execute(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]);
  Future<T> transaction<T>(Future<T> Function() action);

  Future<void> close();
}


================================================
FILE: lib/src/contract/database/query_builder/_bulk_operations_builder.dart
================================================
part of 'query_builder.dart';

enum ConflictAction { update, ignore, replace, delete }

abstract class BulkOperationsBuilder {
  Future<bool> merge(
    List<Map<String, dynamic>> sourceData, {
    required List<String> matchOn,
    ConflictAction whenMatched = ConflictAction.update,
    ConflictAction whenNotMatched = ConflictAction.ignore,
    ConflictAction? whenNotMatchedBySource,
    List<String>? updateColumns,
    List<String>? insertColumns,
    Map<String, dynamic>? additionalValues,
  });

  Future<bool> bulkInsert(
    List<Map<String, dynamic>> data, {
    ConflictAction conflictAction = ConflictAction.ignore,
    List<String>? conflictColumns,
    List<String>? updateColumns,
    int batchSize = 1000,
    bool returnIds = false,
  });

  Future<bool> bulkUpdate(
    List<Map<String, dynamic>> updates, {
    required String matchColumn,
    List<String>? updateColumns,
    int batchSize = 500,
    Map<String, dynamic>? additionalValues,
  });

  Future<bool> bulkDelete({
    String? column,
    List<dynamic>? values,
    int batchSize = 1000,
  });

  Future<bool> bulkDeleteWhere(
    List<Map<String, dynamic>> conditions, {
    int batchSize = 500,
  });

  Future<void> batchProcess({
    required int batchSize,
    required Future<void> Function(
      List<Map<String, dynamic>> batch,
      int batchNumber,
    )
    processor,
    List<String> columns = const ['*'],
  });

  Future<void> chunkedProcess({
    required int chunkSize,
    required Future<List<Map<String, dynamic>>> Function(
      List<Map<String, dynamic>> chunk,
    )
    processor,
    String? destination,
    List<String> columns = const ['*'],
  });

  Future<bool> parallelBulkInsert(
    List<Map<String, dynamic>> data, {
    int parallelism = 2,
    int batchSize = 1000,
    ConflictAction conflictAction = ConflictAction.ignore,
    List<String>? conflictColumns,
  });

  Future<bool> transactionalBulkOperation(Future<bool> Function() operations);
}


================================================
FILE: lib/src/contract/database/query_builder/_cte_builder.dart
================================================
part of 'query_builder.dart';

abstract class CteBuilder {
  QueryBuilder withCte(
    String name,
    QueryBuilder subQuery, {
    List<String>? columns,
  });

  QueryBuilder withMultiple(
    Map<String, QueryBuilder> ctes, {
    Map<String, List<String>>? columnsMap,
  });

  QueryBuilder withRecursive(
    String name,
    QueryBuilder baseCase,
    QueryBuilder recursiveCase, {
    List<String>? columns,
  });

  QueryBuilder withMaterialized(
    String name,
    QueryBuilder subQuery, {
    List<String>? columns,
  });

  QueryBuilder withNotMaterialized(
    String name,
    QueryBuilder subQuery, {
    List<String>? columns,
  });
}


================================================
FILE: lib/src/contract/database/query_builder/_delete_query_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class DeleteQueryBuilder {
  Future<bool> delete();
  Future<bool> truncate({bool force = false});
}


================================================
FILE: lib/src/contract/database/query_builder/_insert_query_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class InsertQueryBuilder {
  Future<bool> insert(Map<String, dynamic> values);
  Future insertGetId(Map<String, dynamic> values, [String? sequence]);
  Future<bool> insertMany(List<Map<String, dynamic>> values);
  Future<bool> insertOrIgnore(Map<String, dynamic> values);
  Future<bool> insertUsing(List<String> columns, QueryBuilder subQuery);
  Future<bool> upsert(
    Map<String, dynamic> values,
    List<String> uniqueBy, [
    Map<String, dynamic>? update,
  ]);
}


================================================
FILE: lib/src/contract/database/query_builder/_join_clause_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class JoinClauseBuilder {
  QueryBuilder crossJoin(String table, [List<dynamic> bindings = const []]);

  QueryBuilder join(
    String table,
    String firstColumn, [
    String? operator,
    String? secondColumn,
    String type = 'inner',
    bool where = false,
  ]);

  QueryBuilder joinSub(
    QueryBuilder subQuery,
    String as,
    String firstColumn, [
    String? operator,
    String? secondColumn,
    String type = 'inner',
  ]);

  QueryBuilder leftJoin(
    String table,
    String firstColumn, [
    String? operator,
    String? secondColumn,
    bool where = false,
  ]);

  QueryBuilder leftJoinSub(
    QueryBuilder subQuery,
    String as,
    String firColumnst, [
    String? operator,
    String? secondColumn,
  ]);

  QueryBuilder rightJoin(
    String table,
    String firstColumn, [
    String? operator,
    String? secondColumn,
  ]);
}


================================================
FILE: lib/src/contract/database/query_builder/_query_executor_builder.dart
================================================
part of 'query_builder.dart';

abstract class QueryExecutorBuilder {
  Future<num> avg(String column);
  Future<void> chunk(
    int chunk,
    void Function(List<Map<String, dynamic>> data) callback,
  );
  Future<void> chunkById(
    int chunk,
    void Function(List<Map<String, dynamic>> data) callback, [
    String column,
  ]);
  Future<int> count([String columns = '*']);
  Future<bool> doesntExist();
  Future<void> each(void Function(Map<String, dynamic>) callback);
  Future<bool> exists();
  Future<Map<String, dynamic>?> find(
    dynamic id, {
    String byColumnName = 'id',
    List<String> columns = const ['*'],
  });

  Future<Map<String, dynamic>?> findOrFail(
    dynamic id, {
    String byColumnName = 'id',
    List<String> columns = const ['*'],
  });
  Future<Map<String, dynamic>?> first([List<String> columns]);
  Future<Map<String, dynamic>?> firstOrFail([
    List<String> columns = const ['*'],
  ]);
  Future<Map<String, dynamic>?> firstWhere(
    String column, [
    String? operator,
    dynamic value,
    List<String> columns = const ['*'],
  ]);
  Future<List<Map<String, dynamic>>> get([List<String> columns]);

  Stream<Iterable<Map<String, dynamic>>> lazy([
    int chunk = 1000,
    String column,
  ]);
  Stream<Map<String, dynamic>> cursor([int chunk = 1000]);
  Future<dynamic> max(String column);
  Future<dynamic> min(String column);
  Future<Map<String, dynamic>> paginate({
    int perPage = 15,
    List<String> columns = const ['*'],
    String? pageName,
    int? page,
  });
  Future<dynamic> pluck(String column, [String? key]);
  Future<Map<String, dynamic>> simplePaginate([
    int perPage,
    List<String> columns,
    String pageName,
    int? page,
  ]);
  Future<num> sum(String column);

  Future<dynamic> value(String column);
}


================================================
FILE: lib/src/contract/database/query_builder/_select_query_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class SelectQueryBuilder {
  QueryBuilder addSelect(List<String> columns);

  QueryBuilder select([List<String> columns]);

  QueryBuilder selectRaw(String query, [List bindings = const []]);
  QueryBuilder selectSub(QueryBuilder subQuery, String as);
}


================================================
FILE: lib/src/contract/database/query_builder/_union_clause_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class UnionClauseBuilder {
  QueryBuilder union(QueryBuilder query);
  QueryBuilder unionAll(QueryBuilder query);
}


================================================
FILE: lib/src/contract/database/query_builder/_update_query_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class UpdateQueryBuilder {
  Future<bool> decrement(
    String column, [
    int amount = 1,
    Map<String, dynamic> extra = const {},
  ]);
  Future<bool> increment(
    String column, [
    int amount = 1,
    Map<String, dynamic> extra = const {},
  ]);
  Future<bool> incrementEach(
    Map<String, int> increments, [
    Map<String, dynamic> extra = const {},
  ]);
  Future<bool> update(Map<String, dynamic> values);

  Future<bool> updateMany(List<Map<String, dynamic>> updates, String column);

  Future<bool> updateOrInsert(
    Map<String, dynamic> search,
    Map<String, dynamic> update,
  );
}


================================================
FILE: lib/src/contract/database/query_builder/_where_clauses_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class WhereClausesBuilder {
  QueryBuilder orWhere(
    dynamic condition, [
    String operator = '=',
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder orWhereBetween(String column, List values, {bool not = false});

  QueryBuilder orWhereColumn(
    String first,
    String operator,
    String secondColumn,
  );

  QueryBuilder orWhereDate(String column, String operator, dynamic value);

  QueryBuilder orWhereDay(String column, String operator, dynamic value);

  QueryBuilder orWhereExists(QueryCallback callback, {bool not = false});

  QueryBuilder orWhereFullText(
    dynamic columns,
    dynamic query, [
    Map<String, dynamic> options = const {},
  ]);

  QueryBuilder orWhereHour(String column, String operator, dynamic value);

  QueryBuilder orWhereIn(String column, List values, {bool not = false});
  QueryBuilder orWhereJsonContains(
    String column,
    dynamic value, {
    bool not = false,
  });
  QueryBuilder orWhereJsonDoesntContain(String column, dynamic value);
  QueryBuilder orWhereJsonLength(String column, String operator, dynamic value);

  QueryBuilder orWhereLike(
    String column,
    dynamic value, {
    bool caseSensitive = false,
  });
  QueryBuilder orWhereMonth(String column, String operator, dynamic value);
  QueryBuilder orWhereNotBetween(String column, List values);
  QueryBuilder orWhereNotExists(QueryCallback callback);

  QueryBuilder orWhereNotIn(String column, List values);
  QueryBuilder orWhereNotLike(
    String column,
    dynamic value, {
    bool caseSensitive = false,
    String boolean = 'and',
  });
  QueryBuilder orWhereNotNull(String column);
  QueryBuilder orWhereNull(String column);

  QueryBuilder orWhereRaw(String sql, [List<dynamic> bindings = const []]);
  QueryBuilder orWhereRowValues(
    List<String> columns,
    String operator,
    List<dynamic> values,
  );

  QueryBuilder orWhereTime(String column, String operator, dynamic value);
  QueryBuilder orWhereYear(String column, String operator, dynamic value);

  QueryBuilder where(
    dynamic condition, [
    String operator = '=',
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder whereAfterToday(String column, {String boolean = 'and'});

  QueryBuilder whereAll(
    String column,
    List<dynamic> values, {
    String boolean = 'and',
  });
  QueryBuilder whereAny(
    String column,
    List<dynamic> values, {
    String boolean = 'and',
  });

  QueryBuilder whereBeforeToday(String column, {String boolean = 'and'});
  QueryBuilder whereBetween(
    String column,
    List values, {
    String boolean = 'and',
    bool not = false,
  });

  QueryBuilder whereBetweenColumns(
    String column,
    List<String> columns, {
    String boolean = 'and',
  });
  QueryBuilder whereColumn(
    String firstColumn,
    String operator,
    String secondColumn, [
    String boolean = 'and',
  ]);

  QueryBuilder whereDate(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });
  QueryBuilder whereDay(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });

  QueryBuilder whereEqualTo(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder whereExists(
    QueryCallback callback, {
    String boolean = 'and',
    bool not = false,
  });

  QueryBuilder whereFullText(
    dynamic columns,
    dynamic query, [
    Map<String, dynamic> options = const {},
  ]);
  QueryBuilder whereFuture(String column, {String boolean = 'and'});

  QueryBuilder whereGreaterThan(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder whereGreaterThanOrEqualTo(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);

  QueryBuilder whereHour(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });
  QueryBuilder whereIn(
    String column,
    List values, {
    String boolean = 'and',
    bool not = false,
  });

  QueryBuilder whereJsonContains(
    String column,
    dynamic value, {
    String boolean = 'and',
    bool not = false,
  });
  QueryBuilder whereJsonDoesntContain(
    String column,
    dynamic value, {
    String boolean = 'and',
  });

  QueryBuilder whereJsonLength(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });
  QueryBuilder whereLessThan(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);

  QueryBuilder whereLessThanOrEqualTo(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder whereLike(
    String column,
    dynamic value, {
    bool caseSensitive = false,
    String boolean = 'and',
  });

  QueryBuilder whereMonth(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });
  QueryBuilder whereNone(
    String column,
    List<dynamic> values, {
    String boolean = 'and',
  });

  QueryBuilder whereNotBetween(
    String column,
    List values, {
    String boolean = 'and',
  });
  QueryBuilder whereNotBetweenColumns(
    String column,
    List<String> columns, {
    String boolean = 'and',
  });
  QueryBuilder whereNotEqualTo(
    dynamic condition, [
    dynamic value,
    String boolean = 'and',
  ]);
  QueryBuilder whereNotExists(QueryCallback callback, {String boolean = 'and'});

  QueryBuilder whereNotIn(String column, List values, {String boolean = 'and'});

  QueryBuilder whereNotLike(
    String column,
    dynamic value, {
    bool caseSensitive = false,
    String boolean = 'and',
  });

  QueryBuilder whereNotNull(String column, {String boolean = 'and'});

  QueryBuilder whereNowOrFuture(String column, {String boolean = 'and'});
  QueryBuilder whereNowOrPast(String column, {String boolean = 'and'});
  QueryBuilder whereNull(
    String column, {
    String boolean = 'and',
    bool not = false,
  });
  QueryBuilder wherePast(String column, {String boolean = 'and'});
  QueryBuilder whereRaw(
    String sql, [
    List<dynamic> bindings = const [],
    String boolean = 'and',
  ]);
  QueryBuilder whereRowValues(
    List<String> columns,
    String operator,
    List<dynamic> values, {
    String boolean = 'and',
  });
  QueryBuilder whereTime(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });
  QueryBuilder whereToday(String column, {String boolean = 'and'});
  QueryBuilder whereTodayOrAfter(String column, {String boolean = 'and'});

  QueryBuilder whereTodayOrBefore(String column, {String boolean = 'and'});
  QueryBuilder whereYear(
    String column,
    String operator,
    dynamic value, {
    String boolean = 'and',
  });

  QueryBuilder whereHas(
    String relation,
    QueryCallback callback, {
    String boolean = 'and',
  });

  QueryBuilder orWhereHas(String relation, QueryCallback callback);

  QueryBuilder whereDoesntHave(
    String relation,
    QueryCallback callback, {
    String boolean = 'and',
  });

  QueryBuilder orWhereDoesntHave(String relation, QueryCallback callback);

  QueryBuilder withSoftDeletes([String column = 'deleted_at']);
}


================================================
FILE: lib/src/contract/database/query_builder/_window_functions_builder.dart
================================================
part of 'query_builder.dart';

abstract interface class WindowFunctionsBuilder {
  QueryBuilder rowNumber({String? partitionBy, String? orderBy, String? as});

  QueryBuilder rank({String? partitionBy, String? orderBy, String? as});

  QueryBuilder denseRank({String? partitionBy, String? orderBy, String? as});

  QueryBuilder lag(
    String column, {
    int offset = 1,
    dynamic defaultValue,
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder lead(
    String column, {
    int offset = 1,
    dynamic defaultValue,
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder firstValue(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder lastValue(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder ntile(
    int buckets, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder percentRank({String? partitionBy, String? orderBy, String? as});

  QueryBuilder cumeDist({String? partitionBy, String? orderBy, String? as});

  QueryBuilder windowSum(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder windowAvg(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder windowCount(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder windowMax(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });

  QueryBuilder windowMin(
    String column, {
    String? partitionBy,
    String? orderBy,
    String? as,
  });
}


================================================
FILE: lib/src/contract/database/query_builder/query_builder.dart
================================================
import 'package:meta/meta.dart';
import '../../../database/_connection_manager.dart';
import '../../../database/monitoring/database_monitor.dart';
import '../../../exception/invalid_argument_exception.dart';
import '../_connectors/_database_connection.dart';

part '../../../database/_database_utils/_paginated_result.dart';
part '../../../database/_database_utils/_raw_expression.dart';
part '_bulk_operations_builder.dart';
part '_cte_builder.dart';
part '_delete_query_builder.dart';
part '_insert_query_builder.dart';
part '_join_clause_builder.dart';
part '_query_executor_builder.dart';
part '_select_query_builder.dart';
part '_union_clause_builder.dart';
part '_update_query_builder.dart';
part '_where_clauses_builder.dart';
part '_window_functions_builder.dart';

typedef QueryCallback = QueryBuilder Function(QueryBuilder qb);

abstract class QueryBuilder
    implements
        InsertQueryBuilder,
        UpdateQueryBuilder,
        WhereClausesBuilder,
        SelectQueryBuilder,
        DeleteQueryBuilder,
        UnionClauseBuilder,
        JoinClauseBuilder,
        QueryExecutorBuilder,
        WindowFunctionsBuilder,
        CteBuilder,
        BulkOperationsBuilder {
  @protected
  final List<String> conditions = [];
  @protected
  final Map<String, dynamic> bindings = {};
  @protected
  List<String> selectColumns = [];
  @protected
  List<String> joins = [];
  @protected
  List<String> unions = [];

  @protected
  String build({String? aggregateFunction, String? aggregateColumn});
  String toSql();
  String toRawSql();

  @protected
  DatabaseConnection? get dbConnection =>
      ConnectionManager().connection(connectionName);

  @protected
  String get getTable => '';

  String? get connectionName;

  Future<DatabaseConnection> getConnection() async {
    if (!ConnectionManager().isConnected) {
      throw InvalidArgumentException('No database connection found.');
    }

    return dbConnection!;
  }

  QueryBuilder connection([String? connection]);

  QueryBuilder table(String table, [String? as]);

  RawExpression raw(String value);

  Future<bool> transaction(
    Future<bool> Function() action, [
    String? conditionName,
  ]);

  Stream<DatabaseAlert> alerts();
  Map<String, PerformanceStats> getPerformanceStats();

  Map<String, dynamic> getBindings() {
    return bindings;
  }

  @protected
  String buildJoins() {
    return joins.isNotEmpty ? " ${joins.join(" ")}" : "";
  }

  @protected
  String buildWhereClause() {
    return conditions.isNotEmpty ? "WHERE ${conditions.join(" ")}" : "";
  }

  @protected
  String formatValue(dynamic value) {
    if (value is num) return value.toString();
    return "'$value'";
  }

  QueryBuilder groupBy(List<String> groups);
  QueryBuilder having(
    String column, [
    String? operator,
    dynamic value,
    String boolean = 'and',
  ]);

  QueryBuilder havingBetween(
    String column,
    List<dynamic> values, {
    String boolean = 'and',
    bool not = false,
  });
  QueryBuilder inRandomOrder([dynamic seed]);
  QueryBuilder latest([String column = 'created_at']);

  QueryBuilder limit(int value);
  QueryBuilder offset(int value);

  QueryBuilder orderBy(String column, [String direction = 'ASC']);

  QueryBuilder orderByAsc(String column);

  QueryBuilder orderByDesc(String column);
  QueryBuilder reorder([String? column, String? direction]);

  QueryBuilder skip(int value);

  QueryBuilder take(int value);
}


================================================
FILE: lib/src/contract/http/request/form_validation.dart
================================================
import '../../../http/validation/custom_validation_rule.dart';

abstract class FormValidation {
  dynamic rules();
  List<CustomValidationRule> customRule() => [];
  Map<String, String> messages() => {};
  bool authorize() => true;
}


================================================
FILE: lib/src/contract/orm/morph_relation.dart
================================================
import 'package:vania/src/contract/orm/relation.dart';

abstract class MorphRelation extends Relation {
  final String morphKey;
  final String morphType;
  final String? type;
  final String? pivotTable;
  final String? relatedMorphKey;
  MorphRelation({
    required super.related,
    required super.parent,
    required this.morphKey,
    required this.morphType,
    this.pivotTable,
    this.relatedMorphKey,
    super.localKey = 'id',
    this.type,
  });
}


================================================
FILE: lib/src/contract/orm/relation.dart
================================================
import '../../database/orm/model.dart';

abstract class Relation {
  final Model related;
  final Model parent;
  String? foreignKey;
  String localKey;

  Relation({
    required this.related,
    required this.parent,
    this.foreignKey,
    this.localKey = 'id',
  });

  Map<String, List<Map<String, dynamic>>> buildDictionary(
    List<Map<String, dynamic>> results,
    String key,
  ) {
    Map<String, List<Map<String, dynamic>>> dictionary = {};

    for (var result in results) {
      String modelKey = result[key].toString();
      if (!dictionary.containsKey(modelKey)) {
        dictionary[modelKey] = [];
      }
      dictionary[modelKey]!.add(result);
    }

    return dictionary;
  }

  List<Map<String, dynamic>> match(
    List<Map<String, dynamic>> models,
    List<Map<String, dynamic>> results,
    String relation,
  );

  List<Map<String, dynamic>> matchOneOrMany(
    List<Map<String, dynamic>> models,
    List<Map<String, dynamic>> results,
    String relation,
    String parentKey,
    String relatedKey,
  ) {
    Map<String, Map<String, dynamic>> dictionary = {};

    for (var result in results) {
      String key = result[relatedKey].toString();
      dictionary[key] = result;
    }

    models = models.map((model) {
      String key = model[parentKey].toString();
      Map<String, dynamic> cloneModel = Map.from(model);
      if (dictionary.containsKey(key)) {
        cloneModel[relation] = dictionary[key];
      } else {
        cloneModel[relation] = null;
      }
      return cloneModel;
    }).toList();

    return models;
  }

  List<Map<String, dynamic>> matchToMany(
    List<Map<String, dynamic>> parents,
    List<Map<String, dynamic>> results,
    String relation,
    String parentLocalKey,
    String parentPivotKey,
    String relatedPivotKey, {
    List<String> pivotFields = const [],
  }) {
    final lookup = <dynamic, List<Map<String, dynamic>>>{};
    for (var row in results) {
      final pivotVal = row[parentPivotKey];
      lookup.putIfAbsent(pivotVal, () => []).add(row);
    }
    return parents.map((parent) {
      final cloned = Map<String, dynamic>.from(parent);
      final primaryVal = parent[parentLocalKey];
      final joinedRows = lookup[primaryVal] ?? [];

      final relatedList = joinedRows.map((row) {
        final relatedData = Map<String, dynamic>.from(row)
          ..remove(parentPivotKey)
          ..remove(relatedPivotKey)
          ..removeWhere((k, _) => pivotFields.contains(k));
        return relatedData;
      }).toList();

      cloned[relation] = relatedList;
      return cloned;
    }).toList();
  }

  /// Match many related models to parents (for normal relations)
  List<Map<String, dynamic>> matchMany(
    List<Map<String, dynamic>> models,
    List<Map<String, dynamic>> results,
    String relation,
    String parentKey,
    String relatedKey,
  ) {
    if (results.isEmpty || models.isEmpty) {
      return models;
    }
    Map<dynamic, List<Map<String, dynamic>>> dictionary = {};

    for (var result in results) {
      final key = result[relatedKey];
      if (!dictionary.containsKey(key)) {
        dictionary[key] = [];
      }
      dictionary[key]!.add(result);
    }

    models = models.map<Map<String, dynamic>>((Map<String, dynamic> model) {
      final key = model[parentKey];
      Map<String, dynamic> cloneModel = Map.from(model);
      if (dictionary.containsKey(key)) {
        cloneModel[relation] = dictionary[key];
      } else {
        cloneModel[relation] = [];
      }
      return cloneModel;
    }).toList();

    return models;
  }

  /// Match many related morph models to parents.
  /// Only includes results where the morph type (at column [typeKey]) equals [expectedType].
  List<Map<String, dynamic>> matchMorphMany(
    List<Map<String, dynamic>> models,
    List<Map<String, dynamic>> results,
    String relation,
    String parentKey,
    String relatedIdKey,
    String typeKey,
    String expectedType,
  ) {
    Map<String, List<Map<String, dynamic>>> dictionary = {};
    for (var result in results) {
      if (result[typeKey]?.toString() == expectedType) {
        String key = result[relatedIdKey].toString();
        if (!dictionary.containsKey(key)) {
          dictionary[key] = [];
        }
        dictionary[key]!.add(result);
      }
    }

    models = models.map((model) {
      String key = model[parentKey].toString();
      Map<String, dynamic> cloneModel = Map.from(model);
      if (dictionary.containsKey(key)) {
        cloneModel[relation] = dictionary[key];
      } else {
        cloneModel[relation] = <Map<String, dynamic>>[];
      }
      return cloneModel;
    }).toList();

    return models;
  }

  List<Map<String, dynamic>> matchMorphToOne(
    List<Map<String, dynamic>> parents,
    List<Map<String, dynamic>> results,
    String relation,
    String morphKey,
    String relatedKey,
  ) {
    final dict = <String, Map<String, dynamic>>{};
    for (var row in results) {
      final key = row[relatedKey].toString();
      dict[key] = row;
    }
    return parents.map((parent) {
      final clone = Map<String, dynamic>.from(parent);
      final lookupKey = parent[morphKey]?.toString();
      clone[relation] = lookupKey != null ? dict[lookupKey] : null;
      return clone;
    }).toList();
  }

  /// Match one related morph model to parents (for hasOne polymorphic relation).
  /// Only includes results where [typeKey] equals [expectedType] and returns only the first matching result.
  List<Map<String, dynamic>> matchMorphOneOrMany(
    List<Map<String, dynamic>> models,
    List<Map<String, dynamic>> results,
    String relation,
    String parentKey,
    String relatedIdKey,
    String typeKey,
    String expectedType,
  ) {
    Map<String, Map<String, dynamic>> dictionary = {};
    for (var result in results) {
      if (result[typeKey]?.toString().toLowerCase() == expectedType) {
        String key = result[relatedIdKey].toString();
        if (!dictionary.containsKey(key)) {
          dictionary[key] = result;
        }
      }
    }
    models = models.map((model) {
      String key = model[parentKey].toString();
      Map<String, dynamic> cloneModel = Map.from(model);
      if (dictionary.containsKey(key)) {
        cloneModel[relation] = dictionary[key];
      } else {
        cloneModel[relation] = null;
      }
      return cloneModel;
    }).toList();

    return models;
  }
}


================================================
FILE: lib/src/cryptographic/hash.dart
================================================
import 'dart:convert';
import 'dart:math';
import 'package:crypto/crypto.dart';
import 'package:vania/src/utils/helper.dart' show env;

class Hash {
  static final Hash _singleton = Hash._internal();
  factory Hash() => _singleton;
  Hash._internal();

  String? _hashKey;

  Hash setHashKey(String hashKey) {
    _hashKey = hashKey;
    return this;
  }

  /// Generates a hashed password using PBKDF2.
  ///
  /// This method creates a unique salt and uses it along with the given
  /// password to generate a hash using the PBKDF2 algorithm. The resulting
  /// hashed password is a concatenation of the salt and the hash.
  ///
  /// Returns a string containing the salt followed by the hash.

  String make(String password) {
    String salt = _generateSalt();
    String hash = _hashPbkdf2(password, salt);
    String hashedPassword = salt + hash;
    return hashedPassword;
  }

  /// Verifies that the given [plainPassword] matches the given [hashedPassword].
  ///
  /// This method works by first extracting the salt from the given [hashedPassword]
  /// and then using the extracted salt and the given [plainPassword] to generate
  /// a hash using the PBKDF2 algorithm. The resulting hash is then compared to
  /// the given [hashedPassword] to check if it matches.
  ///
  /// Returns true if the given [plainPassword] matches the given [hashedPassword],
  /// false otherwise.
  bool verify(String plainPassword, String hashedPassword) {
    int saltLength = 4;
    String salt = hashedPassword.substring(0, saltLength);
    String hash = _hashPbkdf2(plainPassword, salt);
    String saltHash = salt + hash;
    return _hashEquals(saltHash, hashedPassword);
  }

  String _generateSalt() {
    const charset =
        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    final random = Random();
    return String.fromCharCodes(
      Iterable.generate(
        4,
        (_) => charset.codeUnitAt(random.nextInt(charset.length)),
      ),
    );
  }

  /// Hashes the given [password] using the given [salt] and the APP_KEY or
  /// the given hash key.
  ///
  /// The method works by first encoding the given [salt] and [password] into bytes.
  /// These bytes are then used to compute a SHA-512 HMAC using the bytes of
  /// the hash key or the APP_KEY if no hash key is given.
  ///
  /// The resulting HMAC bytes are then encoded using Base64 and returned as a
  /// string.
  String _hashPbkdf2(String password, String salt) {
    var bytes = utf8.encode(salt + password);
    var hmac = Hmac(sha512, utf8.encode(_hashKey ?? env('APP_KEY')));
    return base64.encode(hmac.convert(bytes).bytes);
  }

  /// Compares two strings in a timing-safe manner to prevent timing attacks.
  ///
  /// This method works by first checking if the lengths of the two strings
  /// are equal. If they are not, the method immediately returns false.
  ///
  /// If the lengths are equal, the method then compares the individual characters
  /// of the two strings. If any of the characters are not equal, the method
  /// immediately returns false.
  ///
  /// If all characters are equal, the method returns true.
  bool _hashEquals(String salt, String hashedPassword) {
    if (salt.length != hashedPassword.length) {
      return false;
    }
    var result = 0;
    for (int i = 0; i < salt.length; i++) {
      result |= salt.codeUnitAt(i) ^ hashedPassword.codeUnitAt(i);
    }
    return result == 0;
  }
}


================================================
FILE: lib/src/cryptographic/vania_encryption.dart
================================================
import 'dart:convert';

import 'package:cryptography/cryptography.dart';

class VaniaEncryption {
  static final List<int> _fixedNonce = List<int>.filled(12, 0);

  /// Encrypts the given [plainText] using the provided [passphrase].
  ///
  /// This method first encodes the [plainText] using Base64 and `UTF-8` encoding.
  /// Then, it creates a cryptographic key from the [passphrase] and uses the
  /// AES encryption algorithm to encrypt the text with a predefined initialization
  /// vector (IV). The result is an encrypted string returned in Base64 format.
  ///
  /// Parameters:
  /// - [plainText]: The text to be encrypted.
  /// - [passphrase]: The passphrase used to generate the encryption key.
  ///
  /// Returns:
  /// A Base64 encoded string representing the encrypted text.
  static Future<String> encryptString(
    String plainText,
    String passphrase,
  ) async {
    try {
      plainText = base64.encode(utf8.encode(plainText));

      final keyBytes = utf8.encode(
        passphrase.padRight(32, '0').substring(0, 32),
      );
      final secretKey = SecretKey(keyBytes);

      final plainBytes = utf8.encode(plainText);

      final aesGcm = AesGcm.with256bits();
      final secretBox = await aesGcm.encrypt(
        plainBytes,
        secretKey: secretKey,
        nonce: _fixedNonce,
      );

      final combined = <int>[];
      combined.addAll(secretBox.nonce);
      combined.addAll(secretBox.cipherText);
      combined.addAll(secretBox.mac.bytes);

      return base64.encode(combined);
    } catch (error) {
      return '';
    }
  }

  /// Decrypts the given [encryptedText] using the provided [passphrase].
  ///
  /// This method first creates a cryptographic key from the [passphrase].
  /// It then uses the AES encryption algorithm to decrypt the [encryptedText]
  /// with a predefined initialization vector (IV). The decrypted text is
  /// decoded from Base64 and `UTF-8` encoding to return the original plaintext.
  ///
  /// Parameters:
  /// - [encryptedText]: The text to be decrypted, in Base64 format.
  /// - [passphrase]: The passphrase used to generate the decryption key.
  ///
  /// Returns:
  /// The original plaintext if decryption is successful, or an empty
  /// string if decryption fails.
  static Future<String> decryptString(
    String encryptedText,
    String passphrase,
  ) async {
    try {
      final keyBytes = utf8.encode(
        passphrase.padRight(32, '0').substring(0, 32),
      );
      final secretKey = SecretKey(keyBytes);

      // Decode the base64 encrypted text
      final encryptedBytes = base64.decode(encryptedText);

      final nonce = encryptedBytes.sublist(0, 12);
      final mac = encryptedBytes.sublist(encryptedBytes.length - 16);
      final cipherText = encryptedBytes.sublist(12, encryptedBytes.length - 16);

      final secretBox = SecretBox(cipherText, nonce: nonce, mac: Mac(mac));

      final aesGcm = AesGcm.with256bits();
      final decryptedBytes = await aesGcm.decrypt(
        secretBox,
        secretKey: secretKey,
      );
      final decryptedText = utf8.decode(decryptedBytes);
      return utf8.decode(base64.decode(decryptedText));
    } catch (error) {
      return '';
    }
  }
}


================================================
FILE: lib/src/database/_connection_manager.dart
================================================
import 'dart:async';

import 'package:vania/src/exception/database_exception.dart';

import '../contract/database/_connectors/_database_connection.dart';
import '../exception/invalid_argument_exception.dart';
import '../logger/logger.dart';
import '_connectors/_database_connection_factory.dart';
import '_connectors/_database_connection_proxy.dart';
import '_database_utils/_db_config.dart';
import 'monitoring/database_monitor.dart';

class ConnectionManager {
  static ConnectionManager? _singleton;
  final DatabaseMonitor _monitor = DatabaseMonitor();

  factory ConnectionManager() {
    _singleton ??= ConnectionManager._internal();
    return _singleton!;
  }

  ConnectionManager._internal();

  Map<String, DatabaseConnection> connectionMap = {};
  String? defaultConnection;

  bool get isConnected => connectionMap.isNotEmpty;

  DatabaseConnection? connection([String? connectionName]) {
    if (connectionName == null || connectionName.isEmpty) {
      connectionName = defaultConnection;
    }
    return connectionMap[connectionName];
  }

  Future<void> connect(DBConfig config, String connectionName) async {
    try {
      final connection = DatabaseConnectionFactory.createConnection(config);
      await connection.connect();

      final monitoredConnection = DatabaseConnectionProxy(
        connection,
        connectionName,
        _monitor,
      );
      connectionMap[connectionName] = monitoredConnection;

      if (!config.pool) {
        await _checkDatabaseHealth(monitoredConnection);
      }
    } on InvalidArgumentException catch (e) {
      Logger.log(e.message, type: Logger.ERROR);
      throw DatabaseException("Failed to connect to the database", e);
    }
  }

  Future<void> _checkDatabaseHealth(DatabaseConnection connection) async {
    Timer.periodic(Duration(minutes: 5), (timer) async {
      try {
        await connection.execute('SELECT 1;');
      } catch (_) {}
    });
  }

  Future<bool> transaction(
    Future<bool> Function() action, [
    String? connectionName,
  ]) async {
    final conn = connectionName ?? defaultConnection;
    if (conn == null) {
      throw DatabaseException("No connection specified for transaction");
    }

    DatabaseConnection? transactionConnection;

    transactionConnection = connection(connectionName);

    if (transactionConnection == null) {
      throw DatabaseException("Connection not found for transaction");
    }

    return await transactionConnection.transaction(action);
  }

  Stream<DatabaseAlert> get alerts => _monitor.alerts;
  Map<String, PerformanceStats> getPerformanceStats() =>
      _monitor.getPerformanceStats();
}


================================================
FILE: lib/src/database/_connectors/_database_connection_factory.dart
================================================
import '../../exception/invalid_argument_exception.dart';
import '../_database_utils/_db_config.dart';
import '../../contract/database/_connectors/_database_connection.dart';
import '../adapters/_mysql_connector.dart';
import '../adapters/_postgres_connector.dart';
import '../adapters/_sqlite_connector.dart';

class DatabaseConnectionFactory {
  static DatabaseConnection createConnection(DBConfig config) {
    return switch (config.driver) {
      'mysql' => MySqlConnector(config),
      'pgsql' => PostgresConnector(config),
      'sqlite' => SQLiteConnector(config),
      _ => throw InvalidArgumentException(
        "Unsupported driver [${config.driver}].",
      ),
    };
  }
}


================================================
FILE: lib/src/database/_connectors/_database_connection_proxy.dart
================================================
import 'package:vania/src/contract/database/_connectors/_database_connection.dart';
import 'package:vania/src/exception/database_exception.dart'
    show DatabaseException;

import '../../logger/logger.dart';
import '../monitoring/database_monitor.dart';

class DatabaseConnectionProxy implements DatabaseConnection {
  final DatabaseConnection _connection;
  final DatabaseMonitor _monitor;
  final String _connectionId;

  DatabaseConnectionProxy(this._connection, this._connectionId, this._monitor);

  // Expose the underlying connection for pool management
  DatabaseConnection get underlyingConnection => _connection;

  @override
  Future<void> connect() => _connection.connect();

  @override
  Future<void> close() => _connection.close();

  String _formatQuery(String? query, Map<String, dynamic> bindings) {
    if (query == null) {
      Logger.log(
        'Warning: Null query received in _formatQuery',
        type: Logger.WARNING,
      );
      return 'INVALID QUERY: NULL';
    }

    try {
      var formattedQuery = query;

      if (bindings.isEmpty) {
        return formattedQuery;
      }

      final sortedBindings = bindings.entries.toList()
        ..sort((a, b) => b.key.length.compareTo(a.key.length));

      for (var entry in sortedBindings) {
        final placeholder = ':${entry.key}';
        final value = entry.value;
        final formattedValue = _formatValue(value);
        formattedQuery = formattedQuery.replaceAll(placeholder, formattedValue);
      }

      return formattedQuery;
    } catch (e) {
      Logger.log('Error formatting query: $e', type: Logger.ERROR);
      throw DatabaseException('Error formatting query: $query', e);
    }
  }

  String _formatValue(dynamic value) {
    if (value == null) return 'NULL';
    if (value is DateTime) return "'${value.toIso8601String()}'";
    if (value is bool) return value ? '1' : '0';
    if (value is List) return value.map(_formatValue).join(', ');
    return value.toString();
  }

  @override
  Future<bool> execute(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    final startTime = DateTime.now();
    try {
      final formattedQuery = _formatQuery(query, bindings);
      final result = await _connection.execute(query, bindings);
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(_connectionId, formattedQuery, duration);
      return result;
    } catch (e) {
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(
        _connectionId,
        'Failed: ${_formatQuery(query, bindings)} - Error: $e',
        duration,
      );
      rethrow;
    }
  }

  @override
  Future<List<Map<String, dynamic>>> select(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    final startTime = DateTime.now();
    try {
      final formattedQuery = _formatQuery(query, bindings);
      final result = await _connection.select(query, bindings);
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(_connectionId, formattedQuery, duration);
      return result;
    } catch (e) {
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(
        _connectionId,
        'Failed: ${_formatQuery(query, bindings)} - Error: $e',
        duration,
      );
      rethrow;
    }
  }

  @override
  Future<dynamic> insert(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    final startTime = DateTime.now();
    try {
      final formattedQuery = _formatQuery(query, bindings);
      final result = await _connection.insert(query, bindings);
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(_connectionId, formattedQuery, duration);
      return result;
    } catch (e) {
      final duration = DateTime.now().difference(startTime);
      _monitor.recordQuery(
        _connectionId,
        'Failed: ${_formatQuery(query, bindings)} - Error: $e',
        duration,
      );
      rethrow;
    }
  }

  @override
  Future<T> transaction<T>(Future<T> Function() action) async =>
      _connection.transaction(action);
}


================================================
FILE: lib/src/database/_database_utils/_db_config.dart
================================================
class DBConfig {
  final String driver;
  final String host;
  final int port;
  final String username;
  final String password;
  final String database;
  final String collation;
  final bool sslMode;
  final bool openInMemorySQLite;
  final String? filePath;
  final String? schema;
  String? timezone;
  final bool pool;
  int poolSize;

  DBConfig({
    required this.driver,
    this.host = 'mysql',
    this.port = 3306,
    this.username = 'root',
    this.password = '',
    this.database = 'vania',
    this.timezone,
    this.filePath,
    this.sslMode = false,
    this.openInMemorySQLite = false,
    this.collation = 'utf8mb4_general_ci',
    this.schema,
    this.pool = false,
    this.poolSize = 2,
  });
}


================================================
FILE: lib/src/database/_database_utils/_paginated_result.dart
================================================
part of '../../contract/database/query_builder/query_builder.dart';

class PaginatedResult {
  final List<Map<String, dynamic>> data;
  final int currentPage;
  final int perPage;
  final int total;
  final int lastPage;
  final bool isFirst;
  final bool isLast;
  final bool hasMore;

  PaginatedResult({
    required this.data,
    required this.currentPage,
    required this.perPage,
    required this.total,
    required this.lastPage,
    required this.isFirst,
    required this.isLast,
    required this.hasMore,
  });

  Map<String, dynamic> toMap() => {
    'data': data,
    'current_page': currentPage,
    'per_page': perPage,
    'total': total,
    'last_page': lastPage,
    'is_first': isFirst,
    'is_last': isLast,
    'has_more': hasMore,
  };

  @override
  String toString() {
    return 'PaginatedResult(currentPage: $currentPage, perPage: $perPage, total: $total, lastPage: $lastPage, data: $data)';
  }
}


================================================
FILE: lib/src/database/_database_utils/_raw_expression.dart
================================================
part of '../../contract/database/query_builder/query_builder.dart';

class RawExpression {
  final String expression;
  RawExpression(this.expression);

  @override
  String toString() => expression;
}


================================================
FILE: lib/src/database/_database_utils/_singularize.dart
================================================
class Singularize {
  static String make(String tableName) {
    if (tableName.isEmpty) return tableName;

    final name = tableName.toLowerCase();

    const irregularPlurals = {
      'children': 'child',
      'people': 'person',
      'men': 'man',
      'women': 'woman',
      'feet': 'foot',
      'teeth': 'tooth',
      'geese': 'goose',
      'mice': 'mouse',
      'oxen': 'ox',
      'sheep': 'sheep',
      'deer': 'deer',
      'fish': 'fish',
      'series': 'series',
      'species': 'species',
      'data': 'datum',
      'media': 'medium',
      'criteria': 'criterion',
      'phenomena': 'phenomenon',
      'alumni': 'alumnus',
      'cacti': 'cactus',
      'foci': 'focus',
      'fungi': 'fungus',
      'nuclei': 'nucleus',
      'radii': 'radius',
      'stimuli': 'stimulus',
      'syllabi': 'syllabus',
      'analyses': 'analysis',
      'bases': 'basis',
      'crises': 'crisis',
      'diagnoses': 'diagnosis',
      'hypotheses': 'hypothesis',
      'oases': 'oasis',
      'parentheses': 'parenthesis',
      'synopses': 'synopsis',
      'theses': 'thesis',
    };

    if (irregularPlurals.containsKey(name)) {
      return _preserveCase(tableName, irregularPlurals[name]!);
    }

    if (name.endsWith('ies') && name.length > 3) {
      return _preserveCase(tableName, '${name.substring(0, name.length - 3)}y');
    }

    if (name.endsWith('ves') && name.length > 3) {
      final stem = name.substring(0, name.length - 3);
      if (stem.endsWith('l') || stem.endsWith('r')) {
        return _preserveCase(tableName, '${stem}f');
      } else {
        return _preserveCase(tableName, '${stem}fe');
      }
    }

    if (name.endsWith('ses') && name.length > 3) {
      return _preserveCase(tableName, name.substring(0, name.length - 2));
    }
    if ((name.endsWith('ches') ||
            name.endsWith('shes') ||
            name.endsWith('xes') ||
            name.endsWith('zes')) &&
        name.length > 3) {
      return _preserveCase(tableName, name.substring(0, name.length - 2));
    }

    if (name.endsWith('oes') && name.length > 3) {
      return _preserveCase(tableName, name.substring(0, name.length - 2));
    }

    if (name.endsWith('i') && name.length > 2) {
      final stem = name.substring(0, name.length - 1);
      if (stem.endsWith('cact') ||
          stem.endsWith('fung') ||
          stem.endsWith('nucle') ||
          stem.endsWith('radi') ||
          stem.endsWith('stimul') ||
          stem.endsWith('syllab')) {
        return _preserveCase(tableName, '${stem}us');
      }
    }

    if (name.endsWith('a') && name.length > 2) {
      final stem = name.substring(0, name.length - 1);
      if (stem.endsWith('dat')) {
        return _preserveCase(tableName, '${stem}um');
      } else if (stem.endsWith('criteri') || stem.endsWith('phenomen')) {
        return _preserveCase(tableName, '${stem}on');
      }
    }

    if (name.endsWith('s') &&
        name.length > 1 &&
        !name.endsWith('ss') &&
        !name.endsWith('us') &&
        !name.endsWith('is')) {
      return _preserveCase(tableName, name.substring(0, name.length - 1));
    }

    return tableName;
  }

  static String pluralize(String word) {
    if (word.isEmpty) return word;

    final name = word.toLowerCase();

    const irregularSingulars = {
      'child': 'children',
      'person': 'people',
      'man': 'men',
      'woman': 'women',
      'foot': 'feet',
      'tooth': 'teeth',
      'goose': 'geese',
      'mouse': 'mice',
      'ox': 'oxen',
      'sheep': 'sheep',
      'deer': 'deer',
      'fish': 'fish',
      'series': 'series',
      'species': 'species',
      'datum': 'data',
      'medium': 'media',
      'criterion': 'criteria',
      'phenomenon': 'phenomena',
      'alumnus': 'alumni',
      'cactus': 'cacti',
      'focus': 'foci',
      'fungus': 'fungi',
      'nucleus': 'nuclei',
      'radius': 'radii',
      'stimulus': 'stimuli',
      'syllabus': 'syllabi',
      'analysis': 'analyses',
      'basis': 'bases',
      'crisis': 'crises',
      'diagnosis': 'diagnoses',
      'hypothesis': 'hypotheses',
      'oasis': 'oases',
      'parenthesis': 'parentheses',
      'synopsis': 'synopses',
      'thesis': 'theses',
    };

    if (irregularSingulars.containsKey(name)) {
      return _preserveCase(word, irregularSingulars[name]!);
    }

    if (name.endsWith('y') && name.length > 1) {
      final precedingChar = name[name.length - 2];
      if (!'aeiou'.contains(precedingChar)) {
        return _preserveCase(word, '${name.substring(0, name.length - 1)}ies');
      }
    }

    if (name.endsWith('f') && name.length > 1) {
      return _preserveCase(word, '${name.substring(0, name.length - 1)}ves');
    }
    if (name.endsWith('fe') && name.length > 2) {
      return _preserveCase(word, '${name.substring(0, name.length - 2)}ves');
    }

    if (name.endsWith('s') ||
        name.endsWith('ss') ||
        name.endsWith('sh') ||
        name.endsWith('ch') ||
        name.endsWith('x') ||
        name.endsWith('z')) {
      return _preserveCase(word, '${name}es');
    }

    if (name.endsWith('o') && name.length > 1) {
      final precedingChar = name[name.length - 2];
      if (!'aeiou'.contains(precedingChar)) {
        return _preserveCase(word, '${name}es');
      }
    }

    if (name.endsWith('us') && name.length > 2) {
      final stem = name.substring(0, name.length - 2);
      if (stem.endsWith('cact') ||
          stem.endsWith('foc') ||
          stem.endsWith('fung') ||
          stem.endsWith('nucle') ||
          stem.endsWith('radi') ||
          stem.endsWith('stimul') ||
          stem.endsWith('syllab')) {
        return _preserveCase(word, '${stem}i');
      }
    }

    if (name.endsWith('um') && name.length > 2) {
      final stem = name.substring(0, name.length - 2);
      if (stem.endsWith('dat')) {
        return _preserveCase(word, '${stem}a');
      }
    }

    if (name.endsWith('on') && name.length > 2) {
      final stem = name.substring(0, name.length - 2);
      if (stem.endsWith('criteri') || stem.endsWith('phenomen')) {
        return _preserveCase(word, '${stem}a');
      }
    }

    return _preserveCase(word, '${name}s');
  }

  static String _preserveCase(String original, String converted) {
    if (original.isEmpty || converted.isEmpty) return converted;

    if (original == original.toUpperCase()) {
      return converted.toUpperCase();
    }

    if (original[0] == original[0].toUpperCase()) {
      return '${converted[0].toUpperCase()}${converted.substring(1)}';
    }

    return converted;
  }

  static bool isPlural(String word) {
    if (word.isEmpty) return false;

    final name = word.toLowerCase();

    const irregularPlurals = {
      'children',
      'people',
      'men',
      'women',
      'feet',
      'teeth',
      'geese',
      'mice',
      'oxen',
      'data',
      'media',
      'criteria',
      'phenomena',
      'alumni',
      'cacti',
      'foci',
      'fungi',
      'nuclei',
      'radii',
      'stimuli',
      'syllabi',
      'analyses',
      'bases',
      'crises',
      'diagnoses',
      'hypotheses',
      'oases',
      'parentheses',
      'synopses',
      'theses',
    };

    if (irregularPlurals.contains(name)) return true;

    if (name.endsWith('ies') && name.length > 3) return true;
    if (name.endsWith('ves') && name.length > 3) return true;
    if (name.endsWith('ses') && name.length > 3) return true;
    if ((name.endsWith('ches') ||
            name.endsWith('shes') ||
            name.endsWith('xes') ||
            name.endsWith('zes')) &&
        name.length > 3) {
      return true;
    }
    if (name.endsWith('oes') && name.length > 3) return true;
    if (name.endsWith('s') &&
        name.length > 1 &&
        !name.endsWith('ss') &&
        !name.endsWith('us') &&
        !name.endsWith('is')) {
      return true;
    }

    return false;
  }

  static bool isSingular(String word) {
    return !isPlural(word);
  }
}


================================================
FILE: lib/src/database/adapters/_mysql_connector.dart
================================================
import 'dart:convert';

import 'package:mysql_client/mysql_client.dart';

import '../../exception/database_exception.dart';
import '../_database_utils/_db_config.dart';
import '../../contract/database/_connectors/_database_connection.dart';

class MySqlConnector implements DatabaseConnection {
  final DBConfig config;
  late dynamic _connection;
  bool _isPool = false;

  MySqlConnector(this.config);

  @override
  Future<void> close() async {
    await _connection.close();
  }

  @override
  Future<void> connect() async {
    try {
      if (config.pool) {
        _isPool = true;
        _connection = MySQLConnectionPool(
          host: config.host,
          port: config.port,
          userName: config.username,
          password: config.password,
          databaseName: config.database,
          collation: config.collation,
          secure: config.sslMode,
          maxConnections: config.poolSize,
        );
      } else {
        _isPool = false;
        _connection = await MySQLConnection.createConnection(
          host: config.host,
          port: config.port,
          userName: config.username,
          password: config.password,
          databaseName: config.database,
          collation: config.collation,
          secure: config.sslMode,
        );
        await _connection.connect();
      }
    } catch (e) {
      throw DatabaseException('Database connection failed', e);
    }
  }

  @override
  Future<bool> execute(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      await _connection.execute(query, bindings);
      return true;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future<T> transaction<T>(Future<T> Function() action) async {
    try {
      if (_isPool) {
        return await (_connection as MySQLConnectionPool).transactional<T>((
          txConn,
        ) async {
          final previous = _connection;
          _connection = txConn;
          _isPool = false;
          try {
            return await action();
          } finally {
            _isPool = true;
            _connection = previous;
          }
        });
      } else {
        return await (_connection as MySQLConnection).transactional<T>((
          txConn,
        ) async {
          final previous = _connection;
          _connection = txConn;
          try {
            return await action();
          } finally {
            _connection = previous;
          }
        });
      }
    } catch (e) {
      throw DatabaseException('Transaction failed', e);
    }
  }

  @override
  Future<List<Map<String, dynamic>>> select(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final IResultSet results;

      if (_isPool) {
        results = await (_connection as MySQLConnectionPool).execute(
          query,
          bindings,
        );
      } else {
        results = await (_connection as MySQLConnection).execute(
          query,
          bindings,
        );
      }
      if (results.rows.isEmpty) {
        return [];
      }

      return results.rows.map((item) => item.assoc()).toList().map((row) {
        final newRow = Map<String, dynamic>.from(row);
        newRow.forEach((key, value) {
          if (value is List<int>) {
            try {
              newRow[key] = utf8.decode(value);
            } catch (e) {
              newRow[key] = value;
            }
          }
        });
        return newRow;
      }).toList();
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future insert(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final IResultSet results;
      if (_isPool) {
        results = await (_connection as MySQLConnectionPool).execute(
          query,
          bindings,
        );
      } else {
        results = await (_connection as MySQLConnection).execute(
          query,
          bindings,
        );
      }
      return results.lastInsertID;
    } catch (e) {
      rethrow;
    }
  }
}


================================================
FILE: lib/src/database/adapters/_postgres_connector.dart
================================================
import 'dart:convert';

import 'package:postgres/postgres.dart';
import 'package:vania/src/exception/database_exception.dart';
import '../_database_utils/_db_config.dart';

import '../../contract/database/_connectors/_database_connection.dart';

class PostgresConnector implements DatabaseConnection {
  final DBConfig config;
  late dynamic _connection;

  PostgresConnector(this.config);

  @override
  Future<void> close() async {
    await _connection.close();
  }

  Encoding _getEncoding(String encoding) {
    switch (encoding.toLowerCase()) {
      case 'utf8':
        return Utf8Codec();
      case 'ascii':
        return AsciiCodec();
      case 'latin1':
        return Latin1Codec();
      case 'iso-8859-1':
        return Latin1Codec();
      default:
        return Utf8Codec(allowMalformed: true);
    }
  }

  Future<void> _onOpen(Connection conn, DBConfig configParser) async {
    await conn.execute("SET client_encoding = '${configParser.collation}'");
    if (configParser.schema != null) {
      await conn.execute("SET search_path TO ${configParser.schema}");
    }
    if (configParser.timezone != null) {
      await conn.execute("SET timezone TO '${configParser.timezone}'");
    }
  }

  @override
  Future<void> connect() async {
    final endpoint = Endpoint(
      host: config.host,
      port: config.port,
      database: config.database,
      username: config.username,
      password: config.password,
    );

    final sslMode = config.sslMode ? SslMode.require : SslMode.disable;

    try {
      if (config.pool == true) {
        _connection = Pool.withEndpoints(
          [endpoint],
          settings: PoolSettings(
            timeZone: config.timezone,
            maxConnectionCount: config.poolSize,
            encoding: _getEncoding(config.collation),
            onOpen: (conn) async {
              await _onOpen(conn, config);
            },
            sslMode: sslMode,
          ),
        );
      } else {
        _connection = await Connection.open(
          endpoint,
          settings: ConnectionSettings(
            timeZone: config.timezone,
            encoding: _getEncoding(config.collation),
            sslMode: sslMode,
            onOpen: (conn) async {
              await _onOpen(conn, config);
            },
          ),
        );
      }
    } catch (e) {
      throw DatabaseException('Database connection failed', e);
    }
  }

  @override
  Future<bool> execute(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final result = await _connection.execute(
        Sql.named(query.replaceAll(':p', '@p')),
        parameters: bindings,
      );
      return result.affectedRows > 0;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future<List<Map<String, dynamic>>> select(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final sql = Sql.named(query.replaceAll(':p', '@p'));

      final result = await _connection.execute(sql, parameters: bindings);
      final rows = result.map((row) => row.toColumnMap()).toList();
      final maps = <Map<String, dynamic>>[];
      if (rows.isNotEmpty) {
        for (final row in rows) {
          final map = <String, dynamic>{};
          for (final col in row.entries) {
            final key = col.key;
            final value = col.value is UndecodedBytes
                ? col.value.asString
                : col.value;
            map.addAll({key: value});
          }
          maps.add(map);
        }
      }
      return maps;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future insert(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final result = await _connection.execute(
        Sql.named(query.replaceAll(':p', '@p')),
        parameters: bindings,
      );
      return result.affectedRows;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future<T> transaction<T>(Future<T> Function() action) async {
    return await _connection.runTx<T>((ctx) async {
      final prev = _connection;
      _connection = ctx;
      try {
        return await action();
      } finally {
        _connection = prev;
      }
    });
  }
}


================================================
FILE: lib/src/database/adapters/_sqlite_connector.dart
================================================
import 'dart:ffi';
import 'dart:io';
import 'package:path/path.dart';
import 'package:sqlite3/open.dart';
import 'package:sqlite3/sqlite3.dart';
import 'package:vania/src/contract/database/_connectors/_database_connection.dart';
import 'package:vania/src/exception/database_exception.dart';
import '../../utils/helper.dart' show env;
import '../_database_utils/_db_config.dart';

class SQLiteConnector implements DatabaseConnection {
  final DBConfig config;
  late Database _connection;

  SQLiteConnector(this.config);

  @override
  Future<void> close() async {
    _connection.dispose();
  }

  @override
  Future<void> connect() async {
    try {
      open.overrideFor(OperatingSystem.linux, _openOnLinux);

      if (config.openInMemorySQLite) {
        _connection = sqlite3.openInMemory();
      } else {
        _connection = sqlite3.open(
          config.filePath ?? '${env<String?>('APP_NAME', 'Vania')}.db',
        );
      }
    } catch (e) {
      throw DatabaseException('Database connection failed', e);
    }
  }

  DynamicLibrary _openOnLinux() {
    final scriptDir = File(Platform.script.toFilePath()).parent;

    final libraryNextToScript = File(join(scriptDir.path, 'sqlite3.so'));

    return DynamicLibrary.open(libraryNextToScript.path);
  }

  List<dynamic> _convertBindingsToList(
    Map<String, dynamic> bindings,
    String query,
  ) {
    if (bindings.isEmpty) return [];

    final List<dynamic> result = [];
    final parameterRegex = RegExp(r':(\w+)');

    final matches = parameterRegex.allMatches(query);
    for (final match in matches) {
      final paramName = match.group(1)!;
      if (bindings.containsKey(paramName)) {
        result.add(bindings[paramName]);
      }
    }

    return result;
  }

  String _convertNamedParamsToPositional(String query) {
    return query.replaceAllMapped(RegExp(r':(\w+)'), (match) => '?');
  }

  @override
  Future<bool> execute(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final positionalQuery = _convertNamedParamsToPositional(query);
      final params = _convertBindingsToList(bindings, query);

      final stmt = _connection.prepare(positionalQuery);
      stmt.execute(params);
      stmt.dispose();

      return true;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future<List<Map<String, dynamic>>> select(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final positionalQuery = _convertNamedParamsToPositional(query);
      final params = _convertBindingsToList(bindings, query);

      final stmt = _connection.prepare(positionalQuery);
      final results = stmt.select(params);

      final List<Map<String, dynamic>> rows = [];
      final columns = results.isEmpty ? [] : results.first.keys.toList();

      for (final row in results) {
        final map = <String, dynamic>{};
        for (var i = 0; i < columns.length; i++) {
          map[columns[i]] = row[i.toString()];
        }
        rows.add(map);
      }

      stmt.dispose();
      return rows;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future insert(
    String query, [
    Map<String, dynamic> bindings = const {},
  ]) async {
    try {
      final positionalQuery = _convertNamedParamsToPositional(query);
      final params = _convertBindingsToList(bindings, query);

      final stmt = _connection.prepare(positionalQuery);
      stmt.execute(params);
      final id = _connection.lastInsertRowId;
      stmt.dispose();

      return id;
    } catch (e) {
      rethrow;
    }
  }

  @override
  Future<T> transaction<T>(Future<T> Function() action) {
    throw UnimplementedError();
  }
}


================================================
FILE: lib/src/database/db.dart
================================================
// ignore_for_file: non_constant_identifier_names

import '../contract/database/query_builder/query_builder.dart';
import 'query_builder/_query_builder_impl.dart' show QueryBuilderImpl;

QueryBuilder get DB => QueryBuilderImpl();


================================================
FILE: lib/src/database/isolate_db.dart
================================================
import 'dart:isolate';

import '_connection_manager.dart';
import '_database_utils/_db_config.dart';

class IsolateDB {
  static Future<T> run<T>(
    Future<T> Function() callback,
    Map<String, dynamic> dbConfig,
  ) async {
    return await Isolate.run(() async {
      ConnectionManager().defaultConnection = dbConfig['driver'];
      final config = DBConfig(
        driver: dbConfig['driver'] ?? '',
        host: dbConfig['host'] ?? '',
        port: dbConfig['port'] ?? 3306,
        database: dbConfig['database'] ?? '',
        username: dbConfig['username'] ?? '',
        password: dbConfig['password'] ?? '',
        sslMode: dbConfig['sslmode'] ?? false,
        collation: dbConfig['collation'] ?? 'utf8mb4_general_ci',
        pool: false,
        poolSize: 0,
        filePath: dbConfig['file_path'],
        openInMemorySQLite: dbConfig['openInMemorySQLite'] ?? false,
      );
      try {
        await ConnectionManager().connect(config, dbConfig['driver']);
        return await callback();
      } finally {
        await ConnectionManager().connection(dbConfig['driver'])?.close();
      }
    });
  }
}


================================================
FILE: lib/src/database/migration/adapters/grammar/mysql_grammar.dart
================================================
import 'sql_grammar.dart';

class MySqlGrammar extends BaseGrammar {
  @override
  String get identifierQuote => '`';

  @override
  Map<String, String> get dataTypeMappings => {};

  @override
  Map<String, String> get keywordReplacements => {};

  @override
  Map<String, String Function(Match)> get regexTransformations => {};

  @override
  String convertQuery(String query) {
    return _cleanupQuery(query);
  }

  String _cleanupQuery(String query) {
    return query
        .replaceAll(RegExp(r'\s+'), ' ')
        .replaceAll(',,', ',')
        .replaceAll(RegExp(r',\s?\)'), ')')
        .trim();
  }
}


================================================
FILE: lib/src/database/migration/adapters/grammar/postgresql_grammar.dart
================================================
import 'sql_grammar.dart';

/// PostgreSQL-specific SQL grammar (Single Responsibility Principle)
class PostgreSqlGrammar extends BaseGrammar {
  @override
  String get identifierQuote => '"';

  @override
  Map<String, String> get dataTypeMappings => {
    // Integer types
    r'BIGINT\(\d+\)': 'BIGINT',
    r'MEDIUMINT\(\d+\)': 'INTEGER',
    r'SMALLINT\(\d+\)': 'SMALLINT',
    r'TINYINT\(\d+\)': 'SMALLINT',

    // Binary types
    r'BINARY\(\d+\)': 'BYTEA',
    r'VARBINARY\(\d+\)': 'BYTEA',
    r'BIT\(\d+\)': 'BOOLEAN',

    // Date/time types
    r'DATETIME\(\d+\)': 'TIMESTAMP',
    r'TIME\(\d+\)': 'TIME',

    // Floating point types
    r'DOUBLE\(\d+\)': 'DOUBLE PRECISION',

    // BLOB types
    'TINYBLOB': 'BYTEA',
    'BLOB': 'BYTEA',
    'MEDIUMBLOB': 'BYTEA',
    'LONGBLOB': 'BYTEA',
    'VARBYTEA': 'BYTEA',
    'MEDIUMBYTEA': 'BYTEA',
    'LONGBYTEA': 'BYTEA',

    // Text types
    'TINYTEXT': 'TEXT',
    'MEDIUMTEXT': 'TEXT',
    r'LONGTEXT\(\d+\)': 'TEXT',

    // Geometry types
    'LINESTRING': 'LINE',
  };

  @override
  Map<String, String> get keywordReplacements => {
    'UNSIGNED': '',
    'ZEROFILL': '',
    'AUTO_INCREMENT': '',
    r"COLLATE '[\w\d_-]+'": '',
    r"ENGINE\s*=\s*\w+": '',
    r"COMMENT\s+'[^']*'": '',
  };

  @override
  Map<String, String Function(Match)> get regexTransformations => {
    // Auto-increment primary key transformation - handle table.id() pattern
    r'[`"](\w+)[`"]\s+BIGINT(?:\(\d+\))?\s+(?:UNSIGNED\s+)?NOT\s+NULL\s+AUTO_INCREMENT':
        (match) => '"${match[1]}" SERIAL NOT NULL PRIMARY KEY',

    r'\s+ON\s+UPDATE\s+CURRENT_TIMESTAMP': (match) => '',
    r'ON\s+UPDATE\s+CURRENT_TIMESTAMP': (match) => '',

    // Handle `BIGINT` NOT NULL without AUTO_INCREMENT but with separate PRIMARY KEY
    r'[`"](\w+)[`"]\s+BIGINT(?:\(\d+\))?\s+(?:UNSIGNED\s+)?NOT\s+NULL(?!\s+AUTO_INCREMENT)':
        (match) => '"${match[1]}" BIGINT NOT NULL',

    // Remove primary key declarations when SERIAL is used
    r',\s*PRIMARY KEY \([`"][^`"]+[`"]\)': (match) => '',
    r'PRIMARY KEY \([`"][^`"]+[`"]\)\s*,?': (match) => '',

    // Remove INDEX declarations - more comprehensive patterns
    r',\s*INDEX\s+[`"][^`"]*[`"]\s*\([^)]*\)': (match) => '',
    r'INDEX\s+[`"][^`"]*[`"]\s*\([^)]*\)\s*,': (match) => '',
    r'INDEX\s+[`"][^`"]*[`"]\s*\([^)]*\)': (match) => '',

    // Remove CONSTRAINT UNIQUE (will be handled by adapter)
    r',\s*CONSTRAINT\s+[`"][^`"]*[`"]\s+UNIQUE\s*\([^)]*\)': (match) => '',
    r'CONSTRAINT\s+[`"][^`"]*[`"]\s+UNIQUE\s*\([^)]*\)\s*,': (match) => '',
    r'CONSTRAINT\s+[`"][^`"]*[`"]\s+UNIQUE\s*\([^)]*\)': (match) => '',

    // Integer type with length
    r'(^|\s|,)INT\((\d+)\)': (match) => '${match[1]}INTEGER',
    r'(^|\s|,)INTEGER\((\d+)\)': (match) => '${match[1]}INTEGER',

    // VARCHAR with length preservation
    r'VARCHAR\((\d+)\)': (match) => 'VARCHAR(${match[1]})',
    r'VARCHARACTER\((\d+)\)': (match) => 'CHARACTER(${match[1]})',

    // FLOAT conversion
    r'FLOAT\((\d+)\)': (match) => 'REAL',

    // ENUM to VARCHAR conversion
    r"ENUM\((?:'[^']*'(?:\s*,\s*'[^']*')*)\)": (match) => 'VARCHAR',

    // Clean up empty spaces and commas that result from removals
    r',\s*,+': (match) => ',',
    r'^\s*,': (match) => '',
    r',\s*\)': (match) => ')',
    r'\(\s*,': (match) => '(',
  };

  @override
  String convertQuery(String query) {
    String result = super.convertQuery(query);

    // Additional PostgreSQL-specific cleanup
    result = _postgresqlSpecificCleanup(result);

    return result;
  }

  /// PostgreSQL-specific cleanup operations
  String _postgresqlSpecificCleanup(String query) {
    return query
        // Remove any remaining double commas
        .replaceAll(RegExp(r',\s*,+'), ',')
        // Remove leading commas
        .replaceAll(RegExp(r'^\s*,'), '')
        // Remove trailing commas before closing parenthesis
        .replaceAll(RegExp(r',\s*\)'), ')')
        // Remove extra spaces
        .replaceAll(RegExp(r'\s+'), ' ')
        // Clean up any remaining issues
        .trim();
  }
}


================================================
FILE: lib/src/database/migration/adapters/grammar/sql_grammar.dart
================================================
abstract class SqlGrammar {
  String convertQuery(String query);

  String get identifierQuote;

  Map<String, String> get dataTypeMappings;

  Map<String, String> get keywordReplacements;

  Map<String, String Function(Match)> get regexTransformations;
}

abstract class BaseGrammar implements SqlGrammar {
  @override
  String convertQuery(String query) {
    String result = query;

    for (final entry in regexTransformations.entries) {
      result = result.replaceAllMapped(
        RegExp(entry.key, caseSensitive: false),
        entry.value,
      );
    }

    for (final entry in keywordReplacements.entries) {
      result = result.replaceAll(
        RegExp(entry.key, caseSensitive: false),
        entry.value,
      );
    }

    for (final entry in dataTypeMappings.entries) {
      result = result.replaceAll(
        RegExp(entry.key, caseSensitive: false),
        entry.value,
      );
    }

    result = result.replaceAll('`', identifierQuote);

    result = _cleanupQuery(result);

    return result;
  }

  String _cleanupQuery(String query) {
    return query
        .replaceAll(RegExp(r'\s+'), ' ')
        .replaceAll(',,', ',')
        .replaceAll(RegExp(r',\s?\)'), ')')
        .trim();
  }
}


================================================
FILE: lib/src/database/migration/adapters/grammar/sqlite_grammar.dart
================================================
import 'sql_grammar.dart';

class SqliteGrammar extends BaseGrammar {
  @override
  String get identifierQuote => '"';

  @override
  Map<String, String> get dataTypeMappings => {
    // Integer types - SQLite uses INTEGER for all integer types
    r'BIGINT\(\d+\)': 'INTEGER',
    r'MEDIUMINT\(\d+\)': 'INTEGER',
    r'SMALLINT\(\d+\)': 'INTEGER',
    r'TINYINT\(\d+\)': 'INTEGER',

    // Binary and bit types
    r'BINARY\(\d+\)': 'BLOB',
    r'VARBINARY\(\d+\)': 'BLOB',
    r'BIT\(\d+\)': 'INTEGER',

    // String types - SQLite uses TEXT for all string types
    r'VARCHAR\(\d+\)': 'TEXT',
    r'CHAR\(\d+\)': 'TEXT',

    // Date/time types - SQLite stores as TEXT or INTEGER
    'DATETIME': 'TEXT',
    'TIMESTAMP': 'TEXT',
    'DATE': 'TEXT',
    'TIME': 'TEXT',
    'YEAR': 'INTEGER',

    // BLOB types
    'TINYBLOB': 'BLOB',
    'BLOB': 'BLOB',
    'MEDIUMBLOB': 'BLOB',
    'LONGBLOB': 'BLOB',

    // Text types
    'TINYTEXT': 'TEXT',
    'MEDIUMTEXT': 'TEXT',
    'LONGTEXT': 'TEXT',

    // JSON - SQLite stores as TEXT
    'JSON': 'TEXT',
  };

  @override
  Map<String, String> get keywordReplacements => {
    'UNSIGNED': '',
    'ZEROFILL': '',
    'AUTO_INCREMENT': '',
    r"COLLATE\s+'[^']+'": '',
    r"ENGINE\s*=\s*\w+": '',
    r"COLLATE\s*=\s*'[^']+'": '',
  };

  @override
  Map<String, String Function(Match)> get regexTransformations => {
    // Auto-increment primary key transformation
    r'`(\w+)`\s+BIGINT\(\d+\)\s+UNSIGNED\s+NOT\s+NULL\s+AUTO_INCREMENT':
        (match) => '"${match[1]}" INTEGER PRIMARY KEY AUTOINCREMENT',

    // Remove primary key declarations (handled by AUTOINCREMENT)
    r'PRIMARY KEY \(`.*?`\) USING BTREE': (match) => '',
    r'PRIMARY KEY \(`.*?`\)': (match) => '',

    // Integer type with length
    r'(^|\s|,)INT\((\d+)\)': (match) => '${match[1]}INTEGER',
    r'(^|\s|,)INTEGER\((\d+)\)': (match) => '${match[1]}INTEGER',

    // Floating point types
    r'FLOAT\((\d+),(\d+)\)': (match) => 'REAL',
    r'DOUBLE\((\d+),(\d+)\)': (match) => 'REAL',
    r'DECIMAL\((\d+),(\d+)\)': (match) => 'REAL',

    // ENUM - SQLite doesn't have ENUM, use TEXT with CHECK constraint
    r'ENUM\(([^)]+)\)': (match) =>
        'TEXT CHECK (${_extractColumnName()} IN (${match[1]}))',
  };

  String _extractColumnName() {
    return 'column_name';
  }

  @override
  String convertQuery(String query) {
    String result = super.convertQuery(query);

    if (result.contains('TEXT CHECK (column_name IN')) {
      result = _handleEnumConstraints(query, result);
    }

    return result;
  }

  String _handleEnumConstraints(String originalQuery, String convertedQuery) {
    final enumMatch = RegExp(
      r'"?(\w+)"?\s+ENUM\(([^)]+)\)',
      caseSensitive: false,
    ).firstMatch(originalQuery);

    if (enumMatch != null) {
      final columnName = enumMatch.group(1);
      final enumValues = enumMatch.group(2);

      return convertedQuery.replaceAll(
        'TEXT CHECK (column_name IN ($enumValues))',
        'TEXT CHECK ("$columnName" IN ($enumValues))',
      );
    }

    return convertedQuery;
  }
}


================================================
FILE: lib/src/database/migration/adapters/mysql_adapter.dart
================================================
import '../contracts/database_adapter_interface.dart';
import 'grammar/mysql_grammar.dart';

class MySqlAdapter implements DatabaseAdapterInterface {
  late final MySqlGrammar _grammar;

  MySqlAdapter() {
    _grammar = MySqlGrammar();
  }

  @override
  String get driverName => 'mysql';

  @override
  String adaptQuery(String query) {
    return _grammar.convertQuery(query);
  }

  @override
  String getMigrationsTableSql() {
    return '''
CREATE TABLE IF NOT EXISTS `migrations` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`migration` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
	`batch` INT(10) UNSIGNED NOT NULL DEFAULT 1,
	PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
''';
  }

  @override
  bool supports(String driver) {
    return driver.toLowerCase() == 'mysql';
  }

  @override
  String escapeIdentifier(String identifier) {
    return '`$identifier`';
  }

  @override
  String formatValue(dynamic value) {
    if (value == null) return 'NULL';
    if (value is String) return "'${value.replaceAll("'", "''")}'";
    if (value is num) return value.toString();
    if (value is bool) return value ? '1' : '0';
    return "'$value'";
  }
}


================================================
FILE: lib/src/database/migration/adapters/postgresql_adapter.dart
================================================
import '../contracts/database_adapter_interface.dart';
import 'grammar/postgresql_grammar.dart';

class PostgreSqlAdapter implements DatabaseAdapterInterface {
  late final PostgreSqlGrammar _grammar;
  final List<String> _extractedIndexes = [];
  String? _currentTableName;

  PostgreSqlAdapter() {
    _grammar = PostgreSqlGrammar();
  }

  @override
  String get driverName => 'pgsql';

  String _cleanedQuery = '';

  @override
  String adaptQuery(String query) {
    List<String> statements = adaptQueryToStatements(query);
    return statements.join(';\n');
  }

  List<String> adaptQueryToStatements(String query) {
    _extractTableNameAndIndexes(query);

    String result = _grammar.convertQuery(_cleanedQuery);

    List<String> statements = [result];

    if (_extractedIndexes.isNotEmpty && _currentTableName != null) {
      List<String> indexStatements = _generateIndexStatements();
      statements.addAll(indexStatements);
    }

    return statements;
  }

  Future<void> executeStatements(
    String query,
    Future<void> Function(List<String>) executor,
  ) async {
    List<String> statements = adaptQueryToStatements(query);
    await executor(statements);
  }

  void _extractTableNameAndIndexes(String query) {
    _extractedIndexes.clear();
    _currentTableName = null;

    final tableNameRegex = RegExp(
      r'CREATE TABLE (?:IF NOT EXISTS )?[`"]?([^`"]+)[`"]?\s*\(',
      caseSensitive: false,
    );
    final tableMatch = tableNameRegex.firstMatch(query);
    if (tableMatch != null) {
      _currentTableName = tableMatch.group(1);
    }

    final indexRegex = RegExp(
      r'((?:SPATIAL|FULLTEXT|UNIQUE)\s+)?INDEX\s+[`"]([^`"]+)[`"]\s*\(([^)]+)\)',
      caseSensitive: false,
    );
    final rawIndexes = indexRegex.allMatches(query).toList();
    for (final m in rawIndexes) {
      final typeKey = m.group(1)?.trim().toUpperCase() ?? '';
      final name = m.group(2)!;
      final cols = m.group(3)!;
      final cleanCols = cols
          .replaceAll(RegExp(r'[`"]'), '')
          .replaceAll(RegExp(r'\s+'), ' ')
          .trim();
      _extractedIndexes.add('$name:$cleanCols:$typeKey');
    }
    query = query.replaceAll(indexRegex, '');
    query = query.replaceAll(RegExp(r',\s*\)'), ')');
    final constraintRegex = RegExp(
      r'CONSTRAINT\s+[`"]([^`"]+)[`"]\s+UNIQUE\s*\(([^)]+)\)',
      caseSensitive: false,
    );
    for (final m in constraintRegex.allMatches(query)) {
      final name = m.group(1)!;
      final cols = m.group(2)!;
      final cleanCols = cols
          .replaceAll(RegExp(r'[`"]'), '')
          .replaceAll(RegExp(r'\s+'), ' ')
          .trim();
      _extractedIndexes.add('$name:$cleanCols:UNIQUE');
    }

    _cleanedQuery = query;
  }

  List<String> _generateIndexStatements() {
    final statements = <String>[];

    for (final info in _extractedIndexes) {
      final parts = info.split(':');
      final name = parts[0];
      final cols = parts[1];
      final typeKey = parts.length > 2 ? parts[2] : '';

      final colList = cols
          .split(',')
          .map((c) => '"${c.trim()}"')
          .toList()
          .join(', ');

      final prefix = typeKey.isNotEmpty ? '$typeKey ' : '';

      final stmt =
          'CREATE ${prefix}INDEX IF NOT EXISTS "$name" '
          'ON "$_currentTableName" ($colList)';
      statements.add(stmt);
    }

    return statements;
  }

  @override
  String getMigrationsTableSql() {
    return '''
CREATE TABLE IF NOT EXISTS "migrations" (
	"id" SERIAL NOT NULL PRIMARY KEY,
	"migration" VARCHAR(255) NOT NULL,
	"batch" INTEGER NOT NULL DEFAULT 1
);
''';
  }

  @override
  bool supports(String driver) {
    final normalizedDriver = driver.toLowerCase();
    return normalizedDriver == 'pgsql' ||
        normalizedDriver == 'postgresql' ||
        normalizedDriver == 'postgres';
  }

  @override
  String escapeIdentifier(String identifier) {
    return '"$identifier"';
  }

  @override
  String formatValue(dynamic value) {
    if (value == null) return 'NULL';
    if (value is String) return "'${value.replaceAll("'", "''")}'";
    if (value is num) return value.toString();
    if (value is bool) return value ? 'TRUE' : 'FALSE';
    return "'$value'";
  }
}


================================================
FILE: lib/src/database/migration/adapters/sqlite_adapter.dart
================================================
import '../contracts/database_adapter_interface.dart';
import 'grammar/sqlite_grammar.dart';

class SqliteAdapter implements DatabaseAdapterInterface {
  late final SqliteGrammar _grammar;

  SqliteAdapter() {
    _grammar = SqliteGrammar();
  }

  @override
  String get driverName => 'sqlite';

  @override
  String adaptQuery(String query) {
    return _grammar.convertQuery(query);
  }

  @override
  String getMigrationsTableSql() {
    return '''
CREATE TABLE IF NOT EXISTS "migrations" (
	"id" INTEGER PRIMARY KEY AUTOINCREMENT,
	"migration" TEXT NOT NULL,
	"batch" INTEGER NOT NULL DEFAULT 1
);
''';
  }

  @override
  bool supports(String driver) {
    final normalizedDriver = driver.toLowerCase();
    return normalizedDriver == 'sqlite' || normalizedDriver == 'sqlite3';
  }

  @override
  String escapeIdentifier(String identifier) {
    return '"$identifier"';
  }

  @override
  String formatValue(dynamic value) {
    if (value == null) return 'NULL';
    if (value is String) return "'${value.replaceAll("'", "''")}'";
    if (value is num) return value.toString();
    if (value is bool) return value ? '1' : '0';
    return "'$value'";
  }
}


================================================
FILE: lib/src/database/migration/builders/column_definition.dart
================================================
import '../../../enum/column_index.dart';
import 'schema.dart';

class ColumnDefinition {
  final Schema _schema;
  final String _name;
  final String _type;

  bool _nullable = true;
  dynamic _length;
  bool _unsigned = false;
  bool _zeroFill = false;
  dynamic _defaultValue;
  String? _comment;
  String? _collation;
  String? _charset;
  String? _expression;
  String? _virtuality;
  bool _increment = false;
  bool _unique = false;
  String? _uniqueConstraintName;
  String? _indexName;
  ColumnIndex _indexType = ColumnIndex.indexKey;

  String? _foreignTable;
  String? _foreignColumn;
  String? _onUpdate;
  String? _onDelete;

  bool _isFinalized = false;

  ColumnDefinition(this._schema, this._name, this._type) {
    _schema.registerColumnDefinition(this);
  }

  /// Set column as NOT NULL
  ColumnDefinition notNull() {
    _nullable = false;
    return this;
  }

  /// Set column as NULLABLE
  ColumnDefinition nullable() {
    _nullable = true;
    return this;
  }

  /// Set column length/size
  ColumnDefinition length(int length) {
    _length = length;
    return this;
  }

  /// Set column as UNSIGNED (for numeric types)
  ColumnDefinition unsigned() {
    _unsigned = true;
    return this;
  }

  /// Set column as ZEROFILL
  ColumnDefinition zeroFill() {
    _zeroFill = true;
    return this;
  }

  /// Set default value
  ColumnDefinition defaultTo(dynamic value) {
    _defaultValue = value;
    return this;
  }

  /// Set default to CURRENT_TIMESTAMP
  ColumnDefinition defaultToCurrent() {
    _defaultValue = 'CURRENT_TIMESTAMP';
    return this;
  }

  /// Set column comment
  ColumnDefinition comment(String comment) {
    _comment = comment;
    return this;
  }

  /// Set column collation
  ColumnDefinition collate(String collation) {
    _collation = collation;
    return this;
  }

  /// Set column charset - NOW PROPERLY USED!
  ColumnDefinition charset(String charset) {
    _charset = charset;
    return this;
  }

  /// Set column as AUTO_INCREMENT
  ColumnDefinition autoIncrement() {
    _increment = true;
    return this;
  }

  /// Set column as UNIQUE
  ColumnDefinition unique([String? constraintName]) {
    if (constraintName != null) {
      _unique = false;
      _uniqueConstraintName = constraintName;
      _schema.addCompositeUniqueConstraint(constraintName, [_name]);
    } else {
      _unique = true;
      _uniqueConstraintName = null;
    }
    return this;
  }

  /// Add index to column - NOW PROPERLY USED!
  ColumnDefinition index([
    String? indexName,
    ColumnIndex type = ColumnIndex.indexKey,
  ]) {
    _indexName = indexName ?? 'idx_${_schema.tableName}_$_name';
    _indexType = type;

    _schema.addCompositeIndex(_indexName!, _name, _indexType);
    return this;
  }

  ColumnDefinition foreignKey(
    String referencesTable,
    String referencesColumn, {
    String onUpdate = 'CASCADE',
    String onDelete = 'CASCADE',
  }) {
    _foreignTable = referencesTable;
    _foreignColumn = referencesColumn;
    _onUpdate = onUpdate;
    _onDelete = onDelete;

    _schema.foreign(
      _name,
      _foreignTable!,
      _foreignColumn!,
      onUpdate: _onUpdate ?? 'CASCADE',
      onDelete: _onDelete ?? 'CASCADE',
    );
    return this;
  }

  ColumnDefinition generated(
    String expression, {
    String virtuality = 'VIRTUAL',
  }) {
    _expression = expression;
    _virtuality = virtuality;
    return this;
  }

  void finalize() {
    if (!_isFinalized) {
      _isFinalized = true;
      _addColumnToSchema();
    }
  }

  void _addColumnToSchema() {
    String columnType = _type;
    if (_length != null) {
      columnType = '$_type($_length)';
    }

    String? finalComment = _comment;
    if (_charset != null) {
      String charsetInfo = 'charset: $_charset';
      finalComment = _comment != null
          ? '$_comment ($charsetInfo)'
          : charsetInfo;
    }

    bool shouldBeUnique = _unique && _uniqueConstraintName == null;

    _schema.addColumn(
      _name,
      columnType,
      nullable: _nullable,
      unsigned: _unsigned,
      zeroFill: _zeroFill,
      defaultValue: _defaultValue,
      comment: finalComment,
      collation: _collation,
      expression: _expression,
      virtuality: _virtuality,
      increment: _increment,
      unique: shouldBeUnique,
    );
  }
}


================================================
FILE: lib/src/database/migration/builders/column_types.dart
================================================
import 'column_definition.dart';
import 'schema.dart';

export 'column_definition.dart';
export 'table_definition.dart';

extension ColumnTypes on Schema {
  /// Add an auto-incrementing primary key column
  ColumnDefinition id([String name = 'id']) {
    final definition = ColumnDefinition(
      this,
      name,
      'BIGINT',
    ).length(20).unsigned().autoIncrement().notNull();
    primary(name);
    return definition;
  }

  /// Add a big auto-incrementing column
  ColumnDefinition bigIncrements(String name) {
    final definition = ColumnDefinition(
      this,
      name,
      'BIGINT',
    ).length(20).unsigned().autoIncrement().notNull();
    return definition;
  }

  /// Create an integer column
  ColumnDefinition integer(String name) {
    return ColumnDefinition(this, name, 'INT').length(10);
  }

  /// Create a tiny integer column
  ColumnDefinition tinyInt(String name) {
    return ColumnDefinition(this, name, 'TINYINT').length(1);
  }

  /// Create a small integer column
  ColumnDefinition smallInt(String name) {
    return ColumnDefinition(this, name, 'SMALLINT').length(5);
  }

  /// Create a medium integer column
  ColumnDefinition mediumInt(String name) {
    return ColumnDefinition(this, name, 'MEDIUMINT').length(8);
  }

  /// Create a big integer column
  ColumnDefinition bigInt(String name) {
    return ColumnDefinition(this, name, 'BIGINT').length(20);
  }

  /// Create a bit column
  ColumnDefinition bit(String name) {
    return ColumnDefinition(this, name, 'BIT').length(1);
  }

  /// Create a float column
  ColumnDefinition float(String name, {int? precision, int? scale}) {
    String type = 'FLOAT';
    if (precision != null && scale != null) {
      type = 'FLOAT($precision,$scale)';
    }
    return ColumnDefinition(this, name, type);
  }

  /// Create a double column
  ColumnDefinition double(String name, {int? precision, int? scale}) {
    String type = 'DOUBLE';
    if (precision != null && scale != null) {
      type = 'DOUBLE($precision,$scale)';
    }
    return ColumnDefinition(this, name, type);
  }

  /// Create a decimal column
  ColumnDefinition decimal(String name, {int? precision, int? scale}) {
    String type = 'DECIMAL';
    if (precision != null && scale != null) {
      type = 'DECIMAL($precision,$scale)';
    }
    return ColumnDefinition(this, name, type);
  }

  /// Create a string/varchar column
  ColumnDefinition string(String name) {
    return ColumnDefinition(this, name, 'VARCHAR').length(255);
  }

  /// Create a char column
  ColumnDefinition char(String name) {
    return ColumnDefinition(this, name, 'CHAR').length(50);
  }

  /// Create a tiny text column
  ColumnDefinition tinyText(String name) {
    return ColumnDefinition(this, name, 'TINYTEXT');
  }

  /// Create a text column
  ColumnDefinition text(String name) {
    return ColumnDefinition(this, name, 'TEXT');
  }

  /// Create a medium text column
  ColumnDefinition mediumText(String name) {
    return ColumnDefinition(this, name, 'MEDIUMTEXT');
  }

  /// Create a long text column
  ColumnDefinition longText(String name) {
    return ColumnDefinition(this, name, 'LONGTEXT');
  }

  /// Create a JSON column
  ColumnDefinition json(String name) {
    return ColumnDefinition(this, name, 'JSON');
  }

  /// Create a UUID column
  ColumnDefinition uuid(String name) {
    return ColumnDefinition(this, name, 'CHAR').length(36);
  }

  /// Create a binary column
  ColumnDefinition binary(String name) {
    return ColumnDefinition(this, name, 'BINARY').length(50);
  }

  /// Create a variable binary column
  ColumnDefinition varBinary(String name) {
    return ColumnDefinition(this, name, 'VARBINARY').length(50);
  }

  /// Create a tiny blob column
  ColumnDefinition tinyBlob(String name) {
    return ColumnDefinition(this, name, 'TINYBLOB');
  }

  /// Create a blob column
  ColumnDefinition blob(String name) {
    return ColumnDefinition(this, name, 'BLOB');
  }

  /// Create a medium blob column
  ColumnDefinition mediumBlob(String name) {
    return ColumnDefinition(this, name, 'MEDIUMBLOB');
  }

  /// Create a long blob column
  ColumnDefinition longBlob(String name) {
    return ColumnDefinition(this, name, 'LONGBLOB');
  }

  /// Create a date column
  ColumnDefinition date(String name) {
    return ColumnDefinition(this, name, 'DATE');
  }

  /// Create a time column
  ColumnDefinition time(String name) {
    return ColumnDefinition(this, name, 'TIME');
  }

  /// Create a year column
  ColumnDefinition year(String name) {
    return ColumnDefinition(this, name, 'YEAR');
  }

  /// Create a datetime column
  ColumnDefinition dateTime(String name) {
    return ColumnDefinition(this, name, 'DATETIME');
  }

  /// Create a timestamp column
  ColumnDefinition timeStamp(String name) {
    return ColumnDefinition(this, name, 'TIMESTAMP');
  }

  /// Create standard timestamps (created_at, updated_at)
  void timeStamps() {
    timeStamp('created_at').nullable();
    timeStamp('updated_at').nullable();
  }

  /// Create soft delete timestamp
  ColumnDefinition softDeletes([String name = 'deleted_at']) {
    return timeStamp(name).nullable();
  }

  /// Create a point geometry column
  ColumnDefinition point(String name) {
    return ColumnDefinition(this, name, 'POINT');
  }

  /// Create a line string geometry column
  ColumnDefinition lineString(String name) {
    return ColumnDefinition(this, name, 'LINESTRING');
  }

  /// Create a polygon geometry column
  ColumnDefinition polygon(String name) {
    return ColumnDefinition(this, name, 'POLYGON');
  }

  /// Create a geometry column
  ColumnDefinition geometry(String name) {
    return ColumnDefinition(this, name, 'GEOMETRY');
  }

  /// Create a multi-point geometry column
  ColumnDefinition multiPoint(String name) {
    return ColumnDefinition(this, name, 'MULTIPOINT');
  }

  /// Create a multi-line string geometry column
  ColumnDefinition multiLineString(String name) {
    return ColumnDefinition(this, name, 'MULTILINESTRING');
  }

  /// Create a multi-polygon geometry column
  ColumnDefinition multiPolygon(String name) {
    return ColumnDefinition(this, name, 'MULTIPOLYGON');
  }

  /// Create a geometry collection column
  ColumnDefinition geometryCollection(String name) {
    return ColumnDefinition(this, name, 'GEOMETRYCOLLECTION');
  }

  /// Create an enum column
  ColumnDefinition enumType(String name, List<String> values) {
    final enumValuesString = values.map((value) => "'$value'").join(', ');
    return ColumnDefinition(this, name, 'ENUM($enumValuesString)');
  }

  /// Create a set column
  ColumnDefinition setType(String name, List<String> values) {
    final setValuesString = values.map((value) => "'$value'").join(', ');
    return ColumnDefinition(this, name, 'SET($setValuesString)');
  }

  /// Create a boolean column
  ColumnDefinition boolean(String name) {
    return ColumnDefinition(this, name, 'TINYINT').length(1);
  }
}


================================================
FILE: lib/src/database/migration/builders/schema.dart
================================================
import '../../../enum/column_index.dart';
import '../contracts/schema_interface.dart';

class Schema implements SchemaInterface {
  final List<String> _queries = [];
  final List<String> _foreignKeys = [];
  final List<String> _indexes = [];
  final List<dynamic> _columnDefinitions = [];
  final Map<String, List<String>> _compositeUniqueConstraints = {};
  final Map<String, Map<String, dynamic>> _compositeIndexes = {};
  String _primaryField = '';
  String _primaryAlgorithm = '';
  String _tableName = '';

  void setTableName(String tableName) {
    _tableName = tableName;
  }

  void registerColumnDefinition(dynamic columnDefinition) {
    _columnDefinitions.add(columnDefinition);
  }

  void _finalizeColumnDefinitions() {
    for (final columnDef in _columnDefinitions) {
      columnDef.finalize();
    }
    _columnDefinitions.clear();

    _addCompositeUniqueConstraints();

    _addCompositeIndexes();
  }

  void _addCompositeUniqueConstraints() {
    _compositeUniqueConstraints.forEach((constraintName, columns) {
      final constraint =
          'CONSTRAINT `$constraintName` UNIQUE (${columns.map((col) => '`$col`').join(', ')})';
      _indexes.add(constraint);
    });
  }

  void _addCompositeIndexes() {
    _compositeIndexes.forEach((indexName, indexData) {
      List<String> columns = indexData['columns'];
      ColumnIndex type = indexData['type'];

      if (type == ColumnIndex.indexKey) {
        _indexes.add(
          'INDEX `$indexName` (${columns.map((e) => "`$e`").join(', ')})',
        );
      } else {
        _indexes.add(
          '${type.name} INDEX `$indexName` (${columns.map((e) => "`$e`").join(', ')})',
        );
      }
    });
  }

  @override
  void addColumn(
    String name,
    String type, {
    bool nullable = false,
    dynamic length,
    bool unsigned = false,
    bool zeroFill = false,
    dynamic defaultValue,
    String? comment,
    String? collation,
    String? expression,
    String? virtuality,
    bool increment = false,
    bool unique = false,
  }) {
    final columnDefinition = StringBuffer('  `$name` $type');

    if (length != null) {
      columnDefinition.write('($length)');
    }

    if (unsigned) {
      columnDefinition.write(' UNSIGNED');
    }

    if (zeroFill) {
      columnDefinition.write(' ZEROFILL');
    }

    String nullableStr = nullable ? 'NULL' : 'NOT NULL';
    columnDefinition.write(
      ' ' * (20 - columnDefinition.length % 20) + nullableStr,
    );

    if (unique) {
      columnDefinition.write(' UNIQUE');
    }

    if (defaultValue != null) {
      RegExp funcRegex = RegExp(
        r'^(CURRENT_TIMESTAMP|NOW\(\)|UUID\(\)|RAND\(\))$',
        caseSensitive: false,
      );
      if (funcRegex.hasMatch(defaultValue.toString())) {
        columnDefinition.write(" DEFAULT $defaultValue");

        if (name == 'updated_at' &&
            defaultValue.toString().toUpperCase() == 'CURRENT_TIMESTAMP') {
          columnDefinition.write(" ON UPDATE CURRENT_TIMESTAMP");
        }
      } else {
        if (defaultValue is int || defaultValue is bool) {
          columnDefinition.write(" DEFAULT $defaultValue");
        } else {
          columnDefinition.write(" DEFAULT '$defaultValue'");
        }
      }
    }

    if (comment != null) {
      columnDefinition.write(" COMMENT '$comment'");
    }

    if (collation != null) {
      columnDefinition.write(" COLLATE $collation");
    }

    if (expression != null) {
      columnDefinition.write(' GENERATED ALWAYS AS ($expression)');
    }

    if (virtuality != null) {
      columnDefinition.write(' $virtuality');
    }

    if (increment) {
      columnDefinition.write(' AUTO_INCREMENT');
    }

    _queries.add(columnDefinition.toString());
  }

  @override
  void primary(String columnName, [String algorithm = 'BTREE']) {
    _primaryField = columnName;
    _primaryAlgorithm = algorithm;
  }

  @override
  void index(ColumnIndex type, String name, List<String> columns) {
    if (type == ColumnIndex.indexKey) {
      _indexes.add('INDEX `$name` (${columns.map((e) => "`$e`").join(',')})');
    } else {
      _indexes.add(
        '${type.name.toUpperCase()} INDEX `$name` (${columns.map((e) => "`$e`").join(',')})',
      );
    }
  }

  @override
  void foreign(
    String columnName,
    String referencesTable,
    String referencesColumn, {
    bool constrained = true,
    String onUpdate = 'CASCADE',
    String onDelete = 'CASCADE',
  }) {
    String constraint = '';
    if (constrained) {
      constraint = 'CONSTRAINT FK_${_tableName}_$referencesTable ';
    }

    final fk =
        '${constraint}FOREIGN KEY (`$columnName`) REFERENCES `$referencesTable` (`$referencesColumn`) ON UPDATE $onUpdate ON DELETE $onDelete';
    _foreignKeys.add(fk);
  }

  @override
  List<String> get queries => List.unmodifiable(_queries);

  @override
  List<String> get foreignKeys => List.unmodifiable(_foreignKeys);

  @override
  List<String> get indexes => List.unmodifiable(_indexes);

  @override
  String get primaryField => _primaryField;

  @override
  String get primaryAlgorithm => _primaryAlgorithm;

  String get tableName => _tableName;

  @override
  void reset() {
    _queries.clear();
    _foreignKeys.clear();
    _indexes.clear();
    _columnDefinitions.clear();
    _compositeUniqueConstraints.clear();
    _compositeIndexes.clear();
    _primaryField = '';
    _primaryAlgorithm = '';
    _tableName = '';
  }

  void addCompositeUniqueConstraint(
    String constraintName,
    List<String> columns,
  ) {
    if (_compositeUniqueConstraints.containsKey(constraintName)) {
      _compositeUniqueConstraints[constraintName]!.addAll(columns);
    } else {
      _compositeUniqueConstraints[constraintName] = List.from(columns);
    }
  }

  void addCompositeIndex(
    String indexName,
    String columnName,
    ColumnIndex type,
  ) {
    if (_compositeIndexes.containsKey(indexName)) {
      _compositeIndexes[indexName]!['columns'].add(columnName);
    } else {
      _compositeIndexes[indexName] = {
        'columns': [columnName],
        'type': type,
      };
    }
  }

  String generateCreateTableSql(String tableName, {bool ifNotExists = false}) {
    _finalizeColumnDefinitions();

    final query = StringBuffer();
    String createClause = ifNotExists
        ? 'CREATE TABLE IF NOT EXISTS'
        : 'CREATE TABLE';

    query.writeln('$createClause `$tableName` (');

    query.write(_queries.join(',\n'));

    if (_primaryField.isNotEmpty) {
      query.write(',\n  PRIMARY KEY (`$_primaryField`)');
    }

    if (_indexes.isNotEmpty) {
      for (String index in _indexes) {
        query.write(',\n  $index');
      }
    }

    if (_foreignKeys.isNotEmpty) {
      for (String fk in _foreignKeys) {
        query.write(',\n  $fk');
      }
    }

    query.write('\n)');

    return query.toString();
  }

  String generateCreateAlterSql(
    String tableName, {
    bool ifNotExists = false,
    String beforeColumn = '',
    String afterColumn = '',
  }) {
    _finalizeColumnDefinitions();

    final clauses = <String>[];

    for (final colDef in _queries) {
      var clause = 'ADD COLUMN ${colDef.trim()}';
      if (beforeColumn.isNotEmpty) clause += ' BEFORE `$beforeColumn`';
      if (afterColumn.isNotEmpty) clause += ' AFTER `$afterColumn`';
      clauses.add(clause);
    }

    if (_primaryField.isNotEmpty) {
      clauses.add('ADD PRIMARY KEY (`$_primaryField`)');
    }

    for (final idx in _indexes) {
      clauses.add('ADD $idx');
    }

    for (final fk in _foreignKeys) {
      clauses.add('ADD $fk');
    }

    final buffer = StringBuffer();
    buffer.writeln('ALTER TABLE `$tableName`');
    for (var i = 0; i < clauses.length; i++) {
      final sep = i == clauses.length - 1 ? '' : ',';
      buffer.writeln('  ${clauses[i]}$sep');
    }

    return buffer.toString();
  }

  String generateDropTableSql(String tableName, {bool ifExists = false}) {
    String dropClause = ifExists ? 'DROP TABLE IF EXISTS' : 'DROP TABLE';
    return '$dropClause `$tableName`';
  }
}


================================================
FILE: lib/src/database/migration/builders/table_definition.dart
================================================
import 'dart:async';

import '../contracts/database_adapter_interface.dart';
import '../migration_connection.dart';

class TableDefinition implements Future<void> {
  final String _tableName;
  final Future<void> Function() _createFunction;
  final MigrationConnection? _connection;
  final DatabaseAdapterInterface? _adapter;

  String? _engine;
  String? _comment;
  String? _charset;
  String? _collation;
  int? _autoIncrement;

  TableDefinition(
    this._tableName,
    this._createFunction, {
    MigrationConnection? connection,
    DatabaseAdapterInterface? adapter,
  }) : _connection = connection,
       _adapter = adapter;

  TableDefinition engine(String engine) {
    _engine = engine;
    return this;
  }

  TableDefinition comment(String comment) {
    _comment = comment;
    return this;
  }

  TableDefinition charset(String charset) {
    _charset = charset;
    return this;
  }

  TableDefinition collate(String collation) {
    _collation = collation;
    return this;
  }

  TableDefinition autoIncrement(int startValue) {
    _autoIncrement = startValue;
    return this;
  }

  Future<void> _getExecutionFuture() async {
    await _createFunction();
    await _applyTableOptions();
  }

  @override
  Future<R> then<R>(
    FutureOr<R> Function(void value) onValue, {
    Function? onError,
  }) {
    return _getExecutionFuture().then(onValue, onError: onError);
  }

  @override
  Future<void> catchError(
    Function onError, {
    bool Function(Object error)? test,
  }) {
    return _getExecutionFuture().catchError(onError, test: test);
  }

  @override
  Future<void> whenComplete(FutureOr<void> Function() action) {
    return _getExecutionFuture().whenComplete(action);
  }

  @override
  Future<void> timeout(
    Duration timeLimit, {
    FutureOr<void> Function()? onTimeout,
  }) {
    return _getExecutionFuture().timeout(timeLimit, onTimeout: onTimeout);
  }

  @override
  Stream<void> asStream() {
    return _getExecutionFuture().asStream();
  }

  Future<void> _applyTableOptions() async {
    if (_engine == null &&
        _comment == null &&
        _charset == null &&
        _collation == null &&
        _autoIncrement == null) {
      return; // No options to apply
    }

    final options = <String>[];

    if (_engine != null) {
      options.add('ENGINE=$_engine');
    }

    if (_charset != null) {
      options.add('DEFAULT CHARSET=$_charset');
    }

    if (_collation != null) {
      options.add('COLLATE=$_collation');
    }

    if (_comment != null) {
      options.add("COMMENT='$_comment'");
    }

    if (_autoIncrement != null) {
      options.add('AUTO_INCREMENT=$_autoIncrement');
    }

    if (options.isNotEmpty && _connection?.connection != null) {
      String alterSql = 'ALTER TABLE `$_tableName` ${options.join(', ')}';

      if (_adapter != null) {
        alterSql = _adapter.adaptQuery(alterSql);
      }

      await _connection!.connection!.execute(alterSql);
    }
  }
}


================================================
FILE: lib/src/database/migration/contracts/database_adapter_interface.dart
================================================
abstract class DatabaseAdapterInterface {
  String get driverName;

  String adaptQuery(String query);

  String getMigrationsTableSql();

  bool supports(String driver);

  String escapeIdentifier(String identifier);

  String formatValue(dynamic value);
}


================================================
FILE: lib/src/database/migration/contracts/migration_connection_interface.dart
================================================
import '../../../contract/database/_connectors/_database_connection.dart';

abstract class MigrationConnectionInterface {
  DatabaseConnection? get connection;

  String? get driver;

  Future<void> setup(Map<String, dynamic> databaseConfig);

  Future<void> closeConnection();

  Future<void> truncateMigration();
}


================================================
FILE: lib/src/database/migration/contracts/schema_interface.dart
================================================
import '../../../enum/column_index.dart';

abstract class SchemaInterface {
  void addColumn(
    String name,
    String type, {
    bool nullable = false,
    dynamic length,
    bool unsigned = false,
    bool zeroFill = false,
    dynamic defaultValue,
    String? comment,
    String? collation,
    String? expression,
    String? virtuality,
    bool increment = false,
    bool unique = false,
  });

  void primary(String columnName, [String algorithm = 'BTREE']);

  void index(ColumnIndex type, String name, List<String> columns);

  void foreign(
    String columnName,
    String referencesTable,
    String referencesColumn, {
    bool constrained = true,
    String onUpdate = 'CASCADE',
    String onDelete = 'CASCADE',
  });

  List<String> get queries;

  List<String> get foreignKeys;

  List<String> get indexes;

  String get primaryField;

  String get primaryAlgorithm;

  void reset();
}


================================================
FILE: lib/src/database/migration/migration.dart
================================================
import 'dart:io';

import 'package:meta/meta.dart';
import 'package:vania/src/exception/query_exception.dart';
import 'package:vania/src/utils/functions.dart' show toSnakeCase;
import 'builders/schema.dart';
import 'builders/table_definition.dart';
import 'contracts/database_adapter_interface.dart';
import 'migration_connection.dart';

abstract class Migration {
  late final MigrationConnection _connection;
  late final Schema _schemaBuilder;
  late final DatabaseAdapterInterface? _adapter;

  String get migrationName => toSnakeCase(runtimeType.toString());

  Migration() {
    _connection = MigrationConnection();
    _schemaBuilder = Schema();
    _adapter = _connection.adapter;
  }

  @mustBeOverridden
  Future<void> up();

  @mustBeOverridden
  Future<void> down();

  TableDefinition create(
    String tableName,
    Function(Schema) callback, [
    bool ifNotExists = false,
  ]) {
    _schemaBuilder.reset();
    _schemaBuilder.setTableName(tableName);

    Future<void> createFunction() async {
      callback(_schemaBuilder);

      String sql = _schemaBuilder.generateCreateTableSql(
        tableName,
        ifNotExists: ifNotExists,
      );

      if (_adapter != null && _adapter.driverName == 'pgsql') {
        final postgresAdapter = _adapter as dynamic;
        if (postgresAdapter.executeStatements != null) {
          await postgresAdapter.executeStatements(sql, (
            List<String> statements,
          ) async {
            for (String statement in statements) {
              await _connection.connection!.execute(statement);
            }
          });
          return;
        }
      }

      if (_adapter != null) {
        sql = _adapter.adaptQuery(sql);
      }
      try {
        await _connection.connection!.execute(sql);
      } on QueryException catch (e) {
        stderr.writeln('Error executing statement: $sql\nError: ${e.cause}');
        exit(0);
      }
    }

    return TableDefinition(
      tableName,
      createFunction,
      connection: _connection,
      adapter: _adapter,
    );
  }

  @Deprecated('createTableIfNotExists will be deprecated in version 1.1.0')
  TableDefinition createTableIfNotExists(
    String tableName,
    Function(Schema) callback,
  ) {
    _schemaBuilder.reset();
    _schemaBuilder.setTableName(tableName);

    Future<void> createFunction() async {
      callback(_schemaBuilder);

      String sql = _schemaBuilder.generateCreateTableSql(
        tableName,
        ifNotExists: true,
      );
      if (_adapter != null && _adapter.driverName == 'pgsql') {
        final postgresAdapter = _adapter as dynamic;
        if (postgresAdapter.executeStatements != null) {
          await postgresAdapter.executeStatements(sql, (
            String statement,
          ) async {
            try {
              await _connection.connection!.execute(statement);
            } on QueryException catch (e) {
              stderr.writeln(
                'Error executing statement: $statement\nError: ${e.cause}',
              );
              exit(0);
            }
          });
          return;
        }
      }

      if (_adapter != null) {
        sql = _adapter.adaptQuery(sql);
      }
      try {
        await _connection.connection!.execute(sql);
      } on QueryException catch (e) {
        stderr.writeln('Error executing statement: $sql\nError: ${e.cause}');
        exit(0);
      }
    }

    return TableDefinition(
      tableName,
      createFunction,
      connection: _connection,
      adapter: _adapter,
    );
  }

  TableDefinition alterColumn(
    String table,
    Function(Schema) callback, {
    String beforeColumn = '',
    String afterColumn = '',
  }) {
    _schemaBuilder.reset();
    _schemaBuilder.setTableName(table);
    Future<void> createFunction() async {
      callback(_schemaBuilder);

      try {
        String sql = _schemaBuilder.generateCreateAlterSql(
          table,
          afterColumn: afterColumn,
          beforeColumn: beforeColumn,
        );
        if (_adapter != null) {
          sql = _adapter.adaptQuery(sql);
        }
        await _connection.connection!.execute(sql);
      } on QueryException catch (e) {
        stderr.writeln('${e.cause}');
        exit(0);
      }
    }

    return TableDefinition(
      table,
      createFunction,
      connection: _connection,
      adapter: _adapter,
    );
  }

  Future<void> drop(String tableName) async {
    String sql = _schemaBuilder.generateDropTableSql(tableName, ifExists: true);

    if (_adapter?.driverName == 'mysql') {
      sql =
          'SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;$sql;SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;';
    }

    if (_adapter?.driverName == 'pgsql') {
      sql = '$sql CASCADE';
    }

    if (_adapter != null) {
      sql = _adapter.adaptQuery(sql);
    }

    try {
      await _connection.connection!.execute(sql);
    } on QueryException catch (e) {
      stderr.writeln('Error executing statement: $sql\nError: ${e.cause}');
      exit(0);
    }
  }

  @Deprecated('dropTableIfExists will be deprecated in version 1.1.0')
  Future<void> dropTableIfExists(String tableName) async {
    String sql = _schemaBuilder.generateDropTableSql(tableName, ifExists: true);

    if (_adapter?.driverName == 'mysql') {
      sql =
          'SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;${sql}SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;';
    }

    if (_adapter != null) {
      sql = _adapter.adaptQuery(sql);
    }

    try {
      await _connection.connection!.execute(sql);
    } on QueryException catch (e) {
      stderr.writeln('Error executing statement: $sql\nError: ${e.cause}');
      exit(0);
    }
  }

  Future<void> execute(String sql) async {
    if (_adapter != null) {
      sql = _adapter.adaptQuery(sql);
    }

    try {
      await _connection.connection!.execute(sql);
    } on QueryException catch (e) {
      stderr.writeln('Error executing statement: $sql\nError: ${e.cause}');
      exit(0);
    }
  }
}


================================================
FILE: lib/src/database/migration/migration_connection.dart
================================================
import 'dart:io';

import '../../contract/database/_connectors/_database_connection.dart';
import '../../env_handler/env.dart';
import '../../exception/database_exception.dart';
import '../../exception/invalid_argument_exception.dart';
import '../_connection_manager.dart';
import '../_database_utils/_db_config.dart';
import 'adapters/mysql_adapter.dart';
import 'adapters/postgresql_adapter.dart';
import 'adapters/sqlite_adapter.dart';
import 'contracts/database_adapter_interface.dart';
import 'contracts/migration_connection_interface.dart';

class MigrationConnection implements MigrationConnectionInterface {
  static final MigrationConnection _singleton = MigrationConnection._internal();

  DatabaseConnection? _dbConnection;
  String? _driver;
  DatabaseAdapterInterface? _adapter;

  factory MigrationConnection() {
    Env().load();
    return _singleton;
  }

  MigrationConnection._internal();

  @override
  DatabaseConnection? get connection => _dbConnection;

  @override
  String? get driver => _driver;

  DatabaseAdapterInterface? get adapter => _adapter;

  @override
  Future<void> setup(Map<String, dynamic> databaseConfig) async {
    try {
      final connectionManager = ConnectionManager();

      connectionManager.defaultConnection = databaseConfig['default'];

      Map<String, dynamic> connections = databaseConfig['connections'];

      _driver = databaseConfig['default'];
      await connectionManager.connect(
        _createDBConfig(connections[_driver]),
        _driver!,
      );

      _dbConnection = connectionManager.connection(_driver);

      if (_dbConnection == null) {
        stderr.writeln('A database must be specified.');
        exit(1);
      }

      _adapter = _createAdapter(_driver!);

      String migrationSql = _adapter!.getMigrationsTableSql();
      await _dbConnection!.execute(migrationSql);
    } on InvalidArgumentException catch (e) {
      stderr.writeln(e.message);
      exit(1);
    } on DatabaseException catch (e) {
      stderr.writeln(e.message);
      stderr.writeln(e.cause);
      exit(1);
    } catch (e) {
      stderr.write(e.toString());
      exit(1);
    }
  }

  @override
  Future<void> truncateMigration() async {
    if (_dbConnection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      if (_adapter?.supports('pgsql') == true) {
        await _dbConnection!.execute('TRUNCATE "migrations"');
      } else if (_adapter?.supports('sqlite') == true) {
        await _dbConnection!.execute('DELETE FROM "migrations"');
      } else {
        await _dbConnection!.execute('TRUNCATE `migrations`');
      }
    } catch (e) {
      stderr.writeln('Failed to truncate migrations table: $e');
      exit(1);
    }
  }

  @override
  Future<void> closeConnection() async {
    try {
      await _dbConnection?.close();
      _dbConnection = null;
      _driver = null;
      _adapter = null;
    } catch (e) {
      stderr.writeln('Failed to close connection: $e');
      exit(1);
    }
  }

  DBConfig _createDBConfig(Map<String, dynamic> config) {
    return DBConfig(
      driver: config['driver'] ?? '',
      host: config['host'] ?? '',
      port: config['port'] ?? 0,
      database: config['database'] ?? '',
      username: config['username'] ?? '',
      password: config['password'] ?? '',
      sslMode: config['sslmode'] ?? false,
      collation: config['collation'] ?? '',
      pool: false,
      poolSize: 0,
      filePath: config['file_path'] ?? '',
      openInMemorySQLite: config['openInMemorySQLite'] ?? false,
    );
  }

  DatabaseAdapterInterface _createAdapter(String driver) {
    final normalizedDriver = driver.toLowerCase();

    if (normalizedDriver == 'mysql') {
      return MySqlAdapter();
    } else if (normalizedDriver == 'pgsql' ||
        normalizedDriver == 'postgresql' ||
        normalizedDriver == 'postgres') {
      return PostgreSqlAdapter();
    } else if (normalizedDriver == 'sqlite' || normalizedDriver == 'sqlite3') {
      return SqliteAdapter();
    }

    return MySqlAdapter();
  }
}


================================================
FILE: lib/src/database/migration/runners/migration_runner.dart
================================================
import 'dart:io';

import 'package:vania/query_builder.dart';

import '../../../utils/functions.dart';
import '../migration.dart';
import '../migration_connection.dart';

class MigrationRunner {
  int? _currentBatch;
  final Map<String, Migration> _migrations = {};

  Future<void> _runUp(String migrationName, Function migrationCallback) async {
    final isExecuted = await _isMigrationExecuted(migrationName);
    if (isExecuted) {
      stderr.writeln('Migration $migrationName already executed, skipping...');
      return;
    }

    final stopwatch = Stopwatch()..start();

    try {
      await migrationCallback();
      final batchNumber = await _getNextBatchNumber();
      await _recordMigrationWithBatch(migrationName, batchNumber);

      stopwatch.stop();
      stderr.writeln(
        ' Migration $migrationName executed ....................................\x1B[32m ${stopwatch.elapsedMilliseconds}ms DONE\x1B[0m',
      );
    } catch (e) {
      stopwatch.stop();
      if (e is QueryException) {
        stderr.writeln(e.cause);
      } else {
        stderr.writeln(e);
      }
      stderr.writeln(
        '❌ Migration $migrationName failed ......................................\x1B[31m ${stopwatch.elapsedMilliseconds}ms FAILED\x1B[0m',
      );
      exit(1);
    }
  }

  MigrationRunner migrationRegister(List<Migration> migrations) {
    _migrations.clear();
    for (var migration in migrations) {
      String name = migration.migrationName;
      if (!_migrations.containsKey(name)) {
        _migrations[name] = migration;
      }
    }
    return this;
  }

  Future<void> run(List<String> args) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }
    if (args.contains('--fresh')) {
      await _fresh(_migrations.values.toList());
    } else if (args.contains('--install')) {
      await _install();
    } else if (args.contains('--refresh')) {
      await _refresh(_migrations);
    } else if (args.contains('--reset')) {
      await _reset(_migrations);
    } else if (args.contains('--rollback')) {
      int? steps = args.contains('--steps')
          ? int.tryParse(args[args.indexOf('--steps') + 1])
          : null;
      int? batch = args.contains('--batch')
          ? int.tryParse(args[args.indexOf('--batch') + 1])
          : null;
      await _rollback(_migrations, steps: steps, batch: batch);
    } else {
      for (final migration in _migrations.values) {
        await _runUp(migration.migrationName, migration.up);
      }
      stderr.writeln('✅ All migrations executed successfully!');
    }
  }

  Future<void> _runDown(
    String migrationName,
    Function migrationCallback,
  ) async {
    final stopwatch = Stopwatch()..start();

    try {
      await Future.delayed(Duration(milliseconds: 30));
      await migrationCallback();

      stopwatch.stop();
      stderr.writeln(
        ' Migration $migrationName rolled back....................................\x1B[32m ${stopwatch.elapsedMilliseconds}ms DONE\x1B[0m',
      );
    } catch (e) {
      stopwatch.stop();
      stderr.writeln(
        ' Migration $migrationName failed ......................................\x1B[31m ${stopwatch.elapsedMilliseconds}ms FAILED\x1B[0m',
      );
      exit(1);
    }
  }

  Future<bool> _isMigrationExecuted(String migrationName) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      final snakeCaseName = toSnakeCase(migrationName);
      final result = await MigrationConnection().connection!.select(
        "SELECT id FROM migrations WHERE migration='$snakeCaseName'",
      );

      return result.isNotEmpty;
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln(
          '❌ Failed to check if migration is executed: ${e.cause}',
        );
      } else {
        stderr.writeln('❌ Failed to check if migration is executed: $e');
      }
      exit(1);
    }
  }

  Future<void> _recordMigrationWithBatch(
    String migrationName,
    int batch,
  ) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      final snakeCaseName = toSnakeCase(migrationName);

      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql =
            'INSERT INTO `migrations` (`migration`, `batch`) VALUES (\'$snakeCaseName\', $batch)';
      } else {
        sql =
            'INSERT INTO "migrations" ("migration", "batch") VALUES (\'$snakeCaseName\', $batch)';
      }

      await Future.delayed(Duration(milliseconds: 100));
      await MigrationConnection().connection!.execute(sql);
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to record migration with batch: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to record migration with batch: $e');
      }
      exit(1);
    }
  }

  Future<void> _removeMigrationRecord(String migrationName) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      final snakeCaseName = toSnakeCase(migrationName);
      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql = 'DELETE FROM `migrations` WHERE `migration`=\'$snakeCaseName\'';
      } else {
        sql = 'DELETE FROM "migrations" WHERE "migration"=\'$snakeCaseName\'';
      }
      await Future.delayed(Duration(milliseconds: 50));
      await MigrationConnection().connection!.execute(sql);
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to remove migration record: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to remove migration record: $e');
      }
      exit(1);
    }
  }

  Future<int> _getNextBatchNumber() async {
    if (_currentBatch != null) {
      return _currentBatch!;
    }

    final currentBatch = await _getCurrentBatchNumber();
    _currentBatch = currentBatch + 1;
    return _currentBatch!;
  }

  Future<int> _getCurrentBatchNumber() async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql = 'SELECT COALESCE(MAX(`batch`), 0) as max_batch FROM `migrations`';
      } else {
        sql = 'SELECT COALESCE(MAX("batch"), 0) as max_batch FROM "migrations"';
      }
      await Future.delayed(Duration(milliseconds: 10));
      final result = await MigrationConnection().connection!.select(sql);
      if (result.isNotEmpty) {
        return int.parse(result.first['max_batch'].toString());
      }
      return 0;
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to get current batch number: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to get current batch number: $e');
      }
      exit(1);
    }
  }

  Future<List<String>> _getMigrationsFromBatch(int batch) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql =
            'SELECT `migration` FROM `migrations` WHERE `batch`=$batch  ORDER BY "id" DESC';
      } else {
        sql =
            'SELECT "migration" FROM "migrations" WHERE "batch"=$batch  ORDER BY "id" DESC';
      }

      final result = await MigrationConnection().connection!.select(sql);

      return result.map((row) => row['migration'] as String).toList();
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to get migrations from batch: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to get migrations from batch: $e');
      }
      exit(1);
    }
  }

  Future<void> _fresh(List<Migration> migrations) async {
    stderr.writeln('🔄 Running fresh migration...');

    try {
      await MigrationConnection().truncateMigration();
      _currentBatch = null;

      for (final migration in _migrations.values) {
        await _runDown(migration.migrationName, migration.down);
      }

      stderr.writeln('📦 Running all migrations...');
      for (final migration in migrations) {
        await _runUp(migration.migrationName, migration.up);
      }
      stderr.writeln('✅ Fresh migration completed successfully!');
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to run fresh migration: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to run fresh migration: $e');
      }
      exit(1);
    }
  }

  Future<void> _install() async {
    stderr.writeln('📋 Installing migration repository...');

    try {
      if (MigrationConnection().adapter != null) {
        String migrationSql = MigrationConnection().adapter!
            .getMigrationsTableSql();
        await MigrationConnection().connection!.execute(migrationSql);
        stderr.writeln('✅ Migration repository installed successfully!');
      } else {
        stderr.writeln('❌ Migration repository installation failed!');
        exit(1);
      }
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to install migration repository: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to install migration repository: $e');
      }
      exit(1);
    }
  }

  Future<void> _refresh(Map<String, Migration> migrations) async {
    stderr.writeln('🔄 Refreshing migrations...');

    try {
      await _reset(migrations);
      _currentBatch = null;
      stderr.writeln('📦 Re-running all migrations...');
      for (final migration in migrations.values) {
        await _runUp(migration.migrationName, migration.up);
      }

      stderr.writeln('✅ Migration refresh completed successfully!');
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to refresh migrations: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to refresh migrations: $e');
      }
      exit(1);
    }
  }

  Future<void> _reset(Map<String, Migration> migrations) async {
    stderr.writeln('⏪ Resetting all migrations...');

    try {
      final allMigrations = await _getAllMigrationsInReverseOrder();

      if (allMigrations.isEmpty) {
        stderr.writeln('ℹ️ No migrations to reset.');
        return;
      }
      for (final migrationName in allMigrations) {
        stderr.writeln('⏪ Rolling back: $migrationName');
        final migration = migrations[migrationName];
        if (migration != null) {
          await _runDown(migrationName, migration.down);
        }

        await _removeMigrationRecord(migrationName);
      }

      stderr.writeln('✅ All migrations reset successfully!');
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to reset migrations: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to reset migrations: $e');
      }
      exit(1);
    }
  }

  Future<void> _rollback(
    Map<String, Migration> migrations, {
    int? steps,
    int? batch,
  }) async {
    stderr.writeln('⏪ Rolling back migrations...');

    try {
      List<String> migrationsToRollback = [];

      if (batch != null) {
        migrationsToRollback = await _getMigrationsFromBatch(batch);
        stderr.writeln('⏪ Rolling back batch $batch...');
      } else if (steps != null) {
        migrationsToRollback = await _getLastNMigrations(steps);
        stderr.writeln('⏪ Rolling back last $steps migration(s)...');
      } else {
        final currentBatch = await _getCurrentBatchNumber();
        if (currentBatch > 0) {
          migrationsToRollback = await _getMigrationsFromBatch(currentBatch);
          stderr.writeln('⏪ Rolling back last batch ($currentBatch)...');
        }
      }

      if (migrationsToRollback.isEmpty) {
        stderr.writeln('ℹ️ No migrations to rollback.');
        return;
      }

      for (final migrationName in migrationsToRollback) {
        stderr.writeln('⏪ Rolling back: $migrationName');

        final migration = migrations[migrationName];
        if (migration != null) {
          await _runDown(migrationName, migration.down);
        }
        await _removeMigrationRecord(migrationName);
      }

      stderr.writeln('✅ Rollback completed successfully!');
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to rollback migrations: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to rollback migrations: $e');
      }
      exit(1);
    }
  }

  Future<List<String>> _getAllMigrationsInReverseOrder() async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql = 'SELECT `migration` FROM `migrations` ORDER BY `id` DESC';
      } else {
        sql = 'SELECT "migration" FROM "migrations" ORDER BY "id" DESC';
      }

      final result = await MigrationConnection().connection!.select(sql);
      return result.map((row) => row['migration'] as String).toList();
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to get all migrations: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to get all migrations: $e');
      }
      exit(1);
    }
  }

  Future<List<String>> _getLastNMigrations(int n) async {
    if (MigrationConnection().connection == null) {
      stderr.writeln('Database connection not established');
      exit(1);
    }

    try {
      String sql;
      if (MigrationConnection().adapter?.driverName == 'mysql') {
        sql =
            'SELECT `migration` FROM `migrations` ORDER BY `id` DESC LIMIT $n';
      } else {
        sql =
            'SELECT "migration" FROM "migrations" ORDER BY "id" DESC LIMIT $n';
      }

      final result = await MigrationConnection().connection!.select(sql);
      return result.map((row) => row['migration'] as String).toList();
    } catch (e) {
      if (e is QueryException) {
        stderr.writeln('❌ Failed to get last $n migrations: ${e.cause}');
      } else {
        stderr.writeln('❌ Failed to get last $n migrations: $e');
      }
      exit(1);
    }
  }
}


================================================
FILE: lib/src/database/monitoring/database_monitor.dart
================================================
import 'dart:async';
import 'package:meta/meta.dart';

enum AlertType { slowQuery, highConnectionUsage, connectionError, deadlock }

class DatabaseAlert {
  final AlertType type;
  final String message;
  final Map<String, dynamic> details;

  DatabaseAlert({
    required this.type,
    required this.message,
    required this.details,
  });
}

class QueryMetrics {
  final String sql;
  final Duration executionTime;
  final DateTime timestamp;

  QueryMetrics({
    required this.sql,
    required this.executionTime,
    required this.timestamp,
  });
}

class PerformanceStats {
  final Duration averageQu
Download .txt
gitextract_qi8hzr2l/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── documentation-issue.md
│   │   └── feature_request.md
│   ├── stale.yml
│   └── workflows/
│       └── vania-dart.yml
├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README.tr.md
├── analysis_options.yaml
├── example/
│   ├── app_exception_handler.dart
│   └── main.dart
├── lib/
│   ├── application.dart
│   ├── authentication.dart
│   ├── database.dart
│   ├── http/
│   │   ├── controller.dart
│   │   ├── form_validation.dart
│   │   ├── middleware.dart
│   │   ├── request.dart
│   │   └── response.dart
│   ├── mail.dart
│   ├── migration.dart
│   ├── orm/
│   │   └── model.dart
│   ├── query_builder.dart
│   ├── route.dart
│   ├── service_provider.dart
│   ├── src/
│   │   ├── authentication/
│   │   │   ├── authenticate.dart
│   │   │   ├── authentication.dart
│   │   │   ├── gate/
│   │   │   │   └── gate.dart
│   │   │   ├── has_api_tokens.dart
│   │   │   ├── model/
│   │   │   │   └── personal_access_token.dart
│   │   │   └── redirect_if_authenticated.dart
│   │   ├── aws/
│   │   │   └── s3_client.dart
│   │   ├── cache/
│   │   │   ├── cache.dart
│   │   │   ├── cache_driver.dart
│   │   │   ├── file_cache_driver.dart
│   │   │   └── redis_cache_driver.dart
│   │   ├── config/
│   │   │   ├── config.dart
│   │   │   ├── defined_regexp.dart
│   │   │   └── http_cors.dart
│   │   ├── container.dart
│   │   ├── contract/
│   │   │   ├── database/
│   │   │   │   ├── _connectors/
│   │   │   │   │   └── _database_connection.dart
│   │   │   │   └── query_builder/
│   │   │   │       ├── _bulk_operations_builder.dart
│   │   │   │       ├── _cte_builder.dart
│   │   │   │       ├── _delete_query_builder.dart
│   │   │   │       ├── _insert_query_builder.dart
│   │   │   │       ├── _join_clause_builder.dart
│   │   │   │       ├── _query_executor_builder.dart
│   │   │   │       ├── _select_query_builder.dart
│   │   │   │       ├── _union_clause_builder.dart
│   │   │   │       ├── _update_query_builder.dart
│   │   │   │       ├── _where_clauses_builder.dart
│   │   │   │       ├── _window_functions_builder.dart
│   │   │   │       └── query_builder.dart
│   │   │   ├── http/
│   │   │   │   └── request/
│   │   │   │       └── form_validation.dart
│   │   │   └── orm/
│   │   │       ├── morph_relation.dart
│   │   │       └── relation.dart
│   │   ├── cryptographic/
│   │   │   ├── hash.dart
│   │   │   └── vania_encryption.dart
│   │   ├── database/
│   │   │   ├── _connection_manager.dart
│   │   │   ├── _connectors/
│   │   │   │   ├── _database_connection_factory.dart
│   │   │   │   └── _database_connection_proxy.dart
│   │   │   ├── _database_utils/
│   │   │   │   ├── _db_config.dart
│   │   │   │   ├── _paginated_result.dart
│   │   │   │   ├── _raw_expression.dart
│   │   │   │   └── _singularize.dart
│   │   │   ├── adapters/
│   │   │   │   ├── _mysql_connector.dart
│   │   │   │   ├── _postgres_connector.dart
│   │   │   │   └── _sqlite_connector.dart
│   │   │   ├── db.dart
│   │   │   ├── isolate_db.dart
│   │   │   ├── migration/
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── grammar/
│   │   │   │   │   │   ├── mysql_grammar.dart
│   │   │   │   │   │   ├── postgresql_grammar.dart
│   │   │   │   │   │   ├── sql_grammar.dart
│   │   │   │   │   │   └── sqlite_grammar.dart
│   │   │   │   │   ├── mysql_adapter.dart
│   │   │   │   │   ├── postgresql_adapter.dart
│   │   │   │   │   └── sqlite_adapter.dart
│   │   │   │   ├── builders/
│   │   │   │   │   ├── column_definition.dart
│   │   │   │   │   ├── column_types.dart
│   │   │   │   │   ├── schema.dart
│   │   │   │   │   └── table_definition.dart
│   │   │   │   ├── contracts/
│   │   │   │   │   ├── database_adapter_interface.dart
│   │   │   │   │   ├── migration_connection_interface.dart
│   │   │   │   │   └── schema_interface.dart
│   │   │   │   ├── migration.dart
│   │   │   │   ├── migration_connection.dart
│   │   │   │   └── runners/
│   │   │   │       └── migration_runner.dart
│   │   │   ├── monitoring/
│   │   │   │   └── database_monitor.dart
│   │   │   ├── orm/
│   │   │   │   ├── belongs_to.dart
│   │   │   │   ├── belongs_to_many.dart
│   │   │   │   ├── has_many.dart
│   │   │   │   ├── has_one.dart
│   │   │   │   ├── model.dart
│   │   │   │   └── polymorphic/
│   │   │   │       ├── morph_many.dart
│   │   │   │       ├── morph_one.dart
│   │   │   │       ├── morph_to.dart
│   │   │   │       ├── morph_to_many.dart
│   │   │   │       └── morphed_by_many.dart
│   │   │   ├── query_builder/
│   │   │   │   ├── _bulk_operations_builder_impl.dart
│   │   │   │   ├── _cte/
│   │   │   │   │   ├── _cte_cache.dart
│   │   │   │   │   ├── _cte_configuration.dart
│   │   │   │   │   ├── _cte_definition.dart
│   │   │   │   │   ├── _cte_exception.dart
│   │   │   │   │   ├── _cte_feature.dart
│   │   │   │   │   ├── _database_type.dart
│   │   │   │   │   ├── _duplicate_cte_name_exception.dart
│   │   │   │   │   ├── _invalid_cte_configuration_exception.dart
│   │   │   │   │   ├── _sql_identifier_escaper.dart
│   │   │   │   │   ├── _standard_escaping_strategy.dart
│   │   │   │   │   └── _unsupported_cte_feature_exception.dart
│   │   │   │   ├── _cte_builder_impl.dart
│   │   │   │   ├── _delete_query_builder_impl.dart
│   │   │   │   ├── _insert_query_builder_impl.dart
│   │   │   │   ├── _join_clause_builder_impl.dart
│   │   │   │   ├── _query_builder_impl.dart
│   │   │   │   ├── _query_executor_builder_impl.dart
│   │   │   │   ├── _select_query_builder_impl.dart
│   │   │   │   ├── _union_clause_builder_impl.dart
│   │   │   │   ├── _update_query_builder_impl.dart
│   │   │   │   ├── _where_clauses_builder_impl.dart
│   │   │   │   └── _window_functions_builder_impl.dart
│   │   │   └── seeder/
│   │   │       ├── seeder.dart
│   │   │       ├── seeder_factory.dart
│   │   │       └── seeder_runner.dart
│   │   ├── enum/
│   │   │   ├── column_index.dart
│   │   │   └── http_request_method.dart
│   │   ├── env_handler/
│   │   │   └── env.dart
│   │   ├── exception/
│   │   │   ├── base_http_exception.dart
│   │   │   ├── database_exception.dart
│   │   │   ├── exception_handler.dart
│   │   │   ├── forbidden_exception.dart
│   │   │   ├── http_exception.dart
│   │   │   ├── internal_server_error.dart
│   │   │   ├── invalid_argument_exception.dart
│   │   │   ├── not_found_exception.dart
│   │   │   ├── page_expired_exception.dart
│   │   │   ├── query_exception.dart
│   │   │   ├── redirect_exception.dart
│   │   │   ├── throttle_exception.dart
│   │   │   ├── unauthenticated.dart
│   │   │   ├── unauthorized_exception.dart
│   │   │   └── validation_exception.dart
│   │   ├── extensions/
│   │   │   ├── date_time_extension.dart
│   │   │   ├── extensions.dart
│   │   │   ├── localization_extension.dart
│   │   │   ├── map_extension.dart
│   │   │   ├── number_extension.dart
│   │   │   ├── string_extension.dart
│   │   │   └── string_list_extension.dart
│   │   ├── http/
│   │   │   ├── controller/
│   │   │   │   ├── controller.dart
│   │   │   │   └── controller_handler.dart
│   │   │   ├── middleware/
│   │   │   │   ├── middleware.dart
│   │   │   │   ├── middleware_handler.dart
│   │   │   │   └── web_socket_middleware_handler.dart
│   │   │   ├── request/
│   │   │   │   ├── request.dart
│   │   │   │   ├── request_body.dart
│   │   │   │   ├── request_file.dart
│   │   │   │   ├── request_form_data.dart
│   │   │   │   └── request_handler.dart
│   │   │   ├── response/
│   │   │   │   ├── response.dart
│   │   │   │   └── stream_file.dart
│   │   │   ├── session/
│   │   │   │   ├── session_file_store.dart
│   │   │   │   └── session_manager.dart
│   │   │   └── validation/
│   │   │       ├── custom_validation_rule.dart
│   │   │       ├── field_validation.dart
│   │   │       ├── nested_validation.dart
│   │   │       ├── rules.dart
│   │   │       ├── validation_chain/
│   │   │       │   ├── export_chain_validation.dart
│   │   │       │   ├── rules/
│   │   │       │   │   ├── between.dart
│   │   │       │   │   ├── confirmed.dart
│   │   │       │   │   ├── end_width.dart
│   │   │       │   │   ├── greater_than.dart
│   │   │       │   │   ├── in_array.dart
│   │   │       │   │   ├── is_alpha.dart
│   │   │       │   │   ├── is_alpha_dash.dart
│   │   │       │   │   ├── is_alpha_numeric.dart
│   │   │       │   │   ├── is_array.dart
│   │   │       │   │   ├── is_boolean.dart
│   │   │       │   │   ├── is_date.dart
│   │   │       │   │   ├── is_double.dart
│   │   │       │   │   ├── is_email.dart
│   │   │       │   │   ├── is_file.dart
│   │   │       │   │   ├── is_image.dart
│   │   │       │   │   ├── is_integer.dart
│   │   │       │   │   ├── is_ip.dart
│   │   │       │   │   ├── is_json.dart
│   │   │       │   │   ├── is_numeric.dart
│   │   │       │   │   ├── is_required.dart
│   │   │       │   │   ├── is_string.dart
│   │   │       │   │   ├── is_url.dart
│   │   │       │   │   ├── is_uuid.dart
│   │   │       │   │   ├── lenght_between.dart
│   │   │       │   │   ├── less_than.dart
│   │   │       │   │   ├── max.dart
│   │   │       │   │   ├── max_lenght.dart
│   │   │       │   │   ├── min.dart
│   │   │       │   │   ├── min_lenght.dart
│   │   │       │   │   ├── not_in_array.dart
│   │   │       │   │   ├── required_if.dart
│   │   │       │   │   ├── required_if_not.dart
│   │   │       │   │   └── start_with.dart
│   │   │       │   ├── validation.dart
│   │   │       │   └── validation_rule.dart
│   │   │       ├── validation_item.dart
│   │   │       └── validator.dart
│   │   ├── ioc_container.dart
│   │   ├── localization_handler/
│   │   │   └── localization.dart
│   │   ├── logger/
│   │   │   └── logger.dart
│   │   ├── mail/
│   │   │   ├── content.dart
│   │   │   ├── envelope.dart
│   │   │   ├── mail.dart
│   │   │   ├── mail_view.dart
│   │   │   └── mailable.dart
│   │   ├── redis/
│   │   │   ├── command/
│   │   │   │   ├── client.dart
│   │   │   │   ├── codec.dart
│   │   │   │   └── commands.dart
│   │   │   ├── exception.dart
│   │   │   ├── lowlevel/
│   │   │   │   ├── protocol_client.dart
│   │   │   │   └── resp.dart
│   │   │   ├── redis.dart
│   │   │   └── vania_redis.dart
│   │   ├── route/
│   │   │   ├── middleware/
│   │   │   │   ├── csrf_middleware.dart
│   │   │   │   └── throttle.dart
│   │   │   ├── route.dart
│   │   │   ├── route_data.dart
│   │   │   ├── route_handler.dart
│   │   │   ├── route_history.dart
│   │   │   ├── router.dart
│   │   │   ├── set_static_path.dart
│   │   │   └── throttle_requests.dart
│   │   ├── server/
│   │   │   ├── base_http_server.dart
│   │   │   └── initialize_config.dart
│   │   ├── service/
│   │   │   └── service_provider.dart
│   │   ├── storage/
│   │   │   ├── local_storage.dart
│   │   │   ├── s3_storage.dart
│   │   │   ├── storage.dart
│   │   │   └── storage_driver.dart
│   │   ├── utils/
│   │   │   ├── _pluralize.dart
│   │   │   ├── functions.dart
│   │   │   ├── helper.dart
│   │   │   └── request_helper.dart
│   │   ├── view_engine/
│   │   │   ├── helper.dart
│   │   │   ├── processor_engine/
│   │   │   │   ├── abs_processor.dart
│   │   │   │   ├── assets_processor.dart
│   │   │   │   ├── comment_processor.dart
│   │   │   │   ├── csrf_processor.dart
│   │   │   │   ├── csrf_token_processor.dart
│   │   │   │   ├── error_processor.dart
│   │   │   │   ├── evaluate_expression.dart
│   │   │   │   ├── extends_processor.dart
│   │   │   │   ├── for_loop_processor.dart
│   │   │   │   ├── if_statement_processor.dart
│   │   │   │   ├── include_processor.dart
│   │   │   │   ├── old_processor.dart
│   │   │   │   ├── route_processor.dart
│   │   │   │   ├── section_processor.dart
│   │   │   │   ├── session_processor.dart
│   │   │   │   ├── switch_cases_processor.dart
│   │   │   │   ├── translate_processor.dart
│   │   │   │   └── variables_processor.dart
│   │   │   ├── template_engine.dart
│   │   │   └── template_reader.dart
│   │   └── websocket/
│   │       ├── web_socket_handler.dart
│   │       ├── websocket_client.dart
│   │       ├── websocket_constants.dart
│   │       ├── websocket_event.dart
│   │       └── websocket_session.dart
│   ├── vania.dart
│   └── websocket.dart
├── pubspec.yaml
└── test/
    ├── src/
    │   └── extensions/
    │       ├── date_time_extension_test.dart
    │       ├── number_extension_test.dart
    │       ├── string_extension_test.dart
    │       └── string_list_extension_test.dart
    └── unit/
        ├── hash_test.dart
        ├── route_test.dart
        └── validation_test.dart
Download .txt
SYMBOL INDEX (1679 symbols across 246 files)

FILE: example/app_exception_handler.dart
  class DatabaseExceptionHandler (line 11) | class DatabaseExceptionHandler extends ExceptionHandler<DatabaseExceptio...
    method handle (line 13) | Response handle(DatabaseException exception, Request? request)
  class QueryExceptionHandler (line 22) | class QueryExceptionHandler extends ExceptionHandler<QueryException> {
    method handle (line 24) | Response handle(QueryException exception, Request? request)
  class NotFoundExceptionHandler (line 33) | class NotFoundExceptionHandler extends ExceptionHandler<NotFoundExceptio...
    method handle (line 35) | Response handle(NotFoundException exception, Request? request)
  class ValidationExceptionHandler (line 43) | class ValidationExceptionHandler extends ExceptionHandler<ValidationExce...
    method handle (line 45) | Response handle(ValidationException exception, Request? request)
  class ThirdPartyExceptionHandler (line 54) | class ThirdPartyExceptionHandler extends GeneralExceptionHandler {
    method handle (line 56) | Response? handle(dynamic exception, Request? request)
  class AppExceptionServiceProvider (line 65) | class AppExceptionServiceProvider extends ServiceProvider {
    method boot (line 67) | Future<void> boot()
    method register (line 70) | Future<void> register()

FILE: example/main.dart
  function main (line 4) | void main()

FILE: lib/application.dart
  class Application (line 11) | class Application extends Container {
    method addExceptionHandler (line 28) | void addExceptionHandler<T>(ExceptionHandler<T> handler)
    method addExceptionHandlers (line 32) | void addExceptionHandlers(Map<Type, ExceptionHandler> handlers)
    method setGeneralExceptionHandler (line 36) | void setGeneralExceptionHandler(GeneralExceptionHandler handler)
    method getExceptionHandler (line 40) | ExceptionHandler? getExceptionHandler(Type type)
    method getGeneralExceptionHandler (line 44) | GeneralExceptionHandler? getGeneralExceptionHandler()
    method initialize (line 50) | Future<void> initialize({
    method close (line 67) | Future<void> close()

FILE: lib/src/authentication/authenticate.dart
  class Authenticate (line 10) | class Authenticate extends Middleware {

FILE: lib/src/authentication/authentication.dart
  class Auth (line 13) | class Auth {
    method user (line 26) | Map<String, dynamic> user()
    method id (line 28) | dynamic id()
    method get (line 30) | dynamic get(String filed)
    method guard (line 44) | Auth guard(String guard)
    method login (line 61) | Auth login(Map<String, dynamic> user, [bool basic = false])
    method logout (line 69) | Future<void> logout()
    method _updateSession (line 84) | Future<void> _updateSession()
    method createToken (line 111) | Future<Map<String, dynamic>> createToken({
    method createTokenByRefreshToken (line 148) | Future<Map<String, dynamic>> createTokenByRefreshToken(
    method deleteTokens (line 200) | Future<bool> deleteTokens(dynamic userId)
    method deleteCurrentToken (line 216) | Future<bool> deleteCurrentToken(String token)
    method check (line 240) | Future<bool> check(

FILE: lib/src/authentication/gate/gate.dart
  class Gate (line 1) | class Gate {
    method define (line 17) | void define(String ability, Function callback)
    method allows (line 23) | bool allows(String ability)
    method has (line 32) | bool has(String ability)
    method denies (line 37) | bool denies(String ability)

FILE: lib/src/authentication/has_api_tokens.dart
  class HasApiTokens (line 7) | class HasApiTokens {
    method setPayload (line 14) | HasApiTokens setPayload(Map<String, dynamic> payload)
    method createToken (line 36) | Map<String, dynamic> createToken([
    method refreshToken (line 95) | Map<String, dynamic> refreshToken(
    method verify (line 117) | Map<String, dynamic> verify(String token, String guard, String expecte...

FILE: lib/src/authentication/model/personal_access_token.dart
  class PersonalAccessToken (line 3) | class PersonalAccessToken extends Model {

FILE: lib/src/authentication/redirect_if_authenticated.dart
  class RedirectIfAuthenticated (line 7) | class RedirectIfAuthenticated extends Middleware {
    method handle (line 12) | Future handle(Request req)

FILE: lib/src/aws/s3_client.dart
  class S3Client (line 8) | class S3Client {
    method buildUri (line 18) | Uri buildUri(String key)
    method _hmacSha256 (line 22) | Uint8List _hmacSha256(Uint8List key, String data)
    method _getSignatureKey (line 27) | Uint8List _getSignatureKey(
    method generateS3Headers (line 40) | Map<String, String> generateS3Headers(

FILE: lib/src/cache/cache.dart
  class Cache (line 7) | class Cache {
    method put (line 28) | Future<void> put(
    method forever (line 43) | Future<void> forever(String key, String value)
    method delete (line 51) | Future<void> delete(String key)
    method get (line 59) | Future<dynamic> get(String key, [dynamic defaultValue])
    method has (line 67) | Future<bool> has(String key)

FILE: lib/src/cache/cache_driver.dart
  class CacheDriver (line 1) | abstract class CacheDriver {
    method put (line 2) | Future<void> put(String key, dynamic value, {Duration duration})
    method forever (line 4) | Future<void> forever(String key, dynamic value)
    method delete (line 6) | Future<void> delete(String key)
    method get (line 8) | Future<dynamic> get(String key, [dynamic defaultValue])
    method has (line 10) | Future<bool> has(String key)

FILE: lib/src/cache/file_cache_driver.dart
  class FileCacheDriver (line 7) | class FileCacheDriver implements CacheDriver {
    method get (line 15) | Future<dynamic> get(String key, [dynamic defaultValue])
    method put (line 39) | Future<void> put(
    method forever (line 55) | Future<void> forever(String key, dynamic value)
    method has (line 69) | Future<bool> has(String key)
    method delete (line 75) | Future<bool> delete(String key)
    method _getCacheFile (line 87) | File _getCacheFile(String key)
    method _ensureCacheDirectory (line 92) | Future<void> _ensureCacheDirectory()

FILE: lib/src/cache/redis_cache_driver.dart
  class RedisCacheDriver (line 6) | class RedisCacheDriver extends CacheDriver {
    method delete (line 10) | Future<void> delete(String key)
    method forever (line 16) | Future<void> forever(String key, value)
    method get (line 22) | Future get(String key, [defaultValue])
    method has (line 28) | Future<bool> has(String key)
    method put (line 34) | Future<void> put(String key, value, {Duration? duration})

FILE: lib/src/config/config.dart
  class Config (line 1) | class Config {
    method get (line 9) | dynamic get(String key)
  class CORSConfig (line 12) | class CORSConfig {

FILE: lib/src/config/http_cors.dart
  class HttpCors (line 5) | class HttpCors {
    method _setCorsValue (line 25) | void _setCorsValue(HttpResponse res, String key, dynamic data)

FILE: lib/src/container.dart
  class Container (line 1) | class Container {}

FILE: lib/src/contract/database/_connectors/_database_connection.dart
  class DatabaseConnection (line 1) | abstract interface class DatabaseConnection {
    method connect (line 2) | Future<void> connect()
    method select (line 3) | Future<List<Map<String, dynamic>>> select(
    method insert (line 7) | Future insert(String query, [Map<String, dynamic> bindings = const {}])
    method execute (line 8) | Future<bool> execute(
    method transaction (line 12) | Future<T> transaction<T>(Future<T> Function() action)
    method close (line 14) | Future<void> close()

FILE: lib/src/contract/database/query_builder/_bulk_operations_builder.dart
  type ConflictAction (line 3) | enum ConflictAction { update, ignore, replace, delete }
  class BulkOperationsBuilder (line 5) | abstract class BulkOperationsBuilder {
    method merge (line 6) | Future<bool> merge(
    method bulkInsert (line 17) | Future<bool> bulkInsert(
    method bulkUpdate (line 26) | Future<bool> bulkUpdate(
    method bulkDelete (line 34) | Future<bool> bulkDelete({
    method bulkDeleteWhere (line 40) | Future<bool> bulkDeleteWhere(
    method batchProcess (line 45) | Future<void> batchProcess({
    method chunkedProcess (line 55) | Future<void> chunkedProcess({
    method parallelBulkInsert (line 65) | Future<bool> parallelBulkInsert(
    method transactionalBulkOperation (line 73) | Future<bool> transactionalBulkOperation(Future<bool> Function() operat...

FILE: lib/src/contract/database/query_builder/_cte_builder.dart
  class CteBuilder (line 3) | abstract class CteBuilder {
    method withCte (line 4) | QueryBuilder withCte(
    method withMultiple (line 10) | QueryBuilder withMultiple(
    method withRecursive (line 15) | QueryBuilder withRecursive(
    method withMaterialized (line 22) | QueryBuilder withMaterialized(
    method withNotMaterialized (line 28) | QueryBuilder withNotMaterialized(

FILE: lib/src/contract/database/query_builder/_delete_query_builder.dart
  class DeleteQueryBuilder (line 3) | abstract interface class DeleteQueryBuilder {
    method delete (line 4) | Future<bool> delete()
    method truncate (line 5) | Future<bool> truncate({bool force = false})

FILE: lib/src/contract/database/query_builder/_insert_query_builder.dart
  class InsertQueryBuilder (line 3) | abstract interface class InsertQueryBuilder {
    method insert (line 4) | Future<bool> insert(Map<String, dynamic> values)
    method insertGetId (line 5) | Future insertGetId(Map<String, dynamic> values, [String? sequence])
    method insertMany (line 6) | Future<bool> insertMany(List<Map<String, dynamic>> values)
    method insertOrIgnore (line 7) | Future<bool> insertOrIgnore(Map<String, dynamic> values)
    method insertUsing (line 8) | Future<bool> insertUsing(List<String> columns, QueryBuilder subQuery)
    method upsert (line 9) | Future<bool> upsert(

FILE: lib/src/contract/database/query_builder/_join_clause_builder.dart
  class JoinClauseBuilder (line 3) | abstract interface class JoinClauseBuilder {
    method crossJoin (line 4) | QueryBuilder crossJoin(String table, [List<dynamic> bindings = const []])
    method join (line 6) | QueryBuilder join(
    method joinSub (line 15) | QueryBuilder joinSub(
    method leftJoin (line 24) | QueryBuilder leftJoin(
    method leftJoinSub (line 32) | QueryBuilder leftJoinSub(
    method rightJoin (line 40) | QueryBuilder rightJoin(

FILE: lib/src/contract/database/query_builder/_query_executor_builder.dart
  class QueryExecutorBuilder (line 3) | abstract class QueryExecutorBuilder {
    method avg (line 4) | Future<num> avg(String column)
    method chunk (line 5) | Future<void> chunk(
    method chunkById (line 9) | Future<void> chunkById(
    method count (line 14) | Future<int> count([String columns = '*'])
    method doesntExist (line 15) | Future<bool> doesntExist()
    method each (line 16) | Future<void> each(void Function(Map<String, dynamic>) callback)
    method exists (line 17) | Future<bool> exists()
    method find (line 18) | Future<Map<String, dynamic>?> find(
    method findOrFail (line 24) | Future<Map<String, dynamic>?> findOrFail(
    method first (line 29) | Future<Map<String, dynamic>?> first([List<String> columns])
    method firstOrFail (line 30) | Future<Map<String, dynamic>?> firstOrFail([
    method firstWhere (line 33) | Future<Map<String, dynamic>?> firstWhere(
    method get (line 39) | Future<List<Map<String, dynamic>>> get([List<String> columns])
    method lazy (line 41) | Stream<Iterable<Map<String, dynamic>>> lazy([
    method cursor (line 45) | Stream<Map<String, dynamic>> cursor([int chunk = 1000])
    method max (line 46) | Future<dynamic> max(String column)
    method min (line 47) | Future<dynamic> min(String column)
    method paginate (line 48) | Future<Map<String, dynamic>> paginate({
    method pluck (line 54) | Future<dynamic> pluck(String column, [String? key])
    method simplePaginate (line 55) | Future<Map<String, dynamic>> simplePaginate([
    method sum (line 61) | Future<num> sum(String column)
    method value (line 63) | Future<dynamic> value(String column)

FILE: lib/src/contract/database/query_builder/_select_query_builder.dart
  class SelectQueryBuilder (line 3) | abstract interface class SelectQueryBuilder {
    method addSelect (line 4) | QueryBuilder addSelect(List<String> columns)
    method select (line 6) | QueryBuilder select([List<String> columns])
    method selectRaw (line 8) | QueryBuilder selectRaw(String query, [List bindings = const []])
    method selectSub (line 9) | QueryBuilder selectSub(QueryBuilder subQuery, String as)

FILE: lib/src/contract/database/query_builder/_union_clause_builder.dart
  class UnionClauseBuilder (line 3) | abstract interface class UnionClauseBuilder {
    method union (line 4) | QueryBuilder union(QueryBuilder query)
    method unionAll (line 5) | QueryBuilder unionAll(QueryBuilder query)

FILE: lib/src/contract/database/query_builder/_update_query_builder.dart
  class UpdateQueryBuilder (line 3) | abstract interface class UpdateQueryBuilder {
    method decrement (line 4) | Future<bool> decrement(
    method increment (line 9) | Future<bool> increment(
    method incrementEach (line 14) | Future<bool> incrementEach(
    method update (line 18) | Future<bool> update(Map<String, dynamic> values)
    method updateMany (line 20) | Future<bool> updateMany(List<Map<String, dynamic>> updates, String col...
    method updateOrInsert (line 22) | Future<bool> updateOrInsert(

FILE: lib/src/contract/database/query_builder/_where_clauses_builder.dart
  class WhereClausesBuilder (line 3) | abstract interface class WhereClausesBuilder {
    method orWhere (line 4) | QueryBuilder orWhere(
    method orWhereBetween (line 10) | QueryBuilder orWhereBetween(String column, List values, {bool not = fa...
    method orWhereColumn (line 12) | QueryBuilder orWhereColumn(
    method orWhereDate (line 18) | QueryBuilder orWhereDate(String column, String operator, dynamic value)
    method orWhereDay (line 20) | QueryBuilder orWhereDay(String column, String operator, dynamic value)
    method orWhereExists (line 22) | QueryBuilder orWhereExists(QueryCallback callback, {bool not = false})
    method orWhereFullText (line 24) | QueryBuilder orWhereFullText(
    method orWhereHour (line 30) | QueryBuilder orWhereHour(String column, String operator, dynamic value)
    method orWhereIn (line 32) | QueryBuilder orWhereIn(String column, List values, {bool not = false})
    method orWhereJsonContains (line 33) | QueryBuilder orWhereJsonContains(
    method orWhereJsonDoesntContain (line 38) | QueryBuilder orWhereJsonDoesntContain(String column, dynamic value)
    method orWhereJsonLength (line 39) | QueryBuilder orWhereJsonLength(String column, String operator, dynamic...
    method orWhereLike (line 41) | QueryBuilder orWhereLike(
    method orWhereMonth (line 46) | QueryBuilder orWhereMonth(String column, String operator, dynamic value)
    method orWhereNotBetween (line 47) | QueryBuilder orWhereNotBetween(String column, List values)
    method orWhereNotExists (line 48) | QueryBuilder orWhereNotExists(QueryCallback callback)
    method orWhereNotIn (line 50) | QueryBuilder orWhereNotIn(String column, List values)
    method orWhereNotLike (line 51) | QueryBuilder orWhereNotLike(
    method orWhereNotNull (line 57) | QueryBuilder orWhereNotNull(String column)
    method orWhereNull (line 58) | QueryBuilder orWhereNull(String column)
    method orWhereRaw (line 60) | QueryBuilder orWhereRaw(String sql, [List<dynamic> bindings = const []])
    method orWhereRowValues (line 61) | QueryBuilder orWhereRowValues(
    method orWhereTime (line 67) | QueryBuilder orWhereTime(String column, String operator, dynamic value)
    method orWhereYear (line 68) | QueryBuilder orWhereYear(String column, String operator, dynamic value)
    method where (line 70) | QueryBuilder where(
    method whereAfterToday (line 76) | QueryBuilder whereAfterToday(String column, {String boolean = 'and'})
    method whereAll (line 78) | QueryBuilder whereAll(
    method whereAny (line 83) | QueryBuilder whereAny(
    method whereBeforeToday (line 89) | QueryBuilder whereBeforeToday(String column, {String boolean = 'and'})
    method whereBetween (line 90) | QueryBuilder whereBetween(
    method whereBetweenColumns (line 97) | QueryBuilder whereBetweenColumns(
    method whereColumn (line 102) | QueryBuilder whereColumn(
    method whereDate (line 109) | QueryBuilder whereDate(
    method whereDay (line 115) | QueryBuilder whereDay(
    method whereEqualTo (line 122) | QueryBuilder whereEqualTo(
    method whereExists (line 127) | QueryBuilder whereExists(
    method whereFullText (line 133) | QueryBuilder whereFullText(
    method whereFuture (line 138) | QueryBuilder whereFuture(String column, {String boolean = 'and'})
    method whereGreaterThan (line 140) | QueryBuilder whereGreaterThan(
    method whereGreaterThanOrEqualTo (line 145) | QueryBuilder whereGreaterThanOrEqualTo(
    method whereHour (line 151) | QueryBuilder whereHour(
    method whereIn (line 157) | QueryBuilder whereIn(
    method whereJsonContains (line 164) | QueryBuilder whereJsonContains(
    method whereJsonDoesntContain (line 170) | QueryBuilder whereJsonDoesntContain(
    method whereJsonLength (line 176) | QueryBuilder whereJsonLength(
    method whereLessThan (line 182) | QueryBuilder whereLessThan(
    method whereLessThanOrEqualTo (line 188) | QueryBuilder whereLessThanOrEqualTo(
    method whereLike (line 193) | QueryBuilder whereLike(
    method whereMonth (line 200) | QueryBuilder whereMonth(
    method whereNone (line 206) | QueryBuilder whereNone(
    method whereNotBetween (line 212) | QueryBuilder whereNotBetween(
    method whereNotBetweenColumns (line 217) | QueryBuilder whereNotBetweenColumns(
    method whereNotEqualTo (line 222) | QueryBuilder whereNotEqualTo(
    method whereNotExists (line 227) | QueryBuilder whereNotExists(QueryCallback callback, {String boolean = ...
    method whereNotIn (line 229) | QueryBuilder whereNotIn(String column, List values, {String boolean = ...
    method whereNotLike (line 231) | QueryBuilder whereNotLike(
    method whereNotNull (line 238) | QueryBuilder whereNotNull(String column, {String boolean = 'and'})
    method whereNowOrFuture (line 240) | QueryBuilder whereNowOrFuture(String column, {String boolean = 'and'})
    method whereNowOrPast (line 241) | QueryBuilder whereNowOrPast(String column, {String boolean = 'and'})
    method whereNull (line 242) | QueryBuilder whereNull(
    method wherePast (line 247) | QueryBuilder wherePast(String column, {String boolean = 'and'})
    method whereRaw (line 248) | QueryBuilder whereRaw(
    method whereRowValues (line 253) | QueryBuilder whereRowValues(
    method whereTime (line 259) | QueryBuilder whereTime(
    method whereToday (line 265) | QueryBuilder whereToday(String column, {String boolean = 'and'})
    method whereTodayOrAfter (line 266) | QueryBuilder whereTodayOrAfter(String column, {String boolean = 'and'})
    method whereTodayOrBefore (line 268) | QueryBuilder whereTodayOrBefore(String column, {String boolean = 'and'})
    method whereYear (line 269) | QueryBuilder whereYear(
    method whereHas (line 276) | QueryBuilder whereHas(
    method orWhereHas (line 282) | QueryBuilder orWhereHas(String relation, QueryCallback callback)
    method whereDoesntHave (line 284) | QueryBuilder whereDoesntHave(
    method orWhereDoesntHave (line 290) | QueryBuilder orWhereDoesntHave(String relation, QueryCallback callback)
    method withSoftDeletes (line 292) | QueryBuilder withSoftDeletes([String column = 'deleted_at'])

FILE: lib/src/contract/database/query_builder/_window_functions_builder.dart
  class WindowFunctionsBuilder (line 3) | abstract interface class WindowFunctionsBuilder {
    method rowNumber (line 4) | QueryBuilder rowNumber({String? partitionBy, String? orderBy, String? ...
    method rank (line 6) | QueryBuilder rank({String? partitionBy, String? orderBy, String? as})
    method denseRank (line 8) | QueryBuilder denseRank({String? partitionBy, String? orderBy, String? ...
    method lag (line 10) | QueryBuilder lag(
    method lead (line 19) | QueryBuilder lead(
    method firstValue (line 28) | QueryBuilder firstValue(
    method lastValue (line 35) | QueryBuilder lastValue(
    method ntile (line 42) | QueryBuilder ntile(
    method percentRank (line 49) | QueryBuilder percentRank({String? partitionBy, String? orderBy, String...
    method cumeDist (line 51) | QueryBuilder cumeDist({String? partitionBy, String? orderBy, String? as})
    method windowSum (line 53) | QueryBuilder windowSum(
    method windowAvg (line 60) | QueryBuilder windowAvg(
    method windowCount (line 67) | QueryBuilder windowCount(
    method windowMax (line 74) | QueryBuilder windowMax(
    method windowMin (line 81) | QueryBuilder windowMin(

FILE: lib/src/contract/database/query_builder/query_builder.dart
  type QueryCallback (line 21) | typedef QueryCallback = QueryBuilder Function(QueryBuilder qb);
  class QueryBuilder (line 23) | abstract class QueryBuilder
    method build (line 48) | String build({String? aggregateFunction, String? aggregateColumn})
    method toSql (line 49) | String toSql()
    method toRawSql (line 50) | String toRawSql()
    method getConnection (line 61) | Future<DatabaseConnection> getConnection()
    method connection (line 69) | QueryBuilder connection([String? connection])
    method table (line 71) | QueryBuilder table(String table, [String? as])
    method raw (line 73) | RawExpression raw(String value)
    method transaction (line 75) | Future<bool> transaction(
    method alerts (line 80) | Stream<DatabaseAlert> alerts()
    method getPerformanceStats (line 81) | Map<String, PerformanceStats> getPerformanceStats()
    method getBindings (line 83) | Map<String, dynamic> getBindings()
    method buildJoins (line 88) | String buildJoins()
    method buildWhereClause (line 93) | String buildWhereClause()
    method formatValue (line 98) | String formatValue(dynamic value)
    method groupBy (line 103) | QueryBuilder groupBy(List<String> groups)
    method having (line 104) | QueryBuilder having(
    method havingBetween (line 111) | QueryBuilder havingBetween(
    method inRandomOrder (line 117) | QueryBuilder inRandomOrder([dynamic seed])
    method latest (line 118) | QueryBuilder latest([String column = 'created_at'])
    method limit (line 120) | QueryBuilder limit(int value)
    method offset (line 121) | QueryBuilder offset(int value)
    method orderBy (line 123) | QueryBuilder orderBy(String column, [String direction = 'ASC'])
    method orderByAsc (line 125) | QueryBuilder orderByAsc(String column)
    method orderByDesc (line 127) | QueryBuilder orderByDesc(String column)
    method reorder (line 128) | QueryBuilder reorder([String? column, String? direction])
    method skip (line 130) | QueryBuilder skip(int value)
    method take (line 132) | QueryBuilder take(int value)

FILE: lib/src/contract/http/request/form_validation.dart
  class FormValidation (line 3) | abstract class FormValidation {
    method rules (line 4) | dynamic rules()
    method customRule (line 5) | List<CustomValidationRule> customRule()
    method messages (line 6) | Map<String, String> messages()
    method authorize (line 7) | bool authorize()

FILE: lib/src/contract/orm/morph_relation.dart
  class MorphRelation (line 3) | abstract class MorphRelation extends Relation {

FILE: lib/src/contract/orm/relation.dart
  class Relation (line 3) | abstract class Relation {
    method buildDictionary (line 16) | Map<String, List<Map<String, dynamic>>> buildDictionary(
    method match (line 33) | List<Map<String, dynamic>> match(
    method matchOneOrMany (line 39) | List<Map<String, dynamic>> matchOneOrMany(
    method matchToMany (line 67) | List<Map<String, dynamic>> matchToMany(
    method matchMany (line 100) | List<Map<String, dynamic>> matchMany(
    method matchMorphMany (line 136) | List<Map<String, dynamic>> matchMorphMany(
    method matchMorphToOne (line 170) | List<Map<String, dynamic>> matchMorphToOne(
    method matchMorphOneOrMany (line 192) | List<Map<String, dynamic>> matchMorphOneOrMany(

FILE: lib/src/cryptographic/hash.dart
  class Hash (line 6) | class Hash {
    method setHashKey (line 13) | Hash setHashKey(String hashKey)
    method make (line 26) | String make(String password)
    method verify (line 42) | bool verify(String plainPassword, String hashedPassword)
    method _generateSalt (line 50) | String _generateSalt()
    method _hashPbkdf2 (line 71) | String _hashPbkdf2(String password, String salt)
    method _hashEquals (line 87) | bool _hashEquals(String salt, String hashedPassword)

FILE: lib/src/cryptographic/vania_encryption.dart
  class VaniaEncryption (line 5) | class VaniaEncryption {
    method encryptString (line 21) | Future<String> encryptString(
    method decryptString (line 67) | Future<String> decryptString(

FILE: lib/src/database/_connection_manager.dart
  class ConnectionManager (line 13) | class ConnectionManager {
    method connection (line 29) | DatabaseConnection? connection([String? connectionName])
    method connect (line 36) | Future<void> connect(DBConfig config, String connectionName)
    method _checkDatabaseHealth (line 57) | Future<void> _checkDatabaseHealth(DatabaseConnection connection)
    method transaction (line 65) | Future<bool> transaction(
    method getPerformanceStats (line 86) | Map<String, PerformanceStats> getPerformanceStats()

FILE: lib/src/database/_connectors/_database_connection_factory.dart
  class DatabaseConnectionFactory (line 8) | class DatabaseConnectionFactory {
    method createConnection (line 9) | DatabaseConnection createConnection(DBConfig config)

FILE: lib/src/database/_connectors/_database_connection_proxy.dart
  class DatabaseConnectionProxy (line 8) | class DatabaseConnectionProxy implements DatabaseConnection {
    method connect (line 19) | Future<void> connect()
    method close (line 22) | Future<void> close()
    method _formatQuery (line 24) | String _formatQuery(String? query, Map<String, dynamic> bindings)
    method _formatValue (line 57) | String _formatValue(dynamic value)
    method execute (line 66) | Future<bool> execute(
    method select (line 89) | Future<List<Map<String, dynamic>>> select(
    method insert (line 112) | Future<dynamic> insert(
    method transaction (line 135) | Future<T> transaction<T>(Future<T> Function() action)

FILE: lib/src/database/_database_utils/_db_config.dart
  class DBConfig (line 1) | class DBConfig {

FILE: lib/src/database/_database_utils/_paginated_result.dart
  class PaginatedResult (line 3) | class PaginatedResult {
    method toMap (line 24) | Map<String, dynamic> toMap()
    method toString (line 36) | String toString()

FILE: lib/src/database/_database_utils/_raw_expression.dart
  class RawExpression (line 3) | class RawExpression {
    method toString (line 8) | String toString()

FILE: lib/src/database/_database_utils/_singularize.dart
  class Singularize (line 1) | class Singularize {
    method make (line 2) | String make(String tableName)
    method pluralize (line 109) | String pluralize(String word)
    method _preserveCase (line 216) | String _preserveCase(String original, String converted)
    method isPlural (line 230) | bool isPlural(String word)
    method isSingular (line 292) | bool isSingular(String word)

FILE: lib/src/database/adapters/_mysql_connector.dart
  class MySqlConnector (line 9) | class MySqlConnector implements DatabaseConnection {
    method close (line 17) | Future<void> close()
    method connect (line 22) | Future<void> connect()
    method execute (line 55) | Future<bool> execute(
    method transaction (line 68) | Future<T> transaction<T>(Future<T> Function() action)
    method select (line 103) | Future<List<Map<String, dynamic>>> select(
    method insert (line 144) | Future insert(

FILE: lib/src/database/adapters/_postgres_connector.dart
  class PostgresConnector (line 9) | class PostgresConnector implements DatabaseConnection {
    method close (line 16) | Future<void> close()
    method _getEncoding (line 20) | Encoding _getEncoding(String encoding)
    method _onOpen (line 35) | Future<void> _onOpen(Connection conn, DBConfig configParser)
    method connect (line 46) | Future<void> connect()
    method execute (line 90) | Future<bool> execute(
    method select (line 106) | Future<List<Map<String, dynamic>>> select(
    method insert (line 136) | Future insert(
    method transaction (line 152) | Future<T> transaction<T>(Future<T> Function() action)

FILE: lib/src/database/adapters/_sqlite_connector.dart
  class SQLiteConnector (line 11) | class SQLiteConnector implements DatabaseConnection {
    method close (line 18) | Future<void> close()
    method connect (line 23) | Future<void> connect()
    method _openOnLinux (line 39) | DynamicLibrary _openOnLinux()
    method _convertBindingsToList (line 47) | List<dynamic> _convertBindingsToList(
    method _convertNamedParamsToPositional (line 67) | String _convertNamedParamsToPositional(String query)
    method execute (line 72) | Future<bool> execute(
    method select (line 91) | Future<List<Map<String, dynamic>>> select(
    method insert (line 121) | Future insert(
    method transaction (line 141) | Future<T> transaction<T>(Future<T> Function() action)

FILE: lib/src/database/isolate_db.dart
  class IsolateDB (line 6) | class IsolateDB {
    method run (line 7) | Future<T> run<T>(

FILE: lib/src/database/migration/adapters/grammar/mysql_grammar.dart
  class MySqlGrammar (line 3) | class MySqlGrammar extends BaseGrammar {
    method convertQuery (line 17) | String convertQuery(String query)
    method _cleanupQuery (line 21) | String _cleanupQuery(String query)

FILE: lib/src/database/migration/adapters/grammar/postgresql_grammar.dart
  class PostgreSqlGrammar (line 4) | class PostgreSqlGrammar extends BaseGrammar {
    method convertQuery (line 105) | String convertQuery(String query)
    method _postgresqlSpecificCleanup (line 115) | String _postgresqlSpecificCleanup(String query)

FILE: lib/src/database/migration/adapters/grammar/sql_grammar.dart
  class SqlGrammar (line 1) | abstract class SqlGrammar {
    method convertQuery (line 2) | String convertQuery(String query)
  class BaseGrammar (line 13) | abstract class BaseGrammar implements SqlGrammar {
    method convertQuery (line 15) | String convertQuery(String query)
    method _cleanupQuery (line 46) | String _cleanupQuery(String query)

FILE: lib/src/database/migration/adapters/grammar/sqlite_grammar.dart
  class SqliteGrammar (line 3) | class SqliteGrammar extends BaseGrammar {
    method _extractColumnName (line 80) | String _extractColumnName()
    method convertQuery (line 85) | String convertQuery(String query)
    method _handleEnumConstraints (line 95) | String _handleEnumConstraints(String originalQuery, String convertedQu...

FILE: lib/src/database/migration/adapters/mysql_adapter.dart
  class MySqlAdapter (line 4) | class MySqlAdapter implements DatabaseAdapterInterface {
    method adaptQuery (line 15) | String adaptQuery(String query)
    method getMigrationsTableSql (line 20) | String getMigrationsTableSql()
    method supports (line 35) | bool supports(String driver)
    method escapeIdentifier (line 40) | String escapeIdentifier(String identifier)
    method formatValue (line 45) | String formatValue(dynamic value)

FILE: lib/src/database/migration/adapters/postgresql_adapter.dart
  class PostgreSqlAdapter (line 4) | class PostgreSqlAdapter implements DatabaseAdapterInterface {
    method adaptQuery (line 19) | String adaptQuery(String query)
    method adaptQueryToStatements (line 24) | List<String> adaptQueryToStatements(String query)
    method executeStatements (line 39) | Future<void> executeStatements(
    method _extractTableNameAndIndexes (line 47) | void _extractTableNameAndIndexes(String query)
    method _generateIndexStatements (line 94) | List<String> _generateIndexStatements()
    method getMigrationsTableSql (line 121) | String getMigrationsTableSql()
    method supports (line 132) | bool supports(String driver)
    method escapeIdentifier (line 140) | String escapeIdentifier(String identifier)
    method formatValue (line 145) | String formatValue(dynamic value)

FILE: lib/src/database/migration/adapters/sqlite_adapter.dart
  class SqliteAdapter (line 4) | class SqliteAdapter implements DatabaseAdapterInterface {
    method adaptQuery (line 15) | String adaptQuery(String query)
    method getMigrationsTableSql (line 20) | String getMigrationsTableSql()
    method supports (line 31) | bool supports(String driver)
    method escapeIdentifier (line 37) | String escapeIdentifier(String identifier)
    method formatValue (line 42) | String formatValue(dynamic value)

FILE: lib/src/database/migration/builders/column_definition.dart
  class ColumnDefinition (line 4) | class ColumnDefinition {
    method notNull (line 37) | ColumnDefinition notNull()
    method nullable (line 43) | ColumnDefinition nullable()
    method length (line 49) | ColumnDefinition length(int length)
    method unsigned (line 55) | ColumnDefinition unsigned()
    method zeroFill (line 61) | ColumnDefinition zeroFill()
    method defaultTo (line 67) | ColumnDefinition defaultTo(dynamic value)
    method defaultToCurrent (line 73) | ColumnDefinition defaultToCurrent()
    method comment (line 79) | ColumnDefinition comment(String comment)
    method collate (line 85) | ColumnDefinition collate(String collation)
    method charset (line 91) | ColumnDefinition charset(String charset)
    method autoIncrement (line 97) | ColumnDefinition autoIncrement()
    method unique (line 103) | ColumnDefinition unique([String? constraintName])
    method index (line 116) | ColumnDefinition index([
    method foreignKey (line 127) | ColumnDefinition foreignKey(
    method generated (line 148) | ColumnDefinition generated(
    method finalize (line 157) | void finalize()
    method _addColumnToSchema (line 164) | void _addColumnToSchema()

FILE: lib/src/database/migration/builders/column_types.dart
  function id (line 9) | ColumnDefinition id([String name = 'id'])
  function bigIncrements (line 20) | ColumnDefinition bigIncrements(String name)
  function integer (line 30) | ColumnDefinition integer(String name)
  function tinyInt (line 35) | ColumnDefinition tinyInt(String name)
  function smallInt (line 40) | ColumnDefinition smallInt(String name)
  function mediumInt (line 45) | ColumnDefinition mediumInt(String name)
  function bigInt (line 50) | ColumnDefinition bigInt(String name)
  function bit (line 55) | ColumnDefinition bit(String name)
  function float (line 60) | ColumnDefinition float(String name, {int? precision, int? scale})
  function double (line 69) | ColumnDefinition double(String name, {int? precision, int? scale})
  function decimal (line 78) | ColumnDefinition decimal(String name, {int? precision, int? scale})
  function string (line 87) | ColumnDefinition string(String name)
  function char (line 92) | ColumnDefinition char(String name)
  function tinyText (line 97) | ColumnDefinition tinyText(String name)
  function text (line 102) | ColumnDefinition text(String name)
  function mediumText (line 107) | ColumnDefinition mediumText(String name)
  function longText (line 112) | ColumnDefinition longText(String name)
  function json (line 117) | ColumnDefinition json(String name)
  function uuid (line 122) | ColumnDefinition uuid(String name)
  function binary (line 127) | ColumnDefinition binary(String name)
  function varBinary (line 132) | ColumnDefinition varBinary(String name)
  function tinyBlob (line 137) | ColumnDefinition tinyBlob(String name)
  function blob (line 142) | ColumnDefinition blob(String name)
  function mediumBlob (line 147) | ColumnDefinition mediumBlob(String name)
  function longBlob (line 152) | ColumnDefinition longBlob(String name)
  function date (line 157) | ColumnDefinition date(String name)
  function time (line 162) | ColumnDefinition time(String name)
  function year (line 167) | ColumnDefinition year(String name)
  function dateTime (line 172) | ColumnDefinition dateTime(String name)
  function timeStamp (line 177) | ColumnDefinition timeStamp(String name)
  function timeStamps (line 182) | void timeStamps()
  function softDeletes (line 188) | ColumnDefinition softDeletes([String name = 'deleted_at'])
  function point (line 193) | ColumnDefinition point(String name)
  function lineString (line 198) | ColumnDefinition lineString(String name)
  function polygon (line 203) | ColumnDefinition polygon(String name)
  function geometry (line 208) | ColumnDefinition geometry(String name)
  function multiPoint (line 213) | ColumnDefinition multiPoint(String name)
  function multiLineString (line 218) | ColumnDefinition multiLineString(String name)
  function multiPolygon (line 223) | ColumnDefinition multiPolygon(String name)
  function geometryCollection (line 228) | ColumnDefinition geometryCollection(String name)
  function enumType (line 233) | ColumnDefinition enumType(String name, List<String> values)
  function setType (line 239) | ColumnDefinition setType(String name, List<String> values)
  function boolean (line 245) | ColumnDefinition boolean(String name)

FILE: lib/src/database/migration/builders/schema.dart
  class Schema (line 4) | class Schema implements SchemaInterface {
    method setTableName (line 15) | void setTableName(String tableName)
    method registerColumnDefinition (line 19) | void registerColumnDefinition(dynamic columnDefinition)
    method _finalizeColumnDefinitions (line 23) | void _finalizeColumnDefinitions()
    method _addCompositeUniqueConstraints (line 34) | void _addCompositeUniqueConstraints()
    method _addCompositeIndexes (line 42) | void _addCompositeIndexes()
    method addColumn (line 60) | void addColumn(
    method primary (line 143) | void primary(String columnName, [String algorithm = 'BTREE'])
    method index (line 149) | void index(ColumnIndex type, String name, List<String> columns)
    method foreign (line 160) | void foreign(
    method reset (line 196) | void reset()
    method addCompositeUniqueConstraint (line 208) | void addCompositeUniqueConstraint(
    method addCompositeIndex (line 219) | void addCompositeIndex(
    method generateCreateTableSql (line 234) | String generateCreateTableSql(String tableName, {bool ifNotExists = fa...
    method generateCreateAlterSql (line 267) | String generateCreateAlterSql(
    method generateDropTableSql (line 306) | String generateDropTableSql(String tableName, {bool ifExists = false})

FILE: lib/src/database/migration/builders/table_definition.dart
  class TableDefinition (line 6) | class TableDefinition implements Future<void> {
    method engine (line 26) | TableDefinition engine(String engine)
    method comment (line 31) | TableDefinition comment(String comment)
    method charset (line 36) | TableDefinition charset(String charset)
    method collate (line 41) | TableDefinition collate(String collation)
    method autoIncrement (line 46) | TableDefinition autoIncrement(int startValue)
    method _getExecutionFuture (line 51) | Future<void> _getExecutionFuture()
    method then (line 57) | Future<R> then<R>(
    method catchError (line 65) | Future<void> catchError(
    method whenComplete (line 73) | Future<void> whenComplete(FutureOr<void> Function() action)
    method timeout (line 78) | Future<void> timeout(
    method asStream (line 86) | Stream<void> asStream()
    method _applyTableOptions (line 90) | Future<void> _applyTableOptions()

FILE: lib/src/database/migration/contracts/database_adapter_interface.dart
  class DatabaseAdapterInterface (line 1) | abstract class DatabaseAdapterInterface {
    method adaptQuery (line 4) | String adaptQuery(String query)
    method getMigrationsTableSql (line 6) | String getMigrationsTableSql()
    method supports (line 8) | bool supports(String driver)
    method escapeIdentifier (line 10) | String escapeIdentifier(String identifier)
    method formatValue (line 12) | String formatValue(dynamic value)

FILE: lib/src/database/migration/contracts/migration_connection_interface.dart
  class MigrationConnectionInterface (line 3) | abstract class MigrationConnectionInterface {
    method setup (line 8) | Future<void> setup(Map<String, dynamic> databaseConfig)
    method closeConnection (line 10) | Future<void> closeConnection()
    method truncateMigration (line 12) | Future<void> truncateMigration()

FILE: lib/src/database/migration/contracts/schema_interface.dart
  class SchemaInterface (line 3) | abstract class SchemaInterface {
    method addColumn (line 4) | void addColumn(
    method primary (line 20) | void primary(String columnName, [String algorithm = 'BTREE'])
    method index (line 22) | void index(ColumnIndex type, String name, List<String> columns)
    method foreign (line 24) | void foreign(
    method reset (line 43) | void reset()

FILE: lib/src/database/migration/migration.dart
  class Migration (line 11) | abstract class Migration {
    method up (line 25) | Future<void> up()
    method down (line 28) | Future<void> down()
    method create (line 30) | TableDefinition create(
    method createFunction (line 38) | Future<void> createFunction()
    method createTableIfNotExists (line 80) | TableDefinition createTableIfNotExists(
    method createFunction (line 87) | Future<void> createFunction()
    method alterColumn (line 132) | TableDefinition alterColumn(
    method createFunction (line 140) | Future<void> createFunction()
    method drop (line 167) | Future<void> drop(String tableName)
    method dropTableIfExists (line 192) | Future<void> dropTableIfExists(String tableName)
    method execute (line 212) | Future<void> execute(String sql)

FILE: lib/src/database/migration/migration_connection.dart
  class MigrationConnection (line 15) | class MigrationConnection implements MigrationConnectionInterface {
    method setup (line 38) | Future<void> setup(Map<String, dynamic> databaseConfig)
    method truncateMigration (line 77) | Future<void> truncateMigration()
    method closeConnection (line 98) | Future<void> closeConnection()
    method _createDBConfig (line 110) | DBConfig _createDBConfig(Map<String, dynamic> config)
    method _createAdapter (line 127) | DatabaseAdapterInterface _createAdapter(String driver)

FILE: lib/src/database/migration/runners/migration_runner.dart
  class MigrationRunner (line 9) | class MigrationRunner {
    method _runUp (line 13) | Future<void> _runUp(String migrationName, Function migrationCallback)
    method migrationRegister (line 45) | MigrationRunner migrationRegister(List<Migration> migrations)
    method run (line 56) | Future<void> run(List<String> args)
    method _runDown (line 85) | Future<void> _runDown(
    method _isMigrationExecuted (line 108) | Future<bool> _isMigrationExecuted(String migrationName)
    method _recordMigrationWithBatch (line 133) | Future<void> _recordMigrationWithBatch(
    method _removeMigrationRecord (line 166) | Future<void> _removeMigrationRecord(String migrationName)
    method _getNextBatchNumber (line 192) | Future<int> _getNextBatchNumber()
    method _getCurrentBatchNumber (line 202) | Future<int> _getCurrentBatchNumber()
    method _getMigrationsFromBatch (line 231) | Future<List<String>> _getMigrationsFromBatch(int batch)
    method _fresh (line 260) | Future<void> _fresh(List<Migration> migrations)
    method _install (line 286) | Future<void> _install()
    method _refresh (line 309) | Future<void> _refresh(Map<String, Migration> migrations)
    method _reset (line 331) | Future<void> _reset(Map<String, Migration> migrations)
    method _rollback (line 362) | Future<void> _rollback(
    method _getAllMigrationsInReverseOrder (line 412) | Future<List<String>> _getAllMigrationsInReverseOrder()
    method _getLastNMigrations (line 438) | Future<List<String>> _getLastNMigrations(int n)

FILE: lib/src/database/monitoring/database_monitor.dart
  type AlertType (line 4) | enum AlertType { slowQuery, highConnectionUsage, connectionError, deadlo...
  class DatabaseAlert (line 6) | class DatabaseAlert {
  class QueryMetrics (line 18) | class QueryMetrics {
  class PerformanceStats (line 30) | class PerformanceStats {
  class DatabaseMonitor (line 44) | class DatabaseMonitor {
    method recordQuery (line 60) | void recordQuery(String connectionId, String sql, Duration executionTime)
    method updateConnectionMetrics (line 89) | void updateConnectionMetrics(String connectionId, ConnectionMetrics me...
    method getSlowQueries (line 107) | List<QueryMetrics> getSlowQueries(String connectionId)
    method getPerformanceStats (line 114) | Map<String, PerformanceStats> getPerformanceStats()
    method clearMetrics (line 145) | void clearMetrics(String connectionId)
    method reset (line 151) | void reset()
  class ConnectionMetrics (line 157) | class ConnectionMetrics {

FILE: lib/src/database/orm/belongs_to.dart
  class BelongsTo (line 3) | class BelongsTo extends Relation {
    method match (line 12) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/belongs_to_many.dart
  class BelongsToMany (line 3) | class BelongsToMany extends Relation {
    method match (line 23) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/has_many.dart
  class HasMany (line 3) | class HasMany extends Relation {
    method match (line 11) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/has_one.dart
  class HasOne (line 3) | class HasOne extends Relation {
    method match (line 12) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/model.dart
  class Model (line 23) | abstract class Model extends QueryBuilderImpl {
    method registerRelations (line 81) | void registerRelations()
    method avg (line 84) | Future<num> avg(String column)
    method belongsTo (line 91) | void belongsTo(
    method belongsToMany (line 111) | void belongsToMany(
    method chunk (line 140) | Future<void> chunk(
    method chunkById (line 157) | Future<void> chunkById(
    method connection (line 175) | Model connection([String? connection])
    method count (line 181) | Future<int> count([String columns = '*'])
    method create (line 188) | Future<Map<String, dynamic>> create(Map<String, dynamic> values)
    method delete (line 200) | Future<bool> delete()
    method doesntExist (line 215) | Future<bool> doesntExist()
    method exists (line 223) | Future<bool> exists()
    method fill (line 230) | Model fill()
    method find (line 240) | Future<Map<String, dynamic>?> find(
    method findOrFail (line 264) | Future<Map<String, dynamic>?> findOrFail(
    method first (line 281) | Future<Map<String, dynamic>?> first([
    method firstWhere (line 299) | Future<Map<String, dynamic>?> firstWhere(
    method get (line 315) | Future<List<Map<String, dynamic>>> get([
    method getAttribute (line 334) | dynamic getAttribute(String key)
    method getKey (line 338) | dynamic getKey()
    method hasAttribute (line 342) | bool hasAttribute(String key)
    method hasMany (line 346) | void hasMany(
    method hasOne (line 366) | void hasOne(
    method insert (line 387) | Future<bool> insert(Map<String, dynamic> values)
    method insertGetId (line 395) | Future insertGetId(Map<String, dynamic> values, [String? sequence])
    method is_ (line 404) | bool is_(Model? model)
    method max (line 410) | Future max(String column)
    method min (line 418) | Future min(String column)
    method morphedByMany (line 425) | void morphedByMany(
    method morphMany (line 452) | void morphMany(
    method morphOne (line 475) | void morphOne(
    method morphTo (line 498) | void morphTo(
    method morphToMany (line 521) | void morphToMany(
    method newInstance (line 548) | Model newInstance()
    method paginate (line 553) | Future<Map<String, dynamic>> paginate({
    method pluck (line 582) | Future pluck(String column, [String? key])
    method setAttribute (line 589) | void setAttribute(String key, dynamic value)
    method simplePaginate (line 594) | Future<Map<String, dynamic>> simplePaginate([
    method sum (line 617) | Future<num> sum(String column)
    method toJson (line 624) | Map<String, dynamic> toJson()
    method update (line 638) | Future<bool> update(Map<String, dynamic> values)
    method updateMany (line 651) | Future<bool> updateMany(
    method updateOrInsert (line 668) | Future<bool> updateOrInsert(
    method upsert (line 679) | Future<bool> upsert(
    method value (line 693) | Future value(String column)
    method include (line 700) | Model include(String relation, [Function(Model qb)? callback])
    method _eagerLoadRelation (line 715) | Future<void> _eagerLoadRelation(
    method _loadRelations (line 847) | Future<List<Map<String, dynamic>>> _loadRelations(
    method _setdefaultConnection (line 866) | void _setdefaultConnection(String value)
    method _validateFieldsForAssignment (line 870) | void _validateFieldsForAssignment(Map<String, dynamic> values)
  class _RelationQuery (line 903) | class _RelationQuery {

FILE: lib/src/database/orm/polymorphic/morph_many.dart
  class MorphMany (line 3) | class MorphMany extends MorphRelation {
    method match (line 14) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/polymorphic/morph_one.dart
  class MorphOne (line 3) | class MorphOne extends MorphRelation {
    method match (line 14) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/polymorphic/morph_to.dart
  class MorphTo (line 3) | class MorphTo extends MorphRelation {
    method match (line 14) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/polymorphic/morph_to_many.dart
  class MorphToMany (line 3) | class MorphToMany extends MorphRelation {
    method match (line 16) | List<Map<String, dynamic>> match(

FILE: lib/src/database/orm/polymorphic/morphed_by_many.dart
  class MorphedByMany (line 3) | class MorphedByMany extends MorphRelation {
    method match (line 16) | List<Map<String, dynamic>> match(

FILE: lib/src/database/query_builder/_bulk_operations_builder_impl.dart
  class BulkOperationsBuilderImpl (line 10) | abstract mixin class BulkOperationsBuilderImpl implements QueryBuilder {
    method _nextParamName (line 14) | String _nextParamName()
    method merge (line 20) | Future<bool> merge(
    method bulkInsert (line 103) | Future<bool> bulkInsert(
    method bulkUpdate (line 167) | Future<bool> bulkUpdate(
    method bulkDelete (line 239) | Future<bool> bulkDelete({
    method bulkDeleteWhere (line 277) | Future<bool> bulkDeleteWhere(
    method batchProcess (line 319) | Future<void> batchProcess({
    method chunkedProcess (line 352) | Future<void> chunkedProcess({
    method parallelBulkInsert (line 388) | Future<bool> parallelBulkInsert(
    method transactionalBulkOperation (line 431) | Future<bool> transactionalBulkOperation(
    method clearBulkOperations (line 442) | void clearBulkOperations()

FILE: lib/src/database/query_builder/_cte/_cte_cache.dart
  class CteCache (line 1) | class CteCache {
    method markDirty (line 7) | void markDirty()
    method needsUpdate (line 13) | bool needsUpdate(int currentHashCode)
    method updateCache (line 17) | void updateCache(
    method clear (line 33) | void clear()

FILE: lib/src/database/query_builder/_cte/_cte_configuration.dart
  class CteConfiguration (line 4) | class CteConfiguration {
    method supportsFeature (line 60) | bool supportsFeature(CteFeature feature)

FILE: lib/src/database/query_builder/_cte/_cte_definition.dart
  class CteDefinition (line 11) | class CteDefinition {
    method validate (line 36) | void validate(CteConfiguration config)
    method toSql (line 100) | String toSql(
    method getBindings (line 131) | Map<String, dynamic> getBindings()
    method _listEquals (line 189) | bool _listEquals<T>(List<T>? a, List<T>? b)
    method toString (line 199) | String toString()

FILE: lib/src/database/query_builder/_cte/_cte_exception.dart
  class CteException (line 1) | class CteException implements Exception {

FILE: lib/src/database/query_builder/_cte/_cte_feature.dart
  type CteFeature (line 1) | enum CteFeature { materialized, notMaterialized, recursive }

FILE: lib/src/database/query_builder/_cte/_database_type.dart
  type DatabaseType (line 1) | enum DatabaseType { postgresql, mysql, sqlite }

FILE: lib/src/database/query_builder/_cte/_duplicate_cte_name_exception.dart
  class DuplicateCteNameException (line 3) | class DuplicateCteNameException extends CteException {

FILE: lib/src/database/query_builder/_cte/_invalid_cte_configuration_exception.dart
  class InvalidCteConfigurationException (line 3) | class InvalidCteConfigurationException extends CteException {

FILE: lib/src/database/query_builder/_cte/_sql_identifier_escaper.dart
  class SqlIdentifierEscaper (line 3) | class SqlIdentifierEscaper {
    method needsEscaping (line 63) | bool needsEscaping(String identifier)
    method _hasInvalidPattern (line 75) | bool _hasInvalidPattern(String identifier)
    method _looksLikeSqlKeyword (line 83) | bool _looksLikeSqlKeyword(String identifier)
    method validateIdentifier (line 127) | void validateIdentifier(

FILE: lib/src/database/query_builder/_cte/_standard_escaping_strategy.dart
  class IdentifierEscapingStrategy (line 3) | abstract class IdentifierEscapingStrategy {
    method escape (line 4) | String escape(String identifier)
    method needsEscaping (line 6) | bool needsEscaping(String identifier)
  class StandardEscapingStrategy (line 9) | class StandardEscapingStrategy implements IdentifierEscapingStrategy {
    method escape (line 17) | String escape(String identifier)
    method needsEscaping (line 34) | bool needsEscaping(String identifier)

FILE: lib/src/database/query_builder/_cte/_unsupported_cte_feature_exception.dart
  class UnsupportedCteFeatureException (line 5) | class UnsupportedCteFeatureException extends CteException {

FILE: lib/src/database/query_builder/_cte_builder_impl.dart
  function accessBindings (line 16) | Map<String, dynamic> accessBindings()
  class CteBuilderImpl (line 19) | abstract mixin class CteBuilderImpl implements QueryBuilder {
    method configureCte (line 29) | void configureCte(CteConfiguration config)
    method withCte (line 40) | QueryBuilder withCte(
    method withMultiple (line 50) | QueryBuilder withMultiple(
    method withRecursive (line 74) | QueryBuilder withRecursive(
    method withMaterialized (line 99) | QueryBuilder withMaterialized(
    method withNotMaterialized (line 117) | QueryBuilder withNotMaterialized(
    method _validateAndAddCte (line 139) | void _validateAndAddCte(
    method _addCteDefinition (line 166) | void _addCteDefinition(
    method validateAllCtes (line 193) | void validateAllCtes()
    method buildWithClause (line 207) | String buildWithClause()
    method getCteBindings (line 239) | Map<String, dynamic> getCteBindings()
    method _calculateCteBindings (line 251) | Map<String, dynamic> _calculateCteBindings()
    method _calculateCteHashCode (line 277) | int _calculateCteHashCode()
    method clearCtes (line 285) | void clearCtes()
    method hasCte (line 301) | bool hasCte(String name)
    method removeCte (line 304) | bool removeCte(String name)
    method getCteInfo (line 319) | List<Map<String, dynamic>> getCteInfo()
    method getCacheStats (line 337) | Map<String, dynamic> getCacheStats()

FILE: lib/src/database/query_builder/_delete_query_builder_impl.dart
  class DeleteQueryBuilderImpl (line 5) | abstract mixin class DeleteQueryBuilderImpl implements QueryBuilder {
    method delete (line 8) | Future<bool> delete()
    method truncate (line 19) | Future<bool> truncate({bool force = false})

FILE: lib/src/database/query_builder/_insert_query_builder_impl.dart
  class InsertQueryBuilderImpl (line 8) | abstract mixin class InsertQueryBuilderImpl implements QueryBuilder {
    method _nextParamName (line 17) | String _nextParamName()
    method insert (line 23) | Future<bool> insert(Map<String, dynamic> values)
    method insertGetId (line 54) | Future insertGetId(Map<String, dynamic> values, [String? sequence])
    method insertMany (line 84) | Future<bool> insertMany(List<Map<String, dynamic>> valuesList)
    method _haveSameKeys (line 131) | bool _haveSameKeys(Map<String, dynamic> map1, Map<String, dynamic> map2)
    method insertOrIgnore (line 142) | Future<bool> insertOrIgnore(Map<String, dynamic> values)
    method insertUsing (line 170) | Future<bool> insertUsing(List<String> columns, QueryBuilder subQuery)
    method upsert (line 184) | Future<bool> upsert(

FILE: lib/src/database/query_builder/_join_clause_builder_impl.dart
  class JoinClauseBuilderImpl (line 4) | abstract mixin class JoinClauseBuilderImpl implements QueryBuilder {
    method crossJoin (line 6) | QueryBuilder crossJoin(String table, [List<dynamic> bindings = const []])
    method join (line 13) | QueryBuilder join(
    method joinSub (line 30) | QueryBuilder joinSub(
    method leftJoin (line 48) | QueryBuilder leftJoin(
    method leftJoinSub (line 59) | QueryBuilder leftJoinSub(
    method rightJoin (line 70) | QueryBuilder rightJoin(

FILE: lib/src/database/query_builder/_query_builder_impl.dart
  class QueryBuilderImpl (line 19) | class QueryBuilderImpl extends QueryBuilder
    method raw (line 57) | RawExpression raw(value)
    method transaction (line 60) | Future<bool> transaction(
    method alerts (line 66) | Stream<DatabaseAlert> alerts()
    method getPerformanceStats (line 69) | Map<String, PerformanceStats> getPerformanceStats()
    method build (line 74) | String build({String? aggregateFunction, String? aggregateColumn})
    method connection (line 127) | QueryBuilder connection([String? connection])
    method groupBy (line 133) | QueryBuilder groupBy(List<String> groups)
    method having (line 139) | QueryBuilder having(
    method havingBetween (line 162) | QueryBuilder havingBetween(
    method inRandomOrder (line 190) | QueryBuilder inRandomOrder([dynamic seed])
    method latest (line 200) | QueryBuilder latest([String column = 'created_at'])
    method limit (line 205) | QueryBuilder limit(int value)
    method offset (line 211) | QueryBuilder offset(int value)
    method orderBy (line 217) | QueryBuilder orderBy(String column, [String direction = 'ASC'])
    method orderByAsc (line 223) | QueryBuilder orderByAsc(String column)
    method orderByDesc (line 228) | QueryBuilder orderByDesc(String column)
    method reorder (line 233) | QueryBuilder reorder([String? column, String? direction])
    method table (line 242) | QueryBuilder table(String table, [String? as])
    method skip (line 249) | QueryBuilder skip(int value)
    method take (line 252) | QueryBuilder take(int value)
    method toSql (line 255) | String toSql()
    method toRawSql (line 258) | String toRawSql()
    method _formatValueForRawSql (line 271) | String _formatValueForRawSql(dynamic value)
    method getBindings (line 292) | Map<String, dynamic> getBindings()
    method _nextParamName (line 302) | String _nextParamName()

FILE: lib/src/database/query_builder/_query_executor_builder_impl.dart
  class QueryExecutorBuilderImpl (line 9) | abstract mixin class QueryExecutorBuilderImpl implements QueryBuilder {
    method avg (line 12) | Future<num> avg(String column)
    method chunk (line 25) | Future<void> chunk(
    method chunkById (line 49) | Future<void> chunkById(
    method count (line 76) | Future<int> count([String columns = '*'])
    method doesntExist (line 89) | Future<bool> doesntExist()
    method each (line 106) | Future<void> each(void Function(Map<String, dynamic> q) callback)
    method exists (line 114) | Future<bool> exists()
    method find (line 130) | Future<Map<String, dynamic>?> find(
    method findOrFail (line 155) | Future<Map<String, dynamic>?> findOrFail(
    method first (line 168) | Future<Map<String, dynamic>?> first([List<String> columns = const []])
    method firstOrFail (line 190) | Future<Map<String, dynamic>?> firstOrFail([
    method firstWhere (line 201) | Future<Map<String, dynamic>?> firstWhere(
    method get (line 217) | Future<List<Map<String, dynamic>>> get([
    method lazy (line 237) | Stream<Iterable<Map<String, dynamic>>> lazy([
    method cursor (line 257) | Stream<Map<String, dynamic>> cursor([int chunk = 1000])
    method max (line 285) | Future max(String column)
    method min (line 298) | Future min(String column)
    method paginate (line 311) | Future<Map<String, dynamic>> paginate({
    method pluck (line 339) | Future pluck(String column, [String? key])
    method simplePaginate (line 353) | Future<Map<String, dynamic>> simplePaginate([
    method sum (line 375) | Future<num> sum(String column)
    method value (line 388) | Future value(String column)

FILE: lib/src/database/query_builder/_select_query_builder_impl.dart
  class SelectQueryBuilderImpl (line 4) | abstract mixin class SelectQueryBuilderImpl implements QueryBuilder {
    method addSelect (line 6) | QueryBuilder addSelect(List<String> columns)
    method select (line 12) | QueryBuilder select([List<String> columns = const ['*']])
    method selectRaw (line 18) | QueryBuilder selectRaw(String query, [List bindings = const []])
    method selectSub (line 30) | QueryBuilder selectSub(QueryBuilder subQuery, String as)

FILE: lib/src/database/query_builder/_union_clause_builder_impl.dart
  class UnionClauseBuilderImpl (line 4) | abstract mixin class UnionClauseBuilderImpl implements QueryBuilder {
    method union (line 6) | QueryBuilder union(QueryBuilder query)
    method unionAll (line 12) | QueryBuilder unionAll(QueryBuilder query)

FILE: lib/src/database/query_builder/_update_query_builder_impl.dart
  class UpdateQueryBuilderImpl (line 6) | abstract mixin class UpdateQueryBuilderImpl implements QueryBuilder {
    method update (line 9) | Future<bool> update(Map<String, dynamic> values)
    method updateMany (line 32) | Future<bool> updateMany(
    method updateOrInsert (line 78) | Future<bool> updateOrInsert(
    method increment (line 90) | Future<bool> increment(
    method decrement (line 122) | Future<bool> decrement(
    method incrementEach (line 154) | Future<bool> incrementEach(

FILE: lib/src/database/query_builder/_where_clauses_builder_impl.dart
  class WhereClausesBuilderImpl (line 9) | abstract mixin class WhereClausesBuilderImpl implements QueryBuilder {
    method _nextParamName (line 38) | String _nextParamName()
    method _validateOperator (line 46) | void _validateOperator(String operator)
    method buildWhereClause (line 56) | String buildWhereClause()
    method build (line 61) | String build({String? aggregateFunction, String? aggregateColumn})
    method getBindings (line 68) | Map<String, dynamic> getBindings()
    method orWhere (line 73) | QueryBuilder orWhere(
    method orWhereBetween (line 99) | QueryBuilder orWhereBetween(String column, List values, {bool not = fa...
    method orWhereColumn (line 105) | QueryBuilder orWhereColumn(
    method orWhereDate (line 116) | QueryBuilder orWhereDate(String column, String operator, dynamic value)
    method orWhereDay (line 125) | QueryBuilder orWhereDay(String column, String operator, dynamic value)
    method orWhereExists (line 134) | QueryBuilder orWhereExists(QueryCallback callback, {bool not = false})
    method orWhereFullText (line 144) | QueryBuilder orWhereFullText(
    method orWhereHour (line 157) | QueryBuilder orWhereHour(String column, String operator, dynamic value)
    method orWhereIn (line 163) | QueryBuilder orWhereIn(String column, List values, {bool not = false})
    method orWhereJsonContains (line 169) | QueryBuilder orWhereJsonContains(
    method orWhereJsonDoesntContain (line 182) | QueryBuilder orWhereJsonDoesntContain(String column, dynamic value)
    method orWhereJsonLength (line 191) | QueryBuilder orWhereJsonLength(
    method orWhereLike (line 204) | QueryBuilder orWhereLike(
    method orWhereMonth (line 222) | QueryBuilder orWhereMonth(String column, String operator, dynamic value)
    method orWhereNotBetween (line 231) | QueryBuilder orWhereNotBetween(String column, List values)
    method orWhereNotExists (line 237) | QueryBuilder orWhereNotExists(QueryCallback callback)
    method orWhereNotIn (line 242) | QueryBuilder orWhereNotIn(String column, dynamic values)
    method orWhereNotLike (line 248) | QueryBuilder orWhereNotLike(
    method orWhereNotNull (line 267) | QueryBuilder orWhereNotNull(String column)
    method orWhereNull (line 273) | QueryBuilder orWhereNull(String column)
    method orWhereRaw (line 279) | QueryBuilder orWhereRaw(String sql, [List<dynamic> rawBindings = const...
    method orWhereRowValues (line 286) | QueryBuilder orWhereRowValues(
    method orWhereTime (line 299) | QueryBuilder orWhereTime(String column, String operator, dynamic value)
    method orWhereYear (line 308) | QueryBuilder orWhereYear(String column, String operator, dynamic value)
    method where (line 317) | QueryBuilder where(
    method whereAfterToday (line 349) | QueryBuilder whereAfterToday(String column, {String boolean = 'and'})
    method whereAll (line 358) | QueryBuilder whereAll(
    method whereAny (line 382) | QueryBuilder whereAny(
    method whereBeforeToday (line 399) | QueryBuilder whereBeforeToday(String column, {String boolean = 'and'})
    method whereBetween (line 408) | QueryBuilder whereBetween(
    method whereBetweenColumns (line 422) | QueryBuilder whereBetweenColumns(
    method whereColumn (line 435) | QueryBuilder whereColumn(
    method whereDate (line 447) | QueryBuilder whereDate(
    method whereDay (line 461) | QueryBuilder whereDay(
    method whereEqualTo (line 475) | QueryBuilder whereEqualTo(condition, [value, String boolean = 'and'])
    method whereExists (line 479) | QueryBuilder whereExists(
    method whereFullText (line 493) | QueryBuilder whereFullText(
    method whereFuture (line 506) | QueryBuilder whereFuture(String column, {String boolean = 'and'})
    method whereGreaterThan (line 512) | QueryBuilder whereGreaterThan(condition, [value, String boolean = 'and'])
    method whereGreaterThanOrEqualTo (line 516) | QueryBuilder whereGreaterThanOrEqualTo(
    method whereHour (line 523) | QueryBuilder whereHour(
    method whereIn (line 537) | QueryBuilder whereIn(
    method whereJsonContains (line 551) | QueryBuilder whereJsonContains(
    method whereJsonDoesntContain (line 565) | QueryBuilder whereJsonDoesntContain(
    method whereJsonLength (line 578) | QueryBuilder whereJsonLength(
    method whereLessThan (line 592) | QueryBuilder whereLessThan(condition, [value, String boolean = 'and'])
    method whereLessThanOrEqualTo (line 596) | QueryBuilder whereLessThanOrEqualTo(
    method whereLike (line 603) | QueryBuilder whereLike(
    method whereMonth (line 622) | QueryBuilder whereMonth(
    method whereNone (line 636) | QueryBuilder whereNone(
    method whereNotBetween (line 653) | QueryBuilder whereNotBetween(
    method whereNotBetweenColumns (line 666) | QueryBuilder whereNotBetweenColumns(
    method whereNotEqualTo (line 679) | QueryBuilder whereNotEqualTo(condition, [value, String boolean = 'and'])
    method whereNotExists (line 683) | QueryBuilder whereNotExists(
    method whereNotIn (line 691) | QueryBuilder whereNotIn(
    method whereNotLike (line 704) | QueryBuilder whereNotLike(
    method whereNotNull (line 723) | QueryBuilder whereNotNull(String column, {String boolean = 'and'})
    method whereNowOrFuture (line 732) | QueryBuilder whereNowOrFuture(String column, {String boolean = 'and'})
    method whereNowOrPast (line 738) | QueryBuilder whereNowOrPast(String column, {String boolean = 'and'})
    method whereNull (line 744) | QueryBuilder whereNull(
    method wherePast (line 757) | QueryBuilder wherePast(String column, {String boolean = 'and'})
    method whereRaw (line 763) | QueryBuilder whereRaw(
    method whereRowValues (line 774) | QueryBuilder whereRowValues(
    method whereTime (line 788) | QueryBuilder whereTime(
    method whereToday (line 802) | QueryBuilder whereToday(String column, {String boolean = 'and'})
    method whereTodayOrAfter (line 811) | QueryBuilder whereTodayOrAfter(String column, {String boolean = 'and'})
    method whereTodayOrBefore (line 820) | QueryBuilder whereTodayOrBefore(String column, {String boolean = 'and'})
    method whereYear (line 829) | QueryBuilder whereYear(
    method whereHas (line 843) | QueryBuilder whereHas(
    method orWhereHas (line 854) | QueryBuilder orWhereHas(String relation, QueryCallback callback)
    method whereDoesntHave (line 861) | QueryBuilder whereDoesntHave(
    method orWhereDoesntHave (line 872) | QueryBuilder orWhereDoesntHave(String relation, QueryCallback callback)
    method withSoftDeletes (line 879) | QueryBuilder withSoftDeletes([String column = 'deleted_at'])
    method _createRelationshipCondition (line 882) | String _createRelationshipCondition(
    method _extractWhereFromSubQuery (line 911) | String _extractWhereFromSubQuery(String sql)
    method _appendCondition (line 919) | void _appendCondition(String condition, {bool isOr = false})
    method _createBetweenColumnsCondition (line 928) | String _createBetweenColumnsCondition(
    method _createBetweenCondition (line 942) | String _createBetweenCondition(String column, List values, bool not)
    method _createDateCondition (line 957) | String _createDateCondition(
    method _createFullTextCondition (line 975) | String _createFullTextCondition(
    method _createHourCondition (line 998) | String _createHourCondition(String column, String operator, dynamic va...
    method _createInCondition (line 1011) | String _createInCondition(String column, dynamic values, bool not)
    method _createJsonContainsCondition (line 1034) | String _createJsonContainsCondition(String column, dynamic value, bool...
    method _createJsonLengthCondition (line 1045) | String _createJsonLengthCondition(
    method _createLikeCondition (line 1056) | String _createLikeCondition(
    method _createNullCondition (line 1072) | String _createNullCondition(String column, bool not)
    method _createRowValuesCondition (line 1076) | String _createRowValuesCondition(
    method _processRawSQL (line 1100) | String _processRawSQL(String sql, List<dynamic> rawBindings)

FILE: lib/src/database/query_builder/_window_functions_builder_impl.dart
  class WindowFunctionsBuilderImpl (line 7) | abstract mixin class WindowFunctionsBuilderImpl implements QueryBuilder {
    method _buildOverClause (line 11) | String _buildOverClause({String? partitionBy, String? orderBy})
    method _addWindowFunction (line 25) | void _addWindowFunction(
    method rowNumber (line 40) | QueryBuilder rowNumber({String? partitionBy, String? orderBy, String? ...
    method rank (line 50) | QueryBuilder rank({String? partitionBy, String? orderBy, String? as})
    method denseRank (line 60) | QueryBuilder denseRank({String? partitionBy, String? orderBy, String? ...
    method lag (line 70) | QueryBuilder lag(
    method lead (line 103) | QueryBuilder lead(
    method firstValue (line 136) | QueryBuilder firstValue(
    method lastValue (line 157) | QueryBuilder lastValue(
    method ntile (line 178) | QueryBuilder ntile(
    method percentRank (line 199) | QueryBuilder percentRank({String? partitionBy, String? orderBy, String...
    method cumeDist (line 209) | QueryBuilder cumeDist({String? partitionBy, String? orderBy, String? as})
    method windowSum (line 219) | QueryBuilder windowSum(
    method windowAvg (line 240) | QueryBuilder windowAvg(
    method windowCount (line 261) | QueryBuilder windowCount(
    method windowMax (line 282) | QueryBuilder windowMax(
    method windowMin (line 303) | QueryBuilder windowMin(
    method clearWindowFunctions (line 324) | void clearWindowFunctions()

FILE: lib/src/database/seeder/seeder.dart
  class Seeder (line 3) | abstract class Seeder {
    method run (line 5) | Future<void> run()

FILE: lib/src/database/seeder/seeder_factory.dart
  class SeederFactory (line 6) | abstract class SeederFactory {
    method definition (line 10) | Map<String, dynamic> definition()
    method make (line 12) | Map<String, dynamic> make([Map<String, dynamic>? attributes])
    method makeMany (line 21) | List<Map<String, dynamic>> makeMany(
    method create (line 28) | Map<String, dynamic> create([Map<String, dynamic>? attributes])
    method createMany (line 32) | List<Map<String, dynamic>> createMany(
    method randomInt (line 39) | int randomInt(int min, int max)
    method randomDouble (line 43) | double randomDouble(double min, double max)
    method randomBool (line 47) | bool randomBool()
    method randomElement (line 51) | T randomElement<T>(List<T> list)
    method randomString (line 59) | String randomString(
    method randomEmail (line 80) | String randomEmail()
    method randomName (line 107) | String randomName()
    method randomPhone (line 343) | String randomPhone()
    method randomDate (line 347) | DateTime randomDate(DateTime start, DateTime end)
    method randomPastDate (line 353) | DateTime randomPastDate([int maxDaysAgo = 365])
    method randomFutureDate (line 359) | DateTime randomFutureDate([int maxDaysFromNow = 365])
    method randomUuid (line 365) | String randomUuid()
    method randomText (line 369) | String randomText([int sentences = 3])
    method randomPrice (line 449) | double randomPrice([
    method randomStatus (line 457) | String randomStatus([List<String>? statuses])

FILE: lib/src/database/seeder/seeder_runner.dart
  class SeederRunner (line 10) | class SeederRunner {
    method _config (line 20) | DBConfig _config(Map<String, dynamic> database)
    method setup (line 35) | Future<void> setup({

FILE: lib/src/enum/column_index.dart
  type ColumnIndex (line 1) | enum ColumnIndex { unique, indexKey, fulltext, spatial }

FILE: lib/src/enum/http_request_method.dart
  type HttpRequestMethod (line 1) | enum HttpRequestMethod {

FILE: lib/src/env_handler/env.dart
  class Env (line 3) | class Env {
    method load (line 14) | void load({File? file})
    method get (line 28) | T get<T>(String key, [dynamic defaultValue])
    method _loadEnvFile (line 52) | Map<String, String> _loadEnvFile({File? file})
    method _getValue (line 72) | String _getValue(List<String> elements)

FILE: lib/src/exception/base_http_exception.dart
  class BaseHttpResponseException (line 3) | class BaseHttpResponseException {
    method response (line 14) | Response response(bool isHtml)

FILE: lib/src/exception/database_exception.dart
  class DatabaseException (line 1) | class DatabaseException implements Exception {

FILE: lib/src/exception/exception_handler.dart
  class ExceptionHandler (line 4) | abstract class ExceptionHandler<T> {
    method handle (line 7) | Response handle(T exception, Request? request)
  class GeneralExceptionHandler (line 10) | abstract class GeneralExceptionHandler {
    method handle (line 13) | Response? handle(dynamic exception, Request? request)

FILE: lib/src/exception/forbidden_exception.dart
  class ForbiddenException (line 6) | class ForbiddenException extends BaseHttpResponseException {

FILE: lib/src/exception/http_exception.dart
  class HttpResponseException (line 4) | class HttpResponseException extends BaseHttpResponseException {

FILE: lib/src/exception/internal_server_error.dart
  class InternalServerError (line 4) | class InternalServerError extends BaseHttpResponseException {

FILE: lib/src/exception/invalid_argument_exception.dart
  class InvalidArgumentException (line 1) | class InvalidArgumentException {

FILE: lib/src/exception/not_found_exception.dart
  class NotFoundException (line 5) | class NotFoundException extends BaseHttpResponseException {

FILE: lib/src/exception/page_expired_exception.dart
  class PageExpiredException (line 5) | class PageExpiredException extends BaseHttpResponseException {

FILE: lib/src/exception/query_exception.dart
  class QueryException (line 1) | class QueryException implements Exception {

FILE: lib/src/exception/redirect_exception.dart
  class RedirectException (line 6) | class RedirectException extends BaseHttpResponseException {

FILE: lib/src/exception/throttle_exception.dart
  class ThrottleException (line 4) | class ThrottleException extends BaseHttpResponseException {
    method response (line 14) | Response response(bool isHtml)

FILE: lib/src/exception/unauthenticated.dart
  class Unauthenticated (line 5) | class Unauthenticated extends BaseHttpResponseException {

FILE: lib/src/exception/unauthorized_exception.dart
  class UnauthorizedException (line 3) | class UnauthorizedException extends BaseHttpResponseException {

FILE: lib/src/exception/validation_exception.dart
  class ValidationException (line 5) | class ValidationException extends BaseHttpResponseException {

FILE: lib/src/extensions/date_time_extension.dart
  function toAwsFormat (line 17) | String toAwsFormat()
  function zeroPad (line 18) | String zeroPad(int number)
  function format (line 38) | String format()

FILE: lib/src/extensions/localization_extension.dart
  function trans (line 4) | String trans({Map<String, dynamic>? args, String? locale})

FILE: lib/src/extensions/map_extension.dart
  function removeParam (line 27) | Map<dynamic, dynamic> removeParam(String keys)
  function getParam (line 66) | dynamic getParam(String keys)

FILE: lib/src/extensions/number_extension.dart
  function toFixed (line 32) | num toFixed(int decimal)

FILE: lib/src/extensions/string_extension.dart
  function toInt (line 30) | int? toInt()

FILE: lib/src/extensions/string_list_extension.dart
  function joinWithAnd (line 27) | String joinWithAnd([String separator = ', ', String lastJoinText = 'and'])

FILE: lib/src/http/controller/controller.dart
  class Controller (line 1) | abstract class Controller {

FILE: lib/src/http/controller/controller_handler.dart
  class ControllerHandler (line 14) | class ControllerHandler {
    method _getParamValue (line 15) | dynamic _getParamValue(String param)
    method create (line 31) | void create({required RouteData route, required Request request})
    method _handleException (line 104) | Response? _handleException(dynamic exception, Request request)
  function _response (line 121) | void _response(Request req, message, [statusCode = 500])

FILE: lib/src/http/middleware/middleware.dart
  class Middleware (line 5) | abstract class Middleware {
    method handle (line 6) | Future handle(Request req)
  class WebSocketMiddleware (line 9) | abstract class WebSocketMiddleware {
    method handle (line 10) | Future handle(HttpRequest req)

FILE: lib/src/http/middleware/middleware_handler.dart
  function middlewareHandler (line 4) | Future<void> middlewareHandler(

FILE: lib/src/http/middleware/web_socket_middleware_handler.dart
  function webSocketMiddlewareHandler (line 4) | Future<void> webSocketMiddlewareHandler(

FILE: lib/src/http/request/request.dart
  class Request (line 19) | class Request {
    method from (line 23) | Request from({required HttpRequest request, RouteData? route})
    method setCustomRule (line 59) | Request setCustomRule(List<CustomValidationRule> customRule)
    method cookie (line 74) | T? cookie<T>(String key)
    method _extractCookies (line 88) | void _extractCookies()
    method extractBody (line 102) | Future<Request> extractBody()
    method all (line 116) | Map<String, dynamic> all()
    method params (line 120) | Map<String, dynamic> params()
    method isMethod (line 126) | bool isMethod(String method)
    method only (line 130) | Map<String, dynamic> only(List<String> keys)
    method has (line 138) | bool has(dynamic keys)
    method hasAny (line 160) | bool hasAny(List<String> keys)
    method whenHas (line 170) | Future whenHas(String key)
    method except (line 178) | Map<String, dynamic> except(dynamic key)
    method json (line 194) | Map json(String key)
    method input (line 206) | dynamic input([String? key, dynamic defaultVal])
    method file (line 222) | RequestFile? file(String key)
    method hasFile (line 234) | bool hasFile(String key)
    method files (line 238) | List<RequestFile>? files(String key)
    method string (line 251) | String string(String key)
    method asList (line 255) | List asList(String key)
    method integer (line 259) | int? integer(String key)
    method asDouble (line 263) | double? asDouble(String key)
    method boolean (line 267) | bool boolean(String key)
    method date (line 275) | DateTime? date(String key)
    method query (line 283) | dynamic query([String? key, String? defaultVal])
    method merge (line 299) | void merge(Map<String, dynamic> values)
    method mergeIfMissing (line 304) | void mergeIfMissing(Map<String, dynamic> values)
    method header (line 312) | String? header(String key, [String? defaultHeader])
    method isFormData (line 324) | bool isFormData()
    method isJson (line 328) | bool isJson()
    method isUrlencoded (line 332) | bool isUrlencoded()
    method userAgent (line 336) | String? userAgent()
    method origin (line 340) | String? origin()
    method referer (line 344) | String? referer()
    method validate (line 348) | Future<void> validate(
    method _formRequestValidate (line 378) | Future<void> _formRequestValidate(FormValidation formRequest)
    method _validate (line 418) | Future<void> _validate(
    method _validateChain (line 441) | void _validateChain(List<Validation> validations)
    method toJson (line 464) | Map<String, dynamic> toJson()

FILE: lib/src/http/request/request_body.dart
  class RequestBody (line 9) | class RequestBody {
    method extractBody (line 17) | Future<Map<String, dynamic>> extractBody({
    method isUrlencoded (line 64) | bool isUrlencoded(ContentType? contentType)
    method isFormData (line 68) | bool isFormData(ContentType? contentType)
    method isJson (line 72) | bool isJson(ContentType? contentType)

FILE: lib/src/http/request/request_file.dart
  class RequestFile (line 10) | class RequestFile {
    method store (line 58) | Future<String> store({String path = '', required String name})
    method move (line 69) | Future<String> move({required String toPath, required String name})

FILE: lib/src/http/request/request_form_data.dart
  class RequestFormData (line 10) | class RequestFormData {
    method extractData (line 19) | Future<RequestFormData> extractData()

FILE: lib/src/http/request/request_handler.dart
  class RequestHandler (line 33) | class RequestHandler {
    method handle (line 44) | Future handle(HttpRequest req)
    method _handleException (line 160) | Response? _handleException(dynamic exception, Request? request)
    method _response (line 176) | void _response(HttpRequest req, dynamic message, {int statusCode = 500})

FILE: lib/src/http/response/response.dart
  type ResponseType (line 9) | enum ResponseType { json, none, redirect, html, sse, streamFile, download }
  class Response (line 11) | class Response {
    method sseHandler (line 29) | Future<void> sseHandler(HttpResponse res)
    method writeSSE (line 35) | void writeSSE(String data)
    method makeResponse (line 47) | void makeResponse(HttpResponse res)
    method redirect (line 112) | Response redirect(String location)
    method json (line 118) | Response json(dynamic jsonData, [int statusCode = HttpStatus.ok])
    method jsonWithHeader (line 125) | Response jsonWithHeader(
    method html (line 136) | Response html(
    method file (line 145) | Response file(
    method sse (line 155) | Response sse(
    method download (line 166) | Response download(
    method back (line 176) | Response back([String? key, String? message])
    method backWithInput (line 195) | Response backWithInput([String? input, String? message])

FILE: lib/src/http/response/stream_file.dart
  class StreamFile (line 6) | class StreamFile {
    method call (line 24) | StreamFile? call()

FILE: lib/src/http/session/session_file_store.dart
  class SessionFileStore (line 9) | class SessionFileStore {
    method storeSession (line 31) | Future<void> storeSession(
    method retrieveSession (line 77) | Future<Map<String, dynamic>?> retrieveSession(String sessionId)
    method hasSession (line 115) | Future<bool> hasSession(String sessionId)
    method deleteSession (line 136) | Future<void> deleteSession(String sessionId)
    method _makeHash (line 157) | Digest _makeHash(String key)

FILE: lib/src/http/session/session_manager.dart
  class SessionManager (line 8) | class SessionManager {
    method _generateSessionId (line 33) | String _generateSessionId()
    method createXsrfToken (line 53) | Future<void> createXsrfToken(
    method _generateNewCsrfToken (line 85) | Future<void> _generateNewCsrfToken(HttpResponse response)
    method _computeCsrfCookieValue (line 109) | String _computeCsrfCookieValue(String token, String iv)
    method sessionStart (line 135) | Future<void> sessionStart(HttpRequest request, HttpResponse response)
    method getSessionId (line 158) | String? getSessionId()
    method _featchAllSessions (line 166) | Future<void> _featchAllSessions(String sessionId)
    method getSession (line 170) | Future<T> getSession<T>(String key)
    method setSession (line 205) | Future<void> setSession(String key, dynamic value)
    method deleteSession (line 230) | Future<void> deleteSession(String key)
    method destroyAllSessions (line 244) | Future<void> destroyAllSessions()

FILE: lib/src/http/validation/custom_validation_rule.dart
  class CustomValidationRule (line 1) | class CustomValidationRule {

FILE: lib/src/http/validation/field_validation.dart
  class FieldValidation (line 1) | class FieldValidation {
    method alpha (line 14) | FieldValidation alpha({String? messages})
    method alphaDash (line 22) | FieldValidation alphaDash({String? messages})
    method alphaNumeric (line 30) | FieldValidation alphaNumeric({String? messages})
    method between (line 38) | FieldValidation between(int first, int second, {String? messages})
    method boolean (line 46) | FieldValidation boolean({String? messages})
    method confirmed (line 54) | FieldValidation confirmed({String? messages})
    method date (line 62) | FieldValidation date({String? messages})
    method dateTime (line 70) | FieldValidation dateTime({String? messages})
    method email (line 78) | FieldValidation email({String? messages})
    method endWith (line 86) | FieldValidation endWith(String value, {String? messages})
    method file (line 94) | FieldValidation file(List<String> types, {String? messages})
    method greaterThan (line 103) | FieldValidation greaterThan(int value, {String? messages})
    method image (line 111) | FieldValidation image({String? messages})
    method integer (line 119) | FieldValidation integer({String? messages})
    method ip (line 127) | FieldValidation ip({String? messages})
    method isDouble (line 135) | FieldValidation isDouble({String? messages})
    method isIn (line 143) | FieldValidation isIn(List<String> value, {String? messages})
    method isList (line 151) | FieldValidation isList({String? messages})
    method json (line 159) | FieldValidation json({String? messages})
    method lengthBetween (line 167) | FieldValidation lengthBetween(int first, int second, {String? messages})
    method lessThan (line 175) | FieldValidation lessThan(int value, {String? messages})
    method max (line 183) | FieldValidation max(int value, {String? messages})
    method maxLength (line 191) | FieldValidation maxLength(int value, {String? messages})
    method min (line 199) | FieldValidation min(int value, {String? messages})
    method minLength (line 207) | FieldValidation minLength(int value, {String? messages})
    method notIn (line 215) | FieldValidation notIn(List<String> value, {String? messages})
    method numeric (line 223) | FieldValidation numeric({String? messages})
    method regExp (line 231) | FieldValidation regExp(String rule, {String? messages})
    method required (line 239) | FieldValidation required({String? messages})
    method requiredIf (line 247) | FieldValidation requiredIf(List<String> value, {String? messages})
    method requiredIfNot (line 255) | FieldValidation requiredIfNot(List<String> value, {String? messages})
    method startWith (line 263) | FieldValidation startWith(String value, {String? messages})
    method string (line 271) | FieldValidation string({String? messages})
    method unique (line 279) | FieldValidation unique(String table, {String? messages})
    method url (line 287) | FieldValidation url({String? messages})
    method uuid (line 295) | FieldValidation uuid({String? messages})
    method toString (line 304) | String toString()

FILE: lib/src/http/validation/nested_validation.dart
  class NestedValidation (line 5) | class NestedValidation {
    method _process (line 20) | void _process()
    method _processNestedField (line 35) | void _processNestedField(

FILE: lib/src/http/validation/rules.dart
  class Rules (line 4) | class Rules {
    method isRequired (line 6) | bool isRequired(
    method isEmail (line 21) | bool isEmail(Map<String, dynamic> data, dynamic value, String args)
    method isString (line 29) | bool isString(Map<String, dynamic> data, dynamic value, String args)
    method isNumeric (line 34) | bool isNumeric(Map<String, dynamic> data, dynamic value, String args)
    method isIp (line 44) | bool isIp(Map<String, dynamic> data, dynamic value, String args)
    method isBoolean (line 52) | bool isBoolean(Map<String, dynamic> data, dynamic value, String args)
    method isInteger (line 62) | bool isInteger(Map<String, dynamic> data, dynamic value, String args)
    method isDouble (line 72) | bool isDouble(Map<String, dynamic> data, dynamic value, String args)
    method isArray (line 82) | bool isArray(Map<String, dynamic> data, dynamic value, String args)
    method isJson (line 87) | bool isJson(Map<String, dynamic> data, dynamic value, String args)
    method isAlpha (line 92) | bool isAlpha(Map<String, dynamic> data, dynamic value, String args)
    method isAlphaDash (line 98) | bool isAlphaDash(
    method isAlphaNumeric (line 108) | bool isAlphaNumeric(
    method isDate (line 118) | bool isDate(Map<String, dynamic> data, dynamic value, String args)
    method isUrl (line 128) | bool isUrl(Map<String, dynamic> data, dynamic value, String args)
    method isUUID (line 138) | bool isUUID(Map<String, dynamic> data, dynamic value, String args)
    method maxLength (line 146) | bool maxLength(Map<String, dynamic> data, dynamic value, String max)
    method minLength (line 151) | bool minLength(Map<String, dynamic> data, dynamic value, String min)
    method lengthBetween (line 156) | bool lengthBetween(
    method unique (line 172) | Future<bool> unique(
    method between (line 188) | bool between(Map<String, dynamic> data, dynamic value, String values)
    method greaterThan (line 200) | bool greaterThan(
    method lessThan (line 210) | bool lessThan(
    method min (line 220) | bool min(Map<String, dynamic> data, dynamic value, String compare)
    method max (line 226) | bool max(Map<String, dynamic> data, dynamic value, String compare)
    method inArray (line 232) | bool inArray(Map<String, dynamic> data, dynamic value, String arr)
    method notInArray (line 238) | bool notInArray(Map<String, dynamic> data, dynamic value, String arr)
    method startWith (line 244) | bool startWith(
    method endWith (line 253) | bool endWith(Map<String, dynamic> data, dynamic value, String end)
    method confirmed (line 258) | bool confirmed(Map<String, dynamic> data, dynamic value, String key)
    method requiredIf (line 265) | bool requiredIf(
    method requiredIfNot (line 283) | bool requiredIfNot(
    method isImage (line 301) | bool isImage(Map<String, dynamic> data, dynamic value, String args)
    method isFile (line 329) | bool isFile(Map<String, dynamic> data, dynamic value, String args)
    method hasValidExtension (line 340) | bool hasValidExtension(RequestFile file)
    method regExp (line 351) | bool regExp(Map<String, dynamic> data, dynamic value, String args)

FILE: lib/src/http/validation/validation_chain/rules/between.dart
  class Between (line 3) | class Between extends ValidationRule {
    method validate (line 13) | bool validate(value, data)
    method getDefaultErrorMessage (line 19) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/confirmed.dart
  class Confirmed (line 3) | class Confirmed extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/end_width.dart
  class EndWith (line 3) | class EndWith extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/greater_than.dart
  class GreaterThan (line 5) | class GreaterThan extends ValidationRule {
    method validate (line 9) | bool validate(value, data)
    method getDefaultErrorMessage (line 15) | String getDefaultErrorMessage(String field)
    method copyWith (line 19) | GreaterThan copyWith({num? compare})
    method toMap (line 23) | Map<String, dynamic> toMap()
    method toJson (line 35) | String toJson()
    method toString (line 41) | String toString()

FILE: lib/src/http/validation/validation_chain/rules/in_array.dart
  class InArray (line 3) | class InArray<T> extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_alpha.dart
  class IsAlpha (line 4) | class IsAlpha extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_alpha_dash.dart
  class IsAlphaDash (line 4) | class IsAlphaDash extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_alpha_numeric.dart
  class IsAlphaNumeric (line 4) | class IsAlphaNumeric extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_array.dart
  class IsArray (line 3) | class IsArray extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 12) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_boolean.dart
  class IsBoolean (line 3) | class IsBoolean extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 12) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_date.dart
  class IsDate (line 3) | class IsDate extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 17) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_double.dart
  class IsDouble (line 3) | class IsDouble extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 17) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_email.dart
  class IsEmail (line 4) | class IsEmail extends ValidationRule {
    method validate (line 8) | bool validate(dynamic value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_file.dart
  class IsFile (line 4) | class IsFile extends ValidationRule {
    method validate (line 9) | bool validate(value, data)
    method hasValidExtension (line 20) | bool hasValidExtension(RequestFile file)
    method getDefaultErrorMessage (line 32) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_image.dart
  class IsImage (line 4) | class IsImage extends ValidationRule {
    method validate (line 9) | bool validate(value, data)
    method getDefaultErrorMessage (line 23) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_integer.dart
  class IsInteger (line 3) | class IsInteger extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 17) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_ip.dart
  class IsIp (line 4) | class IsIp extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_json.dart
  class IsJson (line 3) | class IsJson extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 12) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_numeric.dart
  class IsNumeric (line 3) | class IsNumeric extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 17) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_required.dart
  class IsRequired (line 3) | class IsRequired extends ValidationRule {
    method validate (line 7) | bool validate(dynamic value, data)
    method getDefaultErrorMessage (line 12) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_string.dart
  class IsString (line 3) | class IsString extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 12) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_url.dart
  class IsURL (line 3) | class IsURL extends ValidationRule {
    method validate (line 7) | bool validate(value, data)
    method getDefaultErrorMessage (line 17) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/is_uuid.dart
  class IsUUID (line 4) | class IsUUID extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/lenght_between.dart
  class LengthBetween (line 3) | class LengthBetween extends ValidationRule {
    method validate (line 13) | bool validate(value, data)
    method getDefaultErrorMessage (line 19) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/less_than.dart
  class LessThan (line 3) | class LessThan extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 14) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/max.dart
  class Max (line 3) | class Max extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 14) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/max_lenght.dart
  class MaxLength (line 3) | class MaxLength extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 14) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/min.dart
  class Min (line 3) | class Min extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 14) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/min_lenght.dart
  class MinLength (line 3) | class MinLength extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 14) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/not_in_array.dart
  class NotInArray (line 3) | class NotInArray<T> extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/required_if.dart
  class RequiredIf (line 4) | class RequiredIf extends ValidationRule {
    method validate (line 9) | bool validate(value, data)
    method getDefaultErrorMessage (line 23) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/required_if_not.dart
  class RequiredIfNot (line 4) | class RequiredIfNot extends ValidationRule {
    method validate (line 9) | bool validate(value, data)
    method getDefaultErrorMessage (line 23) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/rules/start_with.dart
  class StartWith (line 3) | class StartWith extends ValidationRule {
    method validate (line 8) | bool validate(value, data)
    method getDefaultErrorMessage (line 13) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_chain/validation.dart
  class Validation (line 3) | class Validation {

FILE: lib/src/http/validation/validation_chain/validation_rule.dart
  class ValidationRule (line 1) | abstract class ValidationRule {
    method validate (line 4) | bool validate(dynamic value, Map<String, dynamic> data)
    method getDefaultErrorMessage (line 6) | String getDefaultErrorMessage(String field)

FILE: lib/src/http/validation/validation_item.dart
  class ValidationItem (line 1) | class ValidationItem {

FILE: lib/src/http/validation/validator.dart
  class Validator (line 10) | class Validator {
    method customRule (line 37) | void customRule(List<CustomValidationRule> rules)
    method setNewMessages (line 51) | void setNewMessages(Map<String, String> messages)
    method _isNestedValidation (line 66) | bool _isNestedValidation(String field)
    method validate (line 74) | Future<void> validate(Map<String, String> rules)
    method _validateItem (line 101) | Future<void> _validateItem(ValidationItem item)
    method _applyMatchingRule (line 121) | Future<String?> _applyMatchingRule(

FILE: lib/src/ioc_container.dart
  type FactoryFunc (line 1) | typedef FactoryFunc<T> = T Function();
  class IoCContainer (line 3) | class IoCContainer {
    method register (line 11) | void register<T>(FactoryFunc<T> factory, {bool singleton = false})
    method resolve (line 19) | T resolve<T>()

FILE: lib/src/localization_handler/localization.dart
  class Localization (line 5) | class Localization {
    method setLocale (line 16) | void setLocale(String locale)
    method isLocale (line 18) | bool isLocale(String locale)
    method init (line 23) | void init()
    method trans (line 55) | String trans(String key, [Map<String, dynamic>? args, String? locale])

FILE: lib/src/logger/logger.dart
  class Logger (line 5) | class Logger {
    method log (line 16) | void log(

FILE: lib/src/mail/content.dart
  class Content (line 1) | class Content {

FILE: lib/src/mail/envelope.dart
  class Envelope (line 3) | class Envelope {

FILE: lib/src/mail/mail.dart
  class Mail (line 7) | abstract class Mail {
    method content (line 9) | Content? content()
    method view (line 10) | MailView? view()
    method envelope (line 11) | Envelope envelope()
    method attachments (line 12) | List<Attachment>? attachments()

FILE: lib/src/mail/mail_view.dart
  class MailView (line 1) | class MailView {

FILE: lib/src/mail/mailable.dart
  class Mailable (line 16) | @immutable
    method _setupSmtpServer (line 20) | SmtpServer _setupSmtpServer()
    method send (line 74) | Future<mailer.SendReport> send()
    method attachments (line 133) | List<mailer.Attachment>? attachments()
    method view (line 139) | MailView? view()
    method content (line 145) | Content? content()
    method envelope (line 151) | Envelope envelope()

FILE: lib/src/redis/command/client.dart
  class MultiCodec (line 9) | class MultiCodec {
    method encode (line 15) | String encode<T>(T value)
    method decode (line 24) | T decode<T>(String value)
    method registerCodec (line 33) | void registerCodec(RedisCodec codec)
  class Commands (line 39) | abstract class Commands<K, V>
  class CommandsClient (line 47) | class CommandsClient<K, V> implements Commands<K, V> {
    method del (line 58) | Future<bool> del(K key)
    method exists (line 70) | Future<bool> exists(K key)
    method expire (line 80) | Future<bool> expire(K key, Duration duration)
    method getdel (line 92) | Future<V?> getdel(K key)
    method get (line 106) | Future<V?> get(K key)
    method ttl (line 120) | Future<int?> ttl(K key)
    method keys (line 129) | Future<List<String>> keys(String pattern)
    method set (line 142) | Future<bool> set(K key, V value)
    method setEx (line 157) | Future<bool> setEx(K key, int ttl, V value)
    method append (line 174) | Future<int?> append(K key, V value)
    method bitCount (line 184) | Future<int?> bitCount(K key, {int? start, int? end})
    method bitOp (line 197) | Future<int?> bitOp(String operation, K destKey, List<K> keys)
    method bitPos (line 208) | Future<int?> bitPos(K key, int bit, {int? start, int? end})
    method decr (line 221) | Future<int?> decr(K key)
    method decrBy (line 230) | Future<int?> decrBy(K key, int decrement)
    method getBit (line 239) | Future<int?> getBit(K key, int offset)
    method getRange (line 248) | Future<V?> getRange(K key, int start, int end)
    method getSet (line 263) | Future<V?> getSet(K key, V value)
    method incr (line 277) | Future<int?> incr(K key)
    method incrBy (line 286) | Future<int?> incrBy(K key, int increment)
    method incrByFloat (line 295) | Future<double?> incrByFloat(K key, double increment)
    method mGet (line 306) | Future<List<V>> mGet(List<K> keys)
    method mSet (line 319) | Future<bool> mSet(Map<K, V> keyValues)
    method mSetNX (line 331) | Future<bool> mSetNX(Map<K, V> keyValues)
    method setBit (line 343) | Future<int?> setBit(K key, int offset, int value)
    method pSetEx (line 354) | Future<bool> pSetEx(K key, int ttl, V value)
    method setNx (line 370) | Future<bool> setNx(K key, V value)
    method setRange (line 380) | Future<int?> setRange(K key, int offset, V value)
    method strlen (line 392) | Future<int?> strlen(K key)
    method setOption (line 401) | Future<bool> setOption(String option)
    method getOption (line 409) | Future<String?> getOption(String option)
    method lrange (line 423) | Future<List<V>> lrange(K key, int startIndex, int endIndex)
    method rpush (line 440) | Future<bool> rpush(K key, List<V> values)
    method lpush (line 453) | Future<bool> lpush(K key, List<V> values)
    method lset (line 466) | Future<bool> lset(K key, int index, V value)
    method exec (line 481) | Future<void> exec()
    method multi (line 487) | Future<void> multi()
    method discard (line 493) | Future<void> discard()
    method psubscribe (line 500) | Stream<V> psubscribe(String pattern)
    method publish (line 511) | Future<int?> publish(String channel, V message)
    method auth (line 519) | Future<String?> auth({String? username, required String password})
  class RedisClient (line 531) | class RedisClient {
    method connect (line 537) | Future<RedisClient> connect(
    method _auth (line 558) | Future<String?> _auth(
    method getCommands (line 583) | Commands<K, V> getCommands<K, V>()
    method close (line 586) | Future<void> close()

FILE: lib/src/redis/command/codec.dart
  class RedisConverter (line 5) | abstract class RedisConverter<S, D> extends Converter<S, D> {
    method isSupporting (line 6) | bool isSupporting<U>(dynamic value)
  type RedisEncoder (line 10) | typedef RedisEncoder<T> = RedisConverter<T, String>;
  type RedisDecoder (line 13) | typedef RedisDecoder<T> = RedisConverter<String, T>;
  class RedisCodec (line 16) | class RedisCodec<T> {
  class StringEncoder (line 24) | class StringEncoder extends RedisEncoder<String> {
    method convert (line 26) | String convert(String input)
  class StringDecoder (line 30) | class StringDecoder extends RedisDecoder<String> {
    method convert (line 32) | String convert(String input)
  class IntEncoder (line 36) | class IntEncoder extends RedisEncoder<int> {
    method convert (line 38) | String convert(int input)
  class IntDecoder (line 42) | class IntDecoder extends RedisDecoder<int> {
    method convert (line 44) | int convert(String input)

FILE: lib/src/redis/command/commands.dart
  class KeysCommands (line 2) | abstract class KeysCommands<K, V> {
    method del (line 4) | Future<bool> del(K key)
    method exists (line 7) | Future<bool> exists(K key)
    method expire (line 10) | Future<bool> expire(K key, Duration duration)
    method keys (line 13) | Future<List<String>> keys(String pattern)
    method ttl (line 16) | Future<int?> ttl(K key)
    method get (line 19) | Future<V?> get(K key)
    method set (line 22) | Future<bool> set(K key, V value)
    method setEx (line 25) | Future<bool> setEx(K key, int ttl, V value)
    method getdel (line 28) | Future<V?> getdel(K key)
    method append (line 30) | Future<int?> append(K key, V value)
    method bitCount (line 32) | Future<int?> bitCount(K key, {int? start, int? end})
    method bitOp (line 34) | Future<int?> bitOp(String operation, K destKey, List<K> keys)
    method bitPos (line 36) | Future<int?> bitPos(K key, int bit, {int? start, int? end})
    method decr (line 38) | Future<int?> decr(K key)
    method decrBy (line 40) | Future<int?> decrBy(K key, int decrement)
    method getBit (line 42) | Future<int?> getBit(K key, int offset)
    method getSet (line 44) | Future<V?> getSet(K key, V value)
    method incr (line 46) | Future<int?> incr(K key)
    method incrBy (line 48) | Future<int?> incrBy(K key, int increment)
    method incrByFloat (line 50) | Future<double?> incrByFloat(K key, double increment)
    method mGet (line 52) | Future<List<V>> mGet(List<K> keys)
    method mSet (line 54) | Future<bool> mSet(Map<K, V> keyValues)
    method mSetNX (line 56) | Future<bool> mSetNX(Map<K, V> keyValues)
    method setBit (line 58) | Future<int?> setBit(K key, int offset, int value)
    method pSetEx (line 60) | Future<bool> pSetEx(K key, int ttl, V value)
    method setNx (line 62) | Future<bool> setNx(K key, V value)
    method setRange (line 64) | Future<int?> setRange(K key, int offset, V value)
    method getRange (line 66) | Future<V?> getRange(K key, int start, int end)
    method strlen (line 68) | Future<int?> strlen(K key)
    method setOption (line 70) | Future<bool> setOption(String option)
    method getOption (line 72) | Future<String?> getOption(String option)
  class ListCommands (line 76) | abstract class ListCommands<K, V> {
    method lrange (line 78) | Future<List<V>> lrange(K key, int startIndex, int endIndex)
    method rpush (line 81) | Future<bool> rpush(K key, List<V> values)
    method lpush (line 84) | Future<bool> lpush(K key, List<V> values)
    method lset (line 87) | Future<bool> lset(K key, int index, V value)
  class TransactionCommands (line 91) | abstract class TransactionCommands<K, V> {
    method multi (line 93) | Future<void> multi()
    method exec (line 96) | Future<void> exec()
    method discard (line 99) | Future<void> discard()
  class PubSubCommands (line 103) | abstract class PubSubCommands<V> {
    method psubscribe (line 105) | Stream<V> psubscribe(String pattern)
    method publish (line 108) | Future<int?> publish(String channel, V message)

FILE: lib/src/redis/exception.dart
  class RedisException (line 3) | class RedisException implements Exception {
    method toString (line 9) | String toString()
  class RedisConvertException (line 13) | class RedisConvertException extends RedisException {

FILE: lib/src/redis/lowlevel/protocol_client.dart
  class RedisProtocolClient (line 10) | class RedisProtocolClient {
    method createConnection (line 20) | Future<RedisProtocolClient> createConnection({
    method _onData (line 30) | void _onData(List<int> data)
    method sendCommand (line 46) | void sendCommand(Resp resp)
    method receive (line 51) | Future<Resp> receive()
    method close (line 63) | Future<void> close()

FILE: lib/src/redis/lowlevel/resp.dart
  class RedisError (line 6) | class RedisError {
    method toString (line 13) | String toString()
  type RespType (line 17) | enum RespType { STRING, ARRAY, INTEGER, DOUBLE, ERROR, NULL, UNKNOWN }
  class Resp (line 20) | class Resp {
    method _serializeValue (line 28) | String _serializeValue(dynamic value, {bool isBulkString = true})
    method serialize (line 50) | String serialize()
    method deserialize (line 54) | Resp? deserialize(String s)
    method throwIfError (line 113) | void throwIfError()
    method toString (line 123) | String toString()
  class _DeserializeResult (line 127) | class _DeserializeResult {
  function safeAt (line 137) | String? safeAt(int index)
  function toInt (line 141) | int? toInt()
  function _deserializeEntry (line 144) | _DeserializeResult? _deserializeEntry(List<String> s, int startIndex)
  function _deserializeSimpleString (line 166) | _DeserializeResult? _deserializeSimpleString(List<String> s, int startIn...
  function _deserializeBulkString (line 174) | _DeserializeResult? _deserializeBulkString(List<String> s, int startIndex)
  function _deserializeError (line 199) | _DeserializeResult? _deserializeError(List<String> s, int startIndex)
  function _deserializeInteger (line 214) | _DeserializeResult? _deserializeInteger(List<String> s, int startIndex)
  function _deserializeArray (line 222) | _DeserializeResult? _deserializeArray(List<String> s, int startIndex)

FILE: lib/src/redis/redis.dart
  class Redis (line 7) | class Redis {
    method _initRedis (line 26) | Future<void> _initRedis()

FILE: lib/src/route/middleware/csrf_middleware.dart
  class CsrfMiddleware (line 14) | class CsrfMiddleware extends Middleware {
    method handle (line 19) | Future<void> handle(Request req)
    method _fixBase64Padding (line 92) | String _fixBase64Padding(String value)
    method _isUrlExcluded (line 99) | bool _isUrlExcluded(String path, List<String> csrfExcept)
    method _computeCsrfCookieValue (line 122) | String _computeCsrfCookieValue(String token, String iv)

FILE: lib/src/route/middleware/throttle.dart
  class Throttle (line 10) | class Throttle extends Middleware {
    method handle (line 32) | Future<void> handle(Request req)
    method _getRequestIdentifier (line 53) | Future<String> _getRequestIdentifier(Request req)
    method _addRateLimitHeaders (line 66) | void _addRateLimitHeaders(HttpResponse response, int remaining)

FILE: lib/src/route/route.dart
  class Route (line 4) | class Route {
    method register (line 8) | void register()

FILE: lib/src/route/route_data.dart
  class RouteData (line 3) | class RouteData {
    method toString (line 33) | String toString()

FILE: lib/src/route/route_handler.dart
  class _LookupKey (line 19) | class _LookupKey {
  class _LruCache (line 39) | class _LruCache<K, V> {
    method get (line 45) | V? get(K key)
    method put (line 52) | void put(K key, V value)
    method clear (line 62) | void clear()
    method contains (line 64) | bool contains(K key)
  function initializeRoutes (line 67) | void initializeRoutes()
  function httpRouteHandler (line 86) | RouteData? httpRouteHandler(HttpRequest req)
  function _handleNotFound (line 111) | RouteData? _handleNotFound(HttpRequest req, String method)
  function _findMatchingRoute (line 125) | RouteData? _findMatchingRoute(
  function _domainMatches (line 156) | bool _domainMatches(String requestDomain, String? routeDomain)
  function _applyDomainParams (line 170) | RouteData _applyDomainParams(RouteData route, String domain)
  function _matchDynamic (line 197) | RouteData? _matchDynamic(String requestPath, RouteData route, String dom...
  function _validateParams (line 225) | bool _validateParams(Map<String, dynamic> params, RouteData route)
  function clearRouteCaches (line 251) | void clearRouteCaches()
  function _normalizePath (line 259) | String _normalizePath(String path)
  function _normalizePrefix (line 268) | String _normalizePrefix(String? prefix)

FILE: lib/src/route/route_history.dart
  class RouteHistory (line 3) | class RouteHistory {
    method updateRouteHistory (line 14) | Future<void> updateRouteHistory(HttpRequest req)
    method _isHtmlRequest (line 21) | bool _isHtmlRequest(HttpRequest req)
    method _updateRoutes (line 26) | void _updateRoutes(String path)

FILE: lib/src/route/router.dart
  class Router (line 9) | class Router {
    method url (line 25) | String url(String name, [Map<String, dynamic>? params])
    method basePrefix (line 44) | void basePrefix([String? prefix])
    method _getRequestVar (line 54) | bool _getRequestVar(String input)
    method _addRouteInternal (line 65) | Router _addRouteInternal(
    method _normalizePath (line 93) | String _normalizePath(String path)
    method _addRoute (line 97) | Router _addRoute(
    method middleware (line 109) | Router middleware([List<Middleware>? middleware])
    method prefix (line 119) | Router prefix([String? prefix])
    method name (line 133) | Router name([String? name])
    method domain (line 140) | Router domain([String? domain])
    method whereInt (line 147) | Router whereInt(String paramName)
    method whereString (line 155) | Router whereString(String paramName)
    method whereDouble (line 163) | Router whereDouble(String paramName)
    method whereBool (line 171) | Router whereBool(String paramName)
    method where (line 179) | Router where(String paramName, String regex)
    method get (line 187) | Router get(String path, Function action)
    method post (line 190) | Router post(String path, Function action)
    method put (line 193) | Router put(String path, Function action)
    method patch (line 196) | Router patch(String path, Function action)
    method delete (line 199) | Router delete(String path, Function action)
    method options (line 202) | Router options(String path, Function action)
    method purge (line 205) | Router purge(String path, Function action)
    method copy (line 208) | Router copy(String path, Function action)
    method link (line 211) | Router link(String path, Function action)
    method unlink (line 214) | Router unlink(String path, Function action)
    method lock (line 217) | Router lock(String path, Function action)
    method unlock (line 220) | Router unlock(String path, Function action)
    method propfind (line 223) | Router propfind(String path, Function action)
    method any (line 226) | Router any(String path, Function action)
    method resource (line 248) | void resource(
    method websocket (line 292) | void websocket(
    method group (line 311) | void group(
    method _joinPrefixes (line 354) | String _joinPrefixes(String basePrefix, String newPrefix)

FILE: lib/src/route/set_static_path.dart
  function setStaticPath (line 8) | bool setStaticPath(HttpRequest req)

FILE: lib/src/route/throttle_requests.dart
  class ThrottleRequests (line 1) | class ThrottleRequests {
    method request (line 8) | bool request(String identifier)
    method remainingAttempts (line 31) | int remainingAttempts(String identifier)
    method retryAfter (line 43) | Duration retryAfter(String identifier)
    method resetTime (line 53) | DateTime resetTime()
    method _cleanup (line 57) | void _cleanup()
  class _ThrottleData (line 65) | class _ThrottleData {

FILE: lib/src/server/base_http_server.dart
  class BaseHttpServer (line 9) | class BaseHttpServer {
    method startServer (line 34) | Future<HttpServer> startServer({Function? onError})

FILE: lib/src/server/initialize_config.dart
  function initializeConfig (line 9) | Future<void> initializeConfig(Map<String, dynamic> config)
  function _config (line 43) | DBConfig _config(Map<String, dynamic> database)

FILE: lib/src/service/service_provider.dart
  class ServiceProvider (line 1) | abstract class ServiceProvider {
    method boot (line 3) | Future<void> boot()
    method register (line 4) | Future<void> register()

FILE: lib/src/storage/local_storage.dart
  class LocalStorage (line 10) | class LocalStorage implements StorageDriver {
    method delete (line 18) | Future<bool> delete(String file)
    method exists (line 31) | Future<bool> exists(String file)
    method getAsBytes (line 36) | Future<Uint8List?> getAsBytes(String file)
    method get (line 48) | Future<String?> get(String file)
    method json (line 60) | Future<Map<String, dynamic>?> json(String file)
    method put (line 72) | Future<String> put(String path, dynamic content)
    method mimeType (line 89) | Future<String?> mimeType(String file)
    method size (line 102) | Future<num?> size(String file)
    method _getFullPath (line 113) | String _getFullPath(String filePath)
    method _ensureDirectoryExists (line 117) | Future<void> _ensureDirectoryExists(Directory directory)
    method fullPath (line 124) | String fullPath(String file)

FILE: lib/src/storage/s3_storage.dart
  class S3Storage (line 10) | class S3Storage implements StorageDriver {
    method removeLeadingSlash (line 19) | String removeLeadingSlash(String file)
    method fullPath (line 24) | String fullPath(String file)
    method put (line 29) | Future<String> put(String filePath, dynamic content)
    method get (line 60) | Future<String?> get(String file)
    method getAsBytes (line 75) | Future<Uint8List?> getAsBytes(String file)
    method json (line 92) | Future<Map<String, dynamic>?> json(String file)
    method mimeType (line 104) | Future<String?> mimeType(String file)
    method size (line 121) | Future<num?> size(String file)
    method exists (line 127) | Future<bool> exists(String file)
    method delete (line 133) | Future<bool> delete(String file)
    method _executeRequest (line 148) | Future<HttpClientResponse> _executeRequest(
    method _getRequestForMethod (line 163) | Future<HttpClientRequest> _getRequestForMethod(
    method _getMetadata (line 182) | Future<_CachedMetadata?> _getMetadata(String file)
    method _invalidateMetadataCache (line 210) | void _invalidateMetadataCache(String file)
  class _CachedMetadata (line 215) | class _CachedMetadata {

FILE: lib/src/storage/storage.dart
  class Storage (line 11) | class Storage {
    method delete (line 22) | Future<bool> delete(String file)
    method exists (line 26) | Future<bool> exists(String file)
    method getAsBytes (line 30) | Future<Uint8List?> getAsBytes(String file)
    method get (line 34) | Future<String?> get(String file)
    method json (line 38) | Future<Map<String, dynamic>?> json(String file)
    method put (line 42) | Future<String> put(
    method mimeType (line 70) | Future<String?> mimeType(String file)
    method size (line 74) | Future<num?> size(String file)

FILE: lib/src/storage/storage_driver.dart
  class StorageDriver (line 3) | abstract class StorageDriver {
    method put (line 4) | Future<String> put(String filename, dynamic content)
    method get (line 6) | Future<String?> get(String filename)
    method getAsBytes (line 7) | Future<Uint8List?> getAsBytes(String filename)
    method json (line 8) | Future<Map<String, dynamic>?> json(String filename)
    method mimeType (line 9) | Future<String?> mimeType(String filename)
    method size (line 10) | Future<num?> size(String filename)
    method fullPath (line 12) | String fullPath(String file)
    method exists (line 14) | Future<bool> exists(String filename)
    method delete (line 16) | Future<bool> delete(String filename)

FILE: lib/src/utils/_pluralize.dart
  class Pluralize (line 1) | class Pluralize {
    method make (line 58) | String make(String singular)
    method _isVowel (line 98) | bool _isVowel(String char)
    method _isVowelBeforeO (line 102) | bool _isVowelBeforeO(String word)
    method pluralizeVariableName (line 107) | String pluralizeVariableName(String variableName)

FILE: lib/src/utils/functions.dart
  function toSnakeCase (line 3) | String toSnakeCase(String input)
  function sanitizeRoutePath (line 14) | String sanitizeRoutePath(String path)
  function randomString (line 26) | String randomString({
  function randomInt (line 71) | T randomInt<T>([int length = 6])

FILE: lib/src/utils/helper.dart
  function storagePath (line 12) | String storagePath(String file)
  function publicPath (line 14) | String publicPath(String file)
  function url (line 16) | String url(String path)
  function assets (line 18) | String assets(String src)
  function field (line 20) | FieldValidation field(String fieldName)
  function can (line 22) | bool can(String ability)
  function cannot (line 24) | bool cannot(String ability)
  function env (line 26) | T env<T>(String key, [dynamic defaultValue])
  function trans (line 28) | String trans(String key, {Map<String, dynamic>? args, String? locale})
  function setLocale (line 30) | void setLocale(String locale)
  function isLocale (line 31) | bool isLocale(String locale)
  function abort (line 33) | void abort(int code, String message)
  function setSession (line 37) | Future<void> setSession(String key, dynamic value)
  function getSession (line 39) | Future<T> getSession<T>(String key)
  function allSessions (line 42) | Future<Map<String, dynamic>?> allSessions()
  function deleteSession (line 44) | Future<void> deleteSession(String key)
  function destroyAllSessions (line 46) | Future<void> destroyAllSessions()

FILE: lib/src/utils/request_helper.dart
  function getParam (line 6) | T? getParam<T>(String key, [dynamic defualtValue])
  function requestBody (line 40) | Future requestBody()

FILE: lib/src/view_engine/helper.dart
  function view (line 4) | Response view(String view, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/abs_processor.dart
  class AbsProcessor (line 2) | abstract class AbsProcessor {
    method parse (line 4) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/assets_processor.dart
  class AssetsProcessor (line 5) | class AssetsProcessor implements AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/comment_processor.dart
  class CommentProcessor (line 3) | class CommentProcessor implements AbsProcessor {
    method parse (line 5) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/csrf_processor.dart
  class CsrfProcessor (line 5) | class CsrfProcessor implements AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/csrf_token_processor.dart
  class CsrfTokenProcessor (line 5) | class CsrfTokenProcessor implements AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/error_processor.dart
  class ErrorProcessor (line 5) | class ErrorProcessor extends AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/evaluate_expression.dart
  function evaluateExpression (line 1) | bool evaluateExpression(String expression, Map<String, dynamic> context)
  function _stripOuterParens (line 34) | String _stripOuterParens(String expr)
  function _evalArithmetic (line 45) | dynamic _evalArithmetic(String expr, Map<String, dynamic> ctx)
  function _doArithmetic (line 76) | dynamic _doArithmetic(dynamic left, dynamic right, String op)
  function removeOuterQuotes (line 97) | String removeOuterQuotes(String input)
  function _compare (line 106) | bool _compare(dynamic leftVal, dynamic rightVal, String op)

FILE: lib/src/view_engine/processor_engine/extends_processor.dart
  class ExtendsProcessor (line 4) | class ExtendsProcessor implements AbsProcessor {
    method parse (line 12) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/for_loop_processor.dart
  class ForLoopProcessor (line 5) | class ForLoopProcessor extends AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])
    method _parseForLoops (line 33) | String _parseForLoops(String template, Map<String, dynamic> context)
    method _expandLoop (line 112) | String _expandLoop(
    method _runItemInListLoop (line 163) | String _runItemInListLoop(
    method _runCStyleLoop (line 199) | String _runCStyleLoop({
    method checkCondition (line 210) | bool checkCondition(int curVal)
    method increment (line 237) | int increment(int curVal)
    method _evalToInt (line 295) | int? _evalToInt(String expr, Map<String, dynamic> context)

FILE: lib/src/view_engine/processor_engine/if_statement_processor.dart
  class IfStatementProcessor (line 25) | class IfStatementProcessor implements AbsProcessor {
    method parse (line 27) | String parse(String content, [Map<String, dynamic>? context])
    method _parseIfBlocks (line 50) | String _parseIfBlocks(String template, Map<String, dynamic> context)
    method _expandIfBlock (line 125) | String _expandIfBlock(
  class _ConditionalSegment (line 225) | class _ConditionalSegment {

FILE: lib/src/view_engine/processor_engine/include_processor.dart
  class IncludeProcessor (line 7) | class IncludeProcessor implements AbsProcessor {
    method parse (line 25) | String parse(String content, [Map<String, dynamic>? context])
    method _parseIncludeData (line 44) | Map<String, dynamic> _parseIncludeData(String dataString)

FILE: lib/src/view_engine/processor_engine/old_processor.dart
  class OldProcessor (line 5) | class OldProcessor extends AbsProcessor {
    method parse (line 7) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/route_processor.dart
  class RouteProcessor (line 8) | class RouteProcessor implements AbsProcessor {
    method parse (line 10) | String parse(String content, [Map<String, dynamic>? context])
    method injectParams (line 53) | String injectParams(String template, Map<String, dynamic> params)

FILE: lib/src/view_engine/processor_engine/section_processor.dart
  class SectionProcessor (line 3) | class SectionProcessor implements AbsProcessor {
    method parse (line 15) | String parse(String content, [Map<String, dynamic>? context])
    method parseChildSections (line 54) | Map<String, String> parseChildSections(String childTemplate)

FILE: lib/src/view_engine/processor_engine/session_processor.dart
  class SessionProcessor (line 4) | class SessionProcessor implements AbsProcessor {
    method parse (line 6) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/switch_cases_processor.dart
  class SwitchCasesProcessor (line 7) | class SwitchCasesProcessor implements AbsProcessor {
    method parse (line 18) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/translate_processor.dart
  class TranslateProcessor (line 7) | class TranslateProcessor implements AbsProcessor {
    method parse (line 9) | String parse(String content, [Map<String, dynamic>? context])

FILE: lib/src/view_engine/processor_engine/variables_processor.dart
  class VariablesProcessor (line 4) | class VariablesProcessor implements AbsProcessor {
    method parse (line 19) | String parse(String content, [Map<String, dynamic>? context])
    method _handleVariableWithFilters (line 59) | String _handleVariableWithFilters(
    method _looksLikeVariablePath (line 75) | bool _looksLikeVariablePath(String expr)
    method _fetchValueWithBracketNotation (line 91) | dynamic _fetchValueWithBracketNotation(
    method _resolveBracketIndexVars (line 107) | String _resolveBracketIndexVars(
    method _resolveSegment (line 138) | dynamic _resolveSegment(dynamic currentValue, String segment)
    method _applyFilter (line 173) | dynamic _applyFilter(dynamic value, String filter)
    method _evaluateExpression (line 223) | dynamic _evaluateExpression(String expr, Map<String, dynamic> context)
    method _evalOperand (line 269) | dynamic _evalOperand(String raw, Map<String, dynamic> context)
    method _compareValues (line 285) | bool _compareValues(dynamic left, dynamic right, String operator)
    method _arithValues (line 322) | dynamic _arithValues(dynamic left, dynamic right, String operator)
    method _boolFromAnything (line 358) | bool _boolFromAnything(dynamic val)

FILE: lib/src/view_engine/template_engine.dart
  class _TemplateProcessingPipeline (line 21) | class _TemplateProcessingPipeline {
    method run (line 26) | String run(String content, Map<String, dynamic> data)
  class TemplateEngine (line 34) | class TemplateEngine {
    method render (line 45) | String render(String template, [Map<String, dynamic>? data])
    method renderString (line 70) | String renderString(String templateContent, [Map<String, dynamic>? data])

FILE: lib/src/view_engine/template_reader.dart
  class TemplateReader (line 4) | abstract class TemplateReader {
    method read (line 6) | String read(String filePath)
  class FileTemplateReader (line 9) | class FileTemplateReader implements TemplateReader {
    method read (line 22) | String read(String template)

FILE: lib/src/websocket/web_socket_handler.dart
  class WebSocketHandler (line 11) | class WebSocketHandler implements WebSocketEvent {
    method websocketRoute (line 21) | WebSocketHandler websocketRoute(
    method handler (line 34) | Future handler(HttpRequest req)
    method on (line 142) | void on(String event, Function function)

FILE: lib/src/websocket/websocket_client.dart
  class WebSocketClient (line 5) | abstract class WebSocketClient {
    method getRoomMembers (line 9) | List<String> getRoomMembers({String roomId = ''})
    method isActiveSession (line 10) | bool isActiveSession({String sessionId = ''})
    method emit (line 13) | void emit(String event, dynamic payload)
    method toRoom (line 14) | void toRoom(String event, String room, dynamic payload)
    method broadcast (line 15) | void broadcast(String event, dynamic payload)
    method to (line 16) | void to(String clientId, String event, dynamic payload)
  class WebSocketClientImpl (line 19) | class WebSocketClientImpl implements WebSocketClient {
    method emit (line 40) | void emit(String event, dynamic payload)
    method toRoom (line 53) | void toRoom(String event, String room, dynamic payload)
    method to (line 69) | void to(String clientId, String event, dynamic payload)
    method broadcast (line 81) | void broadcast(String event, dynamic payload)
    method joinRoom (line 90) | void joinRoom(String roomId)
    method leftRoom (line 94) | void leftRoom(String roomId)
    method getRoomMembers (line 99) | List<String> getRoomMembers({String roomId = ''})
    method isActiveSession (line 109) | bool isActiveSession({String sessionId = ''})

FILE: lib/src/websocket/websocket_event.dart
  class WebSocketEvent (line 1) | abstract class WebSocketEvent {
    method on (line 2) | void on(String event, Function function)

FILE: lib/src/websocket/websocket_session.dart
  class SessionInfo (line 7) | class SessionInfo {
  class WebsocketSession (line 21) | class WebsocketSession {
    method addNewSession (line 29) | void addNewSession(String sessionId, WebSocket ws)
    method getWebSocketInfo (line 36) | SessionInfo? getWebSocketInfo(String sessionId)
    method removeSession (line 41) | void removeSession(String sessionId)
    method joinRoom (line 50) | void joinRoom(String sessionId, String roomId)
    method leftRoom (line 65) | void leftRoom(String sessionId, String? roomId)
    method getRoomMembers (line 78) | List<String> getRoomMembers(String roomId)
    method isRoom (line 82) | bool isRoom(String roomId)
    method isActiveSession (line 86) | bool isActiveSession(String sessionId)
    method getActiveSessions (line 90) | List<SessionInfo> getActiveSessions()
    method getActiveSessionIds (line 94) | List<String> getActiveSessionIds()

FILE: test/src/extensions/date_time_extension_test.dart
  function main (line 4) | void main()

FILE: test/src/extensions/number_extension_test.dart
  function main (line 4) | void main()

FILE: test/src/extensions/string_extension_test.dart
  function main (line 4) | void main()

FILE: test/src/extensions/string_list_extension_test.dart
  function main (line 4) | void main()

FILE: test/unit/hash_test.dart
  function main (line 6) | void main()

FILE: test/unit/route_test.dart
  function main (line 3) | void main()

FILE: test/unit/validation_test.dart
  function main (line 4) | void main()
Condensed preview — 280 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (659K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 922,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve Vania\ntitle: \"[BUG] - Short Description of Issue\"\nlabels:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation-issue.md",
    "chars": 745,
    "preview": "---\nname: Documentation Issue\nabout: Report errors, improvements, or suggestions for the documentation.\ntitle: \"[Documen"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 656,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[Feature Request] - Brief Description of Featu"
  },
  {
    "path": ".github/stale.yml",
    "chars": 329,
    "preview": "daysUntilStale: 60\ndaysUntilClose: 7\nstaleLabel: wontfix\nexemptLabels:\n  - bug\n  - enhancement\n  - feature request\nmarkC"
  },
  {
    "path": ".github/workflows/vania-dart.yml",
    "chars": 676,
    "preview": "name: Vania Dart\n\non:\n  push:\n    branches: [ \"main\", \"dev\"]\n  pull_request:\n    branches: [ \"main\", \"dev\"]\n\njobs:\n  bui"
  },
  {
    "path": ".gitignore",
    "chars": 237,
    "preview": "# https://dart.dev/guides/libraries/private-files\n# Created by `dart pub`\n.dart_tool/\n.idea/\n.vscode/\n\n# Avoid committin"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 10442,
    "preview": "## 1.1.1\n\n- Fix(db): switch from mysql_dart to mysql_client to fix UTF-8 encoding issues\n- Chore update dependencies\n\n##"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 688,
    "preview": "# Contributing to Vania\n\n## Creating a Pull Request\n\nBefore creating a pull request, please follow these steps:\n\n1. Fork"
  },
  {
    "path": "LICENSE",
    "chars": 1062,
    "preview": "MIT License\n\nCopyright (c) 2024 Vania\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof t"
  },
  {
    "path": "README.md",
    "chars": 2691,
    "preview": "# Introduction\n\n[Vania Dart Documentation](https://vdart.dev)\n\n[Contributing to Vania](https://github.com/vania-dart/fra"
  },
  {
    "path": "README.tr.md",
    "chars": 2766,
    "preview": "\n# Introduction\n\nVania, Dart kullanarak yüksek performanslı web uygulamaları oluşturmak için tasarlanmış sağlam bir back"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 1038,
    "preview": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables th"
  },
  {
    "path": "example/app_exception_handler.dart",
    "chars": 2482,
    "preview": "import 'package:vania/src/exception/database_exception.dart';\nimport 'package:vania/src/exception/exception_handler.dart"
  },
  {
    "path": "example/main.dart",
    "chars": 201,
    "preview": "import 'package:vania/vania.dart';\nimport 'app_exception_handler.dart';\n\nvoid main() async {\n  Application().initialize("
  },
  {
    "path": "lib/application.dart",
    "chars": 1892,
    "preview": "import 'src/container.dart';\nimport 'src/exception/exception_handler.dart';\nimport 'src/ioc_container.dart';\nimport 'src"
  },
  {
    "path": "lib/authentication.dart",
    "chars": 249,
    "preview": "export 'src/authentication/authentication.dart';\nexport 'src/authentication/authenticate.dart';\nexport 'src/authenticati"
  },
  {
    "path": "lib/database.dart",
    "chars": 178,
    "preview": "export 'src/database/seeder/seeder.dart';\nexport 'src/database/seeder/seeder_runner.dart';\nexport 'src/database/seeder/s"
  },
  {
    "path": "lib/http/controller.dart",
    "chars": 49,
    "preview": "export '../src/http/controller/controller.dart';\n"
  },
  {
    "path": "lib/http/form_validation.dart",
    "chars": 60,
    "preview": "export '../src/contract/http/request/form_validation.dart';\n"
  },
  {
    "path": "lib/http/middleware.dart",
    "chars": 97,
    "preview": "export '../src/route/middleware/throttle.dart';\nexport '../src/http/middleware/middleware.dart';\n"
  },
  {
    "path": "lib/http/request.dart",
    "chars": 424,
    "preview": "export '../src/http/request/request.dart';\nexport '../src/http/request/request_file.dart';\nexport '../src/http/validatio"
  },
  {
    "path": "lib/http/response.dart",
    "chars": 86,
    "preview": "export '../src/http/response/response.dart';\nexport '../src/view_engine/helper.dart';\n"
  },
  {
    "path": "lib/mail.dart",
    "chars": 237,
    "preview": "export 'src/mail/mailable.dart';\nexport 'src/mail/content.dart';\nexport 'src/mail/envelope.dart';\nexport 'src/mail/mail_"
  },
  {
    "path": "lib/migration.dart",
    "chars": 284,
    "preview": "export 'src/database/migration/runners/migration_runner.dart';\nexport 'src/database/migration/migration.dart';\nexport 's"
  },
  {
    "path": "lib/orm/model.dart",
    "chars": 41,
    "preview": "export '../src/database/orm/model.dart';\n"
  },
  {
    "path": "lib/query_builder.dart",
    "chars": 284,
    "preview": "export 'src/database/db.dart';\nexport 'src/contract/database/query_builder/query_builder.dart';\nexport 'src/database/mon"
  },
  {
    "path": "lib/route.dart",
    "chars": 63,
    "preview": "export 'src/route/router.dart';\nexport 'src/route/route.dart';\n"
  },
  {
    "path": "lib/service_provider.dart",
    "chars": 58,
    "preview": "export 'package:vania/src/service/service_provider.dart';\n"
  },
  {
    "path": "lib/src/authentication/authenticate.dart",
    "chars": 1538,
    "preview": "import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';\nimport 'package:meta/meta.dart';\nimport 'package:vania/src/au"
  },
  {
    "path": "lib/src/authentication/authentication.dart",
    "chars": 9541,
    "preview": "import 'dart:convert';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:vania/src/config/config.dart';\nimport 'pack"
  },
  {
    "path": "lib/src/authentication/gate/gate.dart",
    "chars": 978,
    "preview": "class Gate {\n  static final Gate _instance = Gate._internal();\n\n  factory Gate() {\n    return _instance;\n  }\n\n  Gate._in"
  },
  {
    "path": "lib/src/authentication/has_api_tokens.dart",
    "chars": 5020,
    "preview": "import 'dart:convert';\n\nimport 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';\nimport 'package:vania/src/exception/u"
  },
  {
    "path": "lib/src/authentication/model/personal_access_token.dart",
    "chars": 142,
    "preview": "import 'package:vania/src/database/orm/model.dart';\n\nclass PersonalAccessToken extends Model {\n  @override\n  List<String"
  },
  {
    "path": "lib/src/authentication/redirect_if_authenticated.dart",
    "chars": 644,
    "preview": "import 'package:vania/src/exception/redirect_exception.dart';\nimport 'package:vania/src/http/middleware/middleware.dart'"
  },
  {
    "path": "lib/src/aws/s3_client.dart",
    "chars": 2641,
    "preview": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:vania/src/extensi"
  },
  {
    "path": "lib/src/cache/cache.dart",
    "chars": 1815,
    "preview": "import 'package:vania/src/cache/file_cache_driver.dart';\nimport 'package:vania/src/utils/helper.dart' show env;\n\nimport "
  },
  {
    "path": "lib/src/cache/cache_driver.dart",
    "chars": 280,
    "preview": "abstract class CacheDriver {\n  Future<void> put(String key, dynamic value, {Duration duration});\n\n  Future<void> forever"
  },
  {
    "path": "lib/src/cache/file_cache_driver.dart",
    "chars": 2401,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:path/path.dart' as path;\nimport '../utils/helper.dart';\nimport "
  },
  {
    "path": "lib/src/cache/redis_cache_driver.dart",
    "chars": 1088,
    "preview": "import 'package:vania/src/redis/vania_redis.dart';\nimport 'package:vania/src/utils/helper.dart' show env;\n\nimport 'cache"
  },
  {
    "path": "lib/src/config/config.dart",
    "chars": 649,
    "preview": "class Config {\n  static final Config _singleton = Config._internal();\n  factory Config() => _singleton;\n  Config._intern"
  },
  {
    "path": "lib/src/config/defined_regexp.dart",
    "chars": 467,
    "preview": "final ipRegExp = RegExp(\n  r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',\n);\n"
  },
  {
    "path": "lib/src/config/http_cors.dart",
    "chars": 1369,
    "preview": "import 'dart:io';\n\nimport 'config.dart';\n\nclass HttpCors {\n  HttpCors(HttpRequest req) {\n    CORSConfig? cors = Config()"
  },
  {
    "path": "lib/src/container.dart",
    "chars": 19,
    "preview": "class Container {}\n"
  },
  {
    "path": "lib/src/contract/database/_connectors/_database_connection.dart",
    "chars": 444,
    "preview": "abstract interface class DatabaseConnection {\n  Future<void> connect();\n  Future<List<Map<String, dynamic>>> select(\n   "
  },
  {
    "path": "lib/src/contract/database/query_builder/_bulk_operations_builder.dart",
    "chars": 1970,
    "preview": "part of 'query_builder.dart';\n\nenum ConflictAction { update, ignore, replace, delete }\n\nabstract class BulkOperationsBui"
  },
  {
    "path": "lib/src/contract/database/query_builder/_cte_builder.dart",
    "chars": 652,
    "preview": "part of 'query_builder.dart';\n\nabstract class CteBuilder {\n  QueryBuilder withCte(\n    String name,\n    QueryBuilder sub"
  },
  {
    "path": "lib/src/contract/database/query_builder/_delete_query_builder.dart",
    "chars": 151,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class DeleteQueryBuilder {\n  Future<bool> delete();\n  Future<bool> tru"
  },
  {
    "path": "lib/src/contract/database/query_builder/_insert_query_builder.dart",
    "chars": 522,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class InsertQueryBuilder {\n  Future<bool> insert(Map<String, dynamic> "
  },
  {
    "path": "lib/src/contract/database/query_builder/_join_clause_builder.dart",
    "chars": 924,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class JoinClauseBuilder {\n  QueryBuilder crossJoin(String table, [List"
  },
  {
    "path": "lib/src/contract/database/query_builder/_query_executor_builder.dart",
    "chars": 1793,
    "preview": "part of 'query_builder.dart';\n\nabstract class QueryExecutorBuilder {\n  Future<num> avg(String column);\n  Future<void> ch"
  },
  {
    "path": "lib/src/contract/database/query_builder/_select_query_builder.dart",
    "chars": 304,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class SelectQueryBuilder {\n  QueryBuilder addSelect(List<String> colum"
  },
  {
    "path": "lib/src/contract/database/query_builder/_union_clause_builder.dart",
    "chars": 166,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class UnionClauseBuilder {\n  QueryBuilder union(QueryBuilder query);\n "
  },
  {
    "path": "lib/src/contract/database/query_builder/_update_query_builder.dart",
    "chars": 659,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class UpdateQueryBuilder {\n  Future<bool> decrement(\n    String column"
  },
  {
    "path": "lib/src/contract/database/query_builder/_where_clauses_builder.dart",
    "chars": 7204,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class WhereClausesBuilder {\n  QueryBuilder orWhere(\n    dynamic condit"
  },
  {
    "path": "lib/src/contract/database/query_builder/_window_functions_builder.dart",
    "chars": 1711,
    "preview": "part of 'query_builder.dart';\n\nabstract interface class WindowFunctionsBuilder {\n  QueryBuilder rowNumber({String? parti"
  },
  {
    "path": "lib/src/contract/database/query_builder/query_builder.dart",
    "chars": 3433,
    "preview": "import 'package:meta/meta.dart';\nimport '../../../database/_connection_manager.dart';\nimport '../../../database/monitori"
  },
  {
    "path": "lib/src/contract/http/request/form_validation.dart",
    "chars": 234,
    "preview": "import '../../../http/validation/custom_validation_rule.dart';\n\nabstract class FormValidation {\n  dynamic rules();\n  Lis"
  },
  {
    "path": "lib/src/contract/orm/morph_relation.dart",
    "chars": 465,
    "preview": "import 'package:vania/src/contract/orm/relation.dart';\n\nabstract class MorphRelation extends Relation {\n  final String m"
  },
  {
    "path": "lib/src/contract/orm/relation.dart",
    "chars": 6406,
    "preview": "import '../../database/orm/model.dart';\n\nabstract class Relation {\n  final Model related;\n  final Model parent;\n  String"
  },
  {
    "path": "lib/src/cryptographic/hash.dart",
    "chars": 3434,
    "preview": "import 'dart:convert';\nimport 'dart:math';\nimport 'package:crypto/crypto.dart';\nimport 'package:vania/src/utils/helper.d"
  },
  {
    "path": "lib/src/cryptographic/vania_encryption.dart",
    "chars": 3215,
    "preview": "import 'dart:convert';\n\nimport 'package:cryptography/cryptography.dart';\n\nclass VaniaEncryption {\n  static final List<in"
  },
  {
    "path": "lib/src/database/_connection_manager.dart",
    "chars": 2639,
    "preview": "import 'dart:async';\n\nimport 'package:vania/src/exception/database_exception.dart';\n\nimport '../contract/database/_conne"
  },
  {
    "path": "lib/src/database/_connectors/_database_connection_factory.dart",
    "chars": 689,
    "preview": "import '../../exception/invalid_argument_exception.dart';\nimport '../_database_utils/_db_config.dart';\nimport '../../con"
  },
  {
    "path": "lib/src/database/_connectors/_database_connection_proxy.dart",
    "chars": 4182,
    "preview": "import 'package:vania/src/contract/database/_connectors/_database_connection.dart';\nimport 'package:vania/src/exception/"
  },
  {
    "path": "lib/src/database/_database_utils/_db_config.dart",
    "chars": 723,
    "preview": "class DBConfig {\n  final String driver;\n  final String host;\n  final int port;\n  final String username;\n  final String p"
  },
  {
    "path": "lib/src/database/_database_utils/_paginated_result.dart",
    "chars": 932,
    "preview": "part of '../../contract/database/query_builder/query_builder.dart';\n\nclass PaginatedResult {\n  final List<Map<String, dy"
  },
  {
    "path": "lib/src/database/_database_utils/_raw_expression.dart",
    "chars": 202,
    "preview": "part of '../../contract/database/query_builder/query_builder.dart';\n\nclass RawExpression {\n  final String expression;\n  "
  },
  {
    "path": "lib/src/database/_database_utils/_singularize.dart",
    "chars": 7999,
    "preview": "class Singularize {\n  static String make(String tableName) {\n    if (tableName.isEmpty) return tableName;\n\n    final nam"
  },
  {
    "path": "lib/src/database/adapters/_mysql_connector.dart",
    "chars": 4046,
    "preview": "import 'dart:convert';\n\nimport 'package:mysql_client/mysql_client.dart';\n\nimport '../../exception/database_exception.dar"
  },
  {
    "path": "lib/src/database/adapters/_postgres_connector.dart",
    "chars": 4235,
    "preview": "import 'dart:convert';\n\nimport 'package:postgres/postgres.dart';\nimport 'package:vania/src/exception/database_exception."
  },
  {
    "path": "lib/src/database/adapters/_sqlite_connector.dart",
    "chars": 3689,
    "preview": "import 'dart:ffi';\nimport 'dart:io';\nimport 'package:path/path.dart';\nimport 'package:sqlite3/open.dart';\nimport 'packag"
  },
  {
    "path": "lib/src/database/db.dart",
    "chars": 230,
    "preview": "// ignore_for_file: non_constant_identifier_names\n\nimport '../contract/database/query_builder/query_builder.dart';\nimpor"
  },
  {
    "path": "lib/src/database/isolate_db.dart",
    "chars": 1129,
    "preview": "import 'dart:isolate';\n\nimport '_connection_manager.dart';\nimport '_database_utils/_db_config.dart';\n\nclass IsolateDB {\n"
  },
  {
    "path": "lib/src/database/migration/adapters/grammar/mysql_grammar.dart",
    "chars": 614,
    "preview": "import 'sql_grammar.dart';\n\nclass MySqlGrammar extends BaseGrammar {\n  @override\n  String get identifierQuote => '`';\n\n "
  },
  {
    "path": "lib/src/database/migration/adapters/grammar/postgresql_grammar.dart",
    "chars": 4065,
    "preview": "import 'sql_grammar.dart';\n\n/// PostgreSQL-specific SQL grammar (Single Responsibility Principle)\nclass PostgreSqlGramma"
  },
  {
    "path": "lib/src/database/migration/adapters/grammar/sql_grammar.dart",
    "chars": 1226,
    "preview": "abstract class SqlGrammar {\n  String convertQuery(String query);\n\n  String get identifierQuote;\n\n  Map<String, String> g"
  },
  {
    "path": "lib/src/database/migration/adapters/grammar/sqlite_grammar.dart",
    "chars": 3078,
    "preview": "import 'sql_grammar.dart';\n\nclass SqliteGrammar extends BaseGrammar {\n  @override\n  String get identifierQuote => '\"';\n\n"
  },
  {
    "path": "lib/src/database/migration/adapters/mysql_adapter.dart",
    "chars": 1204,
    "preview": "import '../contracts/database_adapter_interface.dart';\nimport 'grammar/mysql_grammar.dart';\n\nclass MySqlAdapter implemen"
  },
  {
    "path": "lib/src/database/migration/adapters/postgresql_adapter.dart",
    "chars": 4216,
    "preview": "import '../contracts/database_adapter_interface.dart';\nimport 'grammar/postgresql_grammar.dart';\n\nclass PostgreSqlAdapte"
  },
  {
    "path": "lib/src/database/migration/adapters/sqlite_adapter.dart",
    "chars": 1161,
    "preview": "import '../contracts/database_adapter_interface.dart';\nimport 'grammar/sqlite_grammar.dart';\n\nclass SqliteAdapter implem"
  },
  {
    "path": "lib/src/database/migration/builders/column_definition.dart",
    "chars": 4317,
    "preview": "import '../../../enum/column_index.dart';\nimport 'schema.dart';\n\nclass ColumnDefinition {\n  final Schema _schema;\n  fina"
  },
  {
    "path": "lib/src/database/migration/builders/column_types.dart",
    "chars": 6952,
    "preview": "import 'column_definition.dart';\nimport 'schema.dart';\n\nexport 'column_definition.dart';\nexport 'table_definition.dart';"
  },
  {
    "path": "lib/src/database/migration/builders/schema.dart",
    "chars": 8036,
    "preview": "import '../../../enum/column_index.dart';\nimport '../contracts/schema_interface.dart';\n\nclass Schema implements SchemaIn"
  },
  {
    "path": "lib/src/database/migration/builders/table_definition.dart",
    "chars": 2966,
    "preview": "import 'dart:async';\n\nimport '../contracts/database_adapter_interface.dart';\nimport '../migration_connection.dart';\n\ncla"
  },
  {
    "path": "lib/src/database/migration/contracts/database_adapter_interface.dart",
    "chars": 258,
    "preview": "abstract class DatabaseAdapterInterface {\n  String get driverName;\n\n  String adaptQuery(String query);\n\n  String getMigr"
  },
  {
    "path": "lib/src/database/migration/contracts/migration_connection_interface.dart",
    "chars": 317,
    "preview": "import '../../../contract/database/_connectors/_database_connection.dart';\n\nabstract class MigrationConnectionInterface "
  },
  {
    "path": "lib/src/database/migration/contracts/schema_interface.dart",
    "chars": 912,
    "preview": "import '../../../enum/column_index.dart';\n\nabstract class SchemaInterface {\n  void addColumn(\n    String name,\n    Strin"
  },
  {
    "path": "lib/src/database/migration/migration.dart",
    "chars": 6055,
    "preview": "import 'dart:io';\n\nimport 'package:meta/meta.dart';\nimport 'package:vania/src/exception/query_exception.dart';\nimport 'p"
  },
  {
    "path": "lib/src/database/migration/migration_connection.dart",
    "chars": 4081,
    "preview": "import 'dart:io';\n\nimport '../../contract/database/_connectors/_database_connection.dart';\nimport '../../env_handler/env"
  },
  {
    "path": "lib/src/database/migration/runners/migration_runner.dart",
    "chars": 14507,
    "preview": "import 'dart:io';\n\nimport 'package:vania/query_builder.dart';\n\nimport '../../../utils/functions.dart';\nimport '../migrat"
  },
  {
    "path": "lib/src/database/monitoring/database_monitor.dart",
    "chars": 4415,
    "preview": "import 'dart:async';\nimport 'package:meta/meta.dart';\n\nenum AlertType { slowQuery, highConnectionUsage, connectionError,"
  },
  {
    "path": "lib/src/database/orm/belongs_to.dart",
    "chars": 498,
    "preview": "import 'package:vania/src/contract/orm/relation.dart';\n\nclass BelongsTo extends Relation {\n  BelongsTo({\n    required su"
  },
  {
    "path": "lib/src/database/orm/belongs_to_many.dart",
    "chars": 899,
    "preview": "import 'package:vania/src/contract/orm/relation.dart';\n\nclass BelongsToMany extends Relation {\n  final String pivotTable"
  },
  {
    "path": "lib/src/database/orm/has_many.dart",
    "chars": 488,
    "preview": "import 'package:vania/src/contract/orm/relation.dart';\n\nclass HasMany extends Relation {\n  HasMany({\n    required super."
  },
  {
    "path": "lib/src/database/orm/has_one.dart",
    "chars": 515,
    "preview": "import 'package:vania/src/contract/orm/relation.dart';\n\nclass HasOne extends Relation {\n  HasOne({\n    required super.re"
  },
  {
    "path": "lib/src/database/orm/model.dart",
    "chars": 22164,
    "preview": "import 'package:meta/meta.dart';\nimport 'package:vania/query_builder.dart';\nimport 'package:vania/src/contract/database/"
  },
  {
    "path": "lib/src/database/orm/polymorphic/morph_many.dart",
    "chars": 598,
    "preview": "import 'package:vania/src/contract/orm/morph_relation.dart';\n\nclass MorphMany extends MorphRelation {\n  MorphMany({\n    "
  },
  {
    "path": "lib/src/database/orm/polymorphic/morph_one.dart",
    "chars": 601,
    "preview": "import 'package:vania/src/contract/orm/morph_relation.dart';\n\nclass MorphOne extends MorphRelation {\n  MorphOne({\n    re"
  },
  {
    "path": "lib/src/database/orm/polymorphic/morph_to.dart",
    "chars": 511,
    "preview": "import 'package:vania/src/contract/orm/morph_relation.dart';\n\nclass MorphTo extends MorphRelation {\n  MorphTo({\n    requ"
  },
  {
    "path": "lib/src/database/orm/polymorphic/morph_to_many.dart",
    "chars": 699,
    "preview": "import 'package:vania/src/contract/orm/morph_relation.dart';\n\nclass MorphToMany extends MorphRelation {\n  MorphToMany({\n"
  },
  {
    "path": "lib/src/database/orm/polymorphic/morphed_by_many.dart",
    "chars": 703,
    "preview": "import 'package:vania/src/contract/orm/morph_relation.dart';\n\nclass MorphedByMany extends MorphRelation {\n  MorphedByMan"
  },
  {
    "path": "lib/src/database/query_builder/_bulk_operations_builder_impl.dart",
    "chars": 12378,
    "preview": "import 'dart:async';\n\nimport 'package:meta/meta.dart';\n\nimport '../../contract/database/query_builder/query_builder.dart"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_cte_cache.dart",
    "chars": 872,
    "preview": "class CteCache {\n  String? _cachedWithClause;\n  Map<String, dynamic>? _cachedBindings;\n  int _cteHashCode = 0;\n  bool _i"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_cte_configuration.dart",
    "chars": 1741,
    "preview": "import '_cte_feature.dart';\nimport '_database_type.dart';\n\nclass CteConfiguration {\n  final String quoteChar;\n\n  final D"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_cte_definition.dart",
    "chars": 5538,
    "preview": "import 'package:vania/src/contract/database/query_builder/query_builder.dart';\n\nimport '../_cte_builder_impl.dart';\nimpo"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_cte_exception.dart",
    "chars": 141,
    "preview": "class CteException implements Exception {\n  final String message;\n\n  final String? cteName;\n\n  CteException(this.message"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_cte_feature.dart",
    "chars": 61,
    "preview": "enum CteFeature { materialized, notMaterialized, recursive }\n"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_database_type.dart",
    "chars": 48,
    "preview": "enum DatabaseType { postgresql, mysql, sqlite }\n"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_duplicate_cte_name_exception.dart",
    "chars": 188,
    "preview": "import '_cte_exception.dart';\n\nclass DuplicateCteNameException extends CteException {\n  DuplicateCteNameException(String"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_invalid_cte_configuration_exception.dart",
    "chars": 163,
    "preview": "import '_cte_exception.dart';\n\nclass InvalidCteConfigurationException extends CteException {\n  InvalidCteConfigurationEx"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_sql_identifier_escaper.dart",
    "chars": 3006,
    "preview": "import 'package:vania/src/exception/invalid_argument_exception.dart';\n\nclass SqlIdentifierEscaper {\n  static const Set<S"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_standard_escaping_strategy.dart",
    "chars": 902,
    "preview": "import '_sql_identifier_escaper.dart';\n\nabstract class IdentifierEscapingStrategy {\n  String escape(String identifier);\n"
  },
  {
    "path": "lib/src/database/query_builder/_cte/_unsupported_cte_feature_exception.dart",
    "chars": 433,
    "preview": "import '_cte_exception.dart';\nimport '_cte_feature.dart';\nimport '_database_type.dart';\n\nclass UnsupportedCteFeatureExce"
  },
  {
    "path": "lib/src/database/query_builder/_cte_builder_impl.dart",
    "chars": 8722,
    "preview": "import 'package:meta/meta.dart';\n\nimport '../../contract/database/query_builder/query_builder.dart';\nimport '../../excep"
  },
  {
    "path": "lib/src/database/query_builder/_delete_query_builder_impl.dart",
    "chars": 866,
    "preview": "import '../../contract/database/_connectors/_database_connection.dart';\nimport '../../contract/database/query_builder/qu"
  },
  {
    "path": "lib/src/database/query_builder/_insert_query_builder_impl.dart",
    "chars": 6430,
    "preview": "import 'package:meta/meta.dart';\n\nimport '../../contract/database/_connectors/_database_connection.dart';\nimport '../../"
  },
  {
    "path": "lib/src/database/query_builder/_join_clause_builder_impl.dart",
    "chars": 1866,
    "preview": "import '../../contract/database/query_builder/query_builder.dart'\n    show QueryBuilder;\n\nabstract mixin class JoinClaus"
  },
  {
    "path": "lib/src/database/query_builder/_query_builder_impl.dart",
    "chars": 7735,
    "preview": "import 'package:meta/meta.dart';\nimport '../../contract/database/query_builder/query_builder.dart';\nimport '../../except"
  },
  {
    "path": "lib/src/database/query_builder/_query_executor_builder_impl.dart",
    "chars": 9942,
    "preview": "import 'package:vania/src/utils/request_helper.dart' show getParam;\n\nimport '../../contract/database/_connectors/_databa"
  },
  {
    "path": "lib/src/database/query_builder/_select_query_builder_impl.dart",
    "chars": 915,
    "preview": "import '../../contract/database/query_builder/query_builder.dart'\n    show QueryBuilder;\n\nabstract mixin class SelectQue"
  },
  {
    "path": "lib/src/database/query_builder/_union_clause_builder_impl.dart",
    "chars": 394,
    "preview": "import '../../contract/database/query_builder/query_builder.dart'\n    show QueryBuilder;\n\nabstract mixin class UnionClau"
  },
  {
    "path": "lib/src/database/query_builder/_update_query_builder_impl.dart",
    "chars": 5322,
    "preview": "import '../../contract/database/_connectors/_database_connection.dart';\nimport '../../contract/database/query_builder/qu"
  },
  {
    "path": "lib/src/database/query_builder/_where_clauses_builder_impl.dart",
    "chars": 27289,
    "preview": "import '../../exception/invalid_argument_exception.dart';\nimport '../../contract/database/query_builder/query_builder.da"
  },
  {
    "path": "lib/src/database/query_builder/_window_functions_builder_impl.dart",
    "chars": 7510,
    "preview": "import 'package:meta/meta.dart';\n\nimport '../../contract/database/query_builder/query_builder.dart'\n    show QueryBuilde"
  },
  {
    "path": "lib/src/database/seeder/seeder.dart",
    "chars": 102,
    "preview": "import 'package:meta/meta.dart';\n\nabstract class Seeder {\n  @mustBeOverridden\n  Future<void> run();\n}\n"
  },
  {
    "path": "lib/src/database/seeder/seeder_factory.dart",
    "chars": 8722,
    "preview": "import 'dart:io';\nimport 'dart:math';\n\nimport 'package:meta/meta.dart';\n\nabstract class SeederFactory {\n  final Random _"
  },
  {
    "path": "lib/src/database/seeder/seeder_runner.dart",
    "chars": 2382,
    "preview": "import 'dart:io';\n\nimport '../../env_handler/env.dart';\nimport '../../exception/query_exception.dart';\nimport '../../uti"
  },
  {
    "path": "lib/src/enum/column_index.dart",
    "chars": 57,
    "preview": "enum ColumnIndex { unique, indexKey, fulltext, spatial }\n"
  },
  {
    "path": "lib/src/enum/http_request_method.dart",
    "chars": 152,
    "preview": "enum HttpRequestMethod {\n  get,\n  post,\n  put,\n  patch,\n  delete,\n  purge,\n  options,\n  copy,\n  view,\n  link,\n  unlink,\n"
  },
  {
    "path": "lib/src/env_handler/env.dart",
    "chars": 2050,
    "preview": "import 'dart:io';\n\nclass Env {\n  static final Env _singleton = Env._internal();\n\n  factory Env() {\n    return _singleton"
  },
  {
    "path": "lib/src/exception/base_http_exception.dart",
    "chars": 461,
    "preview": "import 'package:vania/src/http/response/response.dart';\n\nclass BaseHttpResponseException {\n  final dynamic message;\n  fi"
  },
  {
    "path": "lib/src/exception/database_exception.dart",
    "chars": 146,
    "preview": "class DatabaseException implements Exception {\n  final String message;\n  final dynamic cause;\n\n  DatabaseException(this."
  },
  {
    "path": "lib/src/exception/exception_handler.dart",
    "chars": 366,
    "preview": "import 'package:vania/src/http/request/request.dart';\nimport 'package:vania/src/http/response/response.dart';\n\nabstract "
  },
  {
    "path": "lib/src/exception/forbidden_exception.dart",
    "chars": 347,
    "preview": "import 'dart:io';\n\nimport 'package:vania/src/exception/base_http_exception.dart';\nimport 'package:vania/src/http/respons"
  },
  {
    "path": "lib/src/exception/http_exception.dart",
    "chars": 193,
    "preview": "import 'dart:io';\nimport 'base_http_exception.dart';\n\nclass HttpResponseException extends BaseHttpResponseException {\n  "
  },
  {
    "path": "lib/src/exception/internal_server_error.dart",
    "chars": 225,
    "preview": "import 'dart:io';\nimport 'base_http_exception.dart';\n\nclass InternalServerError extends BaseHttpResponseException {\n  In"
  },
  {
    "path": "lib/src/exception/invalid_argument_exception.dart",
    "chars": 107,
    "preview": "class InvalidArgumentException {\n  final String message;\n  const InvalidArgumentException(this.message);\n}\n"
  },
  {
    "path": "lib/src/exception/not_found_exception.dart",
    "chars": 304,
    "preview": "import 'dart:io';\nimport '../http/response/response.dart';\nimport 'base_http_exception.dart';\n\nclass NotFoundException e"
  },
  {
    "path": "lib/src/exception/page_expired_exception.dart",
    "chars": 329,
    "preview": "import 'package:vania/src/http/response/response.dart';\n\nimport 'base_http_exception.dart';\n\nclass PageExpiredException "
  },
  {
    "path": "lib/src/exception/query_exception.dart",
    "chars": 101,
    "preview": "class QueryException implements Exception {\n  final String? cause;\n  QueryException([this.cause]);\n}\n"
  },
  {
    "path": "lib/src/exception/redirect_exception.dart",
    "chars": 284,
    "preview": "import 'dart:io';\n\nimport '../http/response/response.dart';\nimport 'base_http_exception.dart';\n\nclass RedirectException "
  },
  {
    "path": "lib/src/exception/throttle_exception.dart",
    "chars": 746,
    "preview": "import '../http/response/response.dart';\nimport 'base_http_exception.dart';\n\nclass ThrottleException extends BaseHttpRes"
  },
  {
    "path": "lib/src/exception/unauthenticated.dart",
    "chars": 235,
    "preview": "import 'dart:io';\n\nimport 'base_http_exception.dart';\n\nclass Unauthenticated extends BaseHttpResponseException {\n  Unaut"
  },
  {
    "path": "lib/src/exception/unauthorized_exception.dart",
    "chars": 174,
    "preview": "import 'base_http_exception.dart';\n\nclass UnauthorizedException extends BaseHttpResponseException {\n  UnauthorizedExcept"
  },
  {
    "path": "lib/src/exception/validation_exception.dart",
    "chars": 226,
    "preview": "import 'dart:io';\n\nimport 'base_http_exception.dart';\n\nclass ValidationException extends BaseHttpResponseException {\n  V"
  },
  {
    "path": "lib/src/extensions/date_time_extension.dart",
    "chars": 1811,
    "preview": "extension DateTimeExtension on DateTime {\n  /// Converts a DateTime object to a string formatted according to AWS dateti"
  },
  {
    "path": "lib/src/extensions/extensions.dart",
    "chars": 203,
    "preview": "export 'date_time_extension.dart';\nexport 'map_extension.dart';\nexport 'number_extension.dart';\nexport 'string_extension"
  },
  {
    "path": "lib/src/extensions/localization_extension.dart",
    "chars": 234,
    "preview": "import 'package:vania/src/localization_handler/localization.dart';\n\nextension LocalizationExtension on String {\n  String"
  },
  {
    "path": "lib/src/extensions/map_extension.dart",
    "chars": 2917,
    "preview": "extension MapExtensions on Map<String, dynamic> {\n  /// Removes a parameter from a nested map structure based on a dot-s"
  },
  {
    "path": "lib/src/extensions/number_extension.dart",
    "chars": 1306,
    "preview": "extension NumberExtension on num {\n  /// Rounds the number to a fixed number of decimal places.\n  ///\n  /// This method "
  },
  {
    "path": "lib/src/extensions/string_extension.dart",
    "chars": 889,
    "preview": "extension StringExtension on String {\n  /// Converts a string to an integer.\n  ///\n  /// Attempts to parse the string as"
  },
  {
    "path": "lib/src/extensions/string_list_extension.dart",
    "chars": 1626,
    "preview": "extension StringListExtension on List<String> {\n  /// Joins a list of strings into a single string with a custom separat"
  },
  {
    "path": "lib/src/http/controller/controller.dart",
    "chars": 52,
    "preview": "abstract class Controller {\n  const Controller();\n}\n"
  },
  {
    "path": "lib/src/http/controller/controller_handler.dart",
    "chars": 4399,
    "preview": "import 'package:vania/src/exception/database_exception.dart';\nimport 'package:vania/src/exception/exception_handler.dart"
  },
  {
    "path": "lib/src/http/middleware/middleware.dart",
    "chars": 208,
    "preview": "import 'dart:io';\n\nimport 'package:vania/src/http/request/request.dart';\n\nabstract class Middleware {\n  Future handle(Re"
  },
  {
    "path": "lib/src/http/middleware/middleware_handler.dart",
    "chars": 265,
    "preview": "import 'package:vania/src/http/request/request.dart';\nimport 'middleware.dart';\n\nFuture<void> middlewareHandler(\n  List<"
  },
  {
    "path": "lib/src/http/middleware/web_socket_middleware_handler.dart",
    "chars": 260,
    "preview": "import 'dart:io';\nimport 'middleware.dart';\n\nFuture<void> webSocketMiddlewareHandler(\n  List<WebSocketMiddleware> middle"
  },
  {
    "path": "lib/src/http/request/request.dart",
    "chars": 12078,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:vania/src/authentication/authentication.dart';\nimport 'package:"
  },
  {
    "path": "lib/src/http/request/request_body.dart",
    "chars": 2011,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:vania/src/http/request/request_form_"
  },
  {
    "path": "lib/src/http/request/request_file.dart",
    "chars": 2396,
    "preview": "import 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:mime/mime.dart';\nimport 'package:vania/src/storage/storage."
  },
  {
    "path": "lib/src/http/request/request_form_data.dart",
    "chars": 2575,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:mime/mime.dart';\n\nimport 'request_file.dart';\n\n/// Handles ext"
  },
  {
    "path": "lib/src/http/request/request_handler.dart",
    "chars": 7367,
    "preview": "import 'dart:io';\nimport 'package:vania/src/exception/database_exception.dart';\nimport 'package:vania/src/exception/exce"
  },
  {
    "path": "lib/src/http/response/response.dart",
    "chars": 6078,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\nimport 'package:meta/meta.dart';\nimport 'package:vani"
  },
  {
    "path": "lib/src/http/response/stream_file.dart",
    "chars": 982,
    "preview": "import 'dart:io';\nimport 'dart:typed_data';\nimport 'package:path/path.dart' as path;\nimport 'package:mime/mime.dart';\n\nc"
  },
  {
    "path": "lib/src/http/session/session_file_store.dart",
    "chars": 5492,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:crypto/crypto.dart';\n\nimport '../../cryptographic/vania_encrypt"
  },
  {
    "path": "lib/src/http/session/session_manager.dart",
    "chars": 8918,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:crypto/crypto.dart';\nimport 'package:vania/src/utils/functions."
  },
  {
    "path": "lib/src/http/validation/custom_validation_rule.dart",
    "chars": 263,
    "preview": "class CustomValidationRule {\n  final String ruleName;\n  final String message;\n  final Future<bool> Function(Map<String, "
  },
  {
    "path": "lib/src/http/validation/field_validation.dart",
    "chars": 7472,
    "preview": "class FieldValidation {\n  final String fieldName;\n  final List<String> _rules = [];\n  final Map<String, String> _message"
  },
  {
    "path": "lib/src/http/validation/nested_validation.dart",
    "chars": 1921,
    "preview": "import 'package:vania/src/extensions/map_extension.dart';\n\nimport 'validation_item.dart';\n\nclass NestedValidation {\n  fi"
  },
  {
    "path": "lib/src/http/validation/rules.dart",
    "chars": 10083,
    "preview": "import 'package:vania/src/database/db.dart';\nimport 'package:vania/src/http/request/request_file.dart';\n\nclass Rules {\n "
  },
  {
    "path": "lib/src/http/validation/validation_chain/export_chain_validation.dart",
    "chars": 1059,
    "preview": "export 'rules/between.dart';\nexport 'rules/confirmed.dart';\nexport 'rules/end_width.dart';\nexport 'rules/greater_than.da"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/between.dart",
    "chars": 577,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass Between extends ValidationRule "
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/confirmed.dart",
    "chars": 403,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass Confirmed extends ValidationRul"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/end_width.dart",
    "chars": 402,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass EndWith extends ValidationRule "
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/greater_than.dart",
    "chars": 1266,
    "preview": "import 'dart:convert';\n\nimport 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass Greater"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/in_array.dart",
    "chars": 426,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass InArray<T> extends ValidationRu"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_alpha.dart",
    "chars": 438,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_alpha_dash.dart",
    "chars": 449,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_alpha_numeric.dart",
    "chars": 461,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_array.dart",
    "chars": 333,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsArray extends ValidationRule "
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_boolean.dart",
    "chars": 338,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsBoolean extends ValidationRul"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_date.dart",
    "chars": 427,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsDate extends ValidationRule {"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_double.dart",
    "chars": 420,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsDouble extends ValidationRule"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_email.dart",
    "chars": 443,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_file.dart",
    "chars": 847,
    "preview": "import 'package:vania/src/http/request/request_file.dart';\nimport 'package:vania/src/http/validation/validation_chain/va"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_image.dart",
    "chars": 777,
    "preview": "import 'package:vania/src/http/request/request_file.dart';\nimport 'package:vania/src/http/validation/validation_chain/ex"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_integer.dart",
    "chars": 421,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsInteger extends ValidationRul"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_ip.dart",
    "chars": 414,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_json.dart",
    "chars": 328,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsJson extends ValidationRule {"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_numeric.dart",
    "chars": 419,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsNumeric extends ValidationRul"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_required.dart",
    "chars": 373,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsRequired extends ValidationRu"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_string.dart",
    "chars": 354,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsString extends ValidationRule"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_url.dart",
    "chars": 463,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass IsURL extends ValidationRule {\n"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/is_uuid.dart",
    "chars": 415,
    "preview": "import 'package:vania/src/config/defined_regexp.dart';\nimport 'package:vania/src/http/validation/validation_chain/valida"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/lenght_between.dart",
    "chars": 582,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass LengthBetween extends Validatio"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/less_than.dart",
    "chars": 449,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass LessThan extends ValidationRule"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/max.dart",
    "chars": 458,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass Max extends ValidationRule {\n  "
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/max_lenght.dart",
    "chars": 471,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass MaxLength extends ValidationRul"
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/min.dart",
    "chars": 456,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass Min extends ValidationRule {\n  "
  },
  {
    "path": "lib/src/http/validation/validation_chain/rules/min_lenght.dart",
    "chars": 468,
    "preview": "import 'package:vania/src/http/validation/validation_chain/validation_rule.dart';\n\nclass MinLength extends ValidationRul"
  }
]

// ... and 80 more files (download for full content)

About this extraction

This page contains the full source code of the vania-dart/framework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 280 files (599.6 KB), approximately 157.8k tokens, and a symbol index with 1679 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!