diff --git a/.docker/nginx.conf b/.docker/nginx.conf index 05516e318b..08e7b64603 100644 --- a/.docker/nginx.conf +++ b/.docker/nginx.conf @@ -10,7 +10,10 @@ upstream php-pimcore11 { server { listen [::]:80 default_server; listen 80 default_server; - + + fastcgi_buffer_size 128k; + fastcgi_buffers 8 256k; + fastcgi_busy_buffers_size 256k; #server_name pimcore.localhost; root /var/www/html/public; @@ -50,6 +53,21 @@ server { # return 403; # } + # Mercure Hub Proxy für SSE (Server-Sent Events) + # /hub/.well-known/mercure -> http://mercure/.well-known/mercure + location /hub/ { + rewrite ^/hub/(.*)$ /$1 break; + proxy_pass http://mercure; + proxy_read_timeout 24h; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_buffering off; + proxy_cache off; + } + # Pimcore Head-Link Cache-Busting rewrite ^/cache-buster-(?:\d+)/(.*) /$1 last; diff --git a/.github/workflows/behat.yml b/.github/workflows/behat.yml index 78f0c8f272..9c8cf23942 100644 --- a/.github/workflows/behat.yml +++ b/.github/workflows/behat.yml @@ -9,7 +9,7 @@ on: - '*.php' - 'src/**' - '.github/workflows/behat.yml' - pull_request: + pull_request_target: branches: [ '5.0', 'next' ] paths: - 'composer.json' @@ -70,6 +70,17 @@ jobs: ports: - 3306:3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + opensearch: + image: "opensearchproject/opensearch:2.11.1" + env: + discovery.type: single-node + plugins.security.disabled: "true" + OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m" + action.auto_create_index: "false" + ports: + - 9200:9200 + name: "${{ matrix.pimcore }}, PHP ${{ matrix.php }}, Deps ${{ matrix.dependencies }}" steps: @@ -126,9 +137,32 @@ jobs: - name: Assets Install run: bin/console assets:install --symlink + - name: Configure OpenSearch Client + run: | + mkdir -p config/local + cat > config/local/opensearch.yaml << 'EOF' + pimcore_open_search_client: + clients: + default: + hosts: ['http://127.0.0.1:9200'] + ssl_verification: false + EOF + - name: Install Pimcore run: PIMCORE_KERNEL_CLASS=Kernel vendor/bin/pimcore-install --env=test --skip-database-config + - name: Install Pimcore Bundles + run: | + bin/console pimcore:bundle:install --no-post-change-commands PimcoreApplicationLoggerBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreCustomReportsBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreGenericDataIndexBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreGenericExecutionEngineBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreSimpleBackendSearchBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreStudioBackendBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreStudioUiBundle + bin/console pimcore:deployment:classes-rebuild --force --create-classes + bin/console generic-data-index:update:index -r + - name: Install CoreShop run: | bin/console coreshop:install diff --git a/.github/workflows/behat_ui.yml b/.github/workflows/behat_ui.yml index d973cdf0f9..928775ce78 100644 --- a/.github/workflows/behat_ui.yml +++ b/.github/workflows/behat_ui.yml @@ -9,7 +9,7 @@ on: - '*.php' - 'src/**' - '.github/workflows/behat_ui.yml' - pull_request: + pull_request_target: branches: [ '5.0', 'next' ] paths: - 'composer.json' @@ -71,6 +71,17 @@ jobs: ports: - 3306:3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + opensearch: + image: "opensearchproject/opensearch:2.11.1" + env: + discovery.type: single-node + plugins.security.disabled: "true" + OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m" + action.auto_create_index: "false" + ports: + - 9200:9200 + name: "${{ matrix.pimcore }}, PHP ${{ matrix.php }}, Deps ${{ matrix.dependencies }}" steps: @@ -132,9 +143,32 @@ jobs: - name: Assets Install run: bin/console assets:install --symlink + - name: Configure OpenSearch Client + run: | + mkdir -p config/local + cat > config/local/opensearch.yaml << 'EOF' + pimcore_open_search_client: + clients: + default: + hosts: ['http://127.0.0.1:9200'] + ssl_verification: false + EOF + - name: Install Pimcore run: PIMCORE_KERNEL_CLASS=Kernel vendor/bin/pimcore-install --env=test --skip-database-config + - name: Install Pimcore Bundles + run: | + bin/console pimcore:bundle:install --no-post-change-commands PimcoreApplicationLoggerBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreCustomReportsBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreGenericDataIndexBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreGenericExecutionEngineBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreSimpleBackendSearchBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreStudioBackendBundle + bin/console pimcore:bundle:install --no-post-change-commands PimcoreStudioUiBundle + bin/console pimcore:deployment:classes-rebuild --force --create-classes + bin/console generic-data-index:update:index -r + - name: Install CoreShop run: | bin/console coreshop:install diff --git a/.github/workflows/codestyles.yml b/.github/workflows/codestyles.yml index 32bd4eb005..08811b56c4 100644 --- a/.github/workflows/codestyles.yml +++ b/.github/workflows/codestyles.yml @@ -37,7 +37,7 @@ jobs: uses: peter-evans/create-pull-request@v4 with: commit-message: '[CS] Refactor' - author: CoreShop + author: CoreShop title: '[CS] Refactor' body: | This PR has been generated automatically to fix code-styles diff --git a/.github/workflows/frontend-build.yaml b/.github/workflows/frontend-build.yaml new file mode 100644 index 0000000000..e54f247f09 --- /dev/null +++ b/.github/workflows/frontend-build.yaml @@ -0,0 +1,52 @@ +name: CoreShop Studio Frontend Build + +on: + push: + branches: [ '4.0', '4.1', '5.0', 'next', 'studiov2' ] + pull_request_target: + branches: [ '4.0', '4.1', '5.0', 'next', 'studiov2' ] + +jobs: + frontend-build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + + - name: Cache Rsbuild build cache + uses: actions/cache@v4 + with: + path: node_modules/.cache/rsbuild + key: rsbuild-${{ hashFiles('package-lock.json') }}-${{ github.sha }} + restore-keys: | + rsbuild-${{ hashFiles('package-lock.json') }}- + + - name: Install dependencies + run: npm ci + + - name: Type check + run: npm run check-types + + - name: Build changed bundles + if: github.event_name == 'pull_request' + run: npm run build -- --changed-only + + - name: Build all bundles + if: github.event_name == 'push' + run: npm run build + + - name: Commit built assets + if: github.event_name == 'push' + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "🚀 Build CoreShop Studio bundles [skip ci]" + file_pattern: "src/CoreShop/Bundle/*/Resources/public/studio/*/**" diff --git a/.github/workflows/packages_bundles.yml b/.github/workflows/packages_bundles.yml index 2dbdc85021..319d048c14 100644 --- a/.github/workflows/packages_bundles.yml +++ b/.github/workflows/packages_bundles.yml @@ -53,7 +53,7 @@ jobs: test-packages: needs: list runs-on: ubuntu-latest - name: "${{ matrix.package }}, PHP ${{ matrix.php }}, Pimcore ${{ matrix.pimcore }}" + name: "${{ matrix.package }}, PHP ${{ matrix.php }}, Pimcore ${{ matrix.pimcore }}, Deps ${{ matrix.dependencies }}" strategy: fail-fast: false matrix: diff --git a/.github/workflows/packages_components.yml b/.github/workflows/packages_components.yml index 868a9b2602..096055657a 100644 --- a/.github/workflows/packages_components.yml +++ b/.github/workflows/packages_components.yml @@ -54,7 +54,7 @@ jobs: needs: list if: github.repository == 'coreshop/CoreShop' runs-on: ubuntu-latest - name: "${{ matrix.package }}, PHP ${{ matrix.php }}, Pimcore ${{ matrix.pimcore }}" + name: "${{ matrix.package }}, PHP ${{ matrix.php }}, Pimcore ${{ matrix.pimcore }}, Deps ${{ matrix.dependencies }}" strategy: fail-fast: false matrix: diff --git a/.gitignore b/.gitignore index 08ee7386c6..52542222b9 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,8 @@ docs/.docusaurus node_modules cache/ docker-compose.override.yaml +settings.local.json +.rsbuild + +# CoreShop Studio Build Output +src/CoreShop/Bundle/*/Resources/public/studio/*/ \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..e1a559be3e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,271 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +CoreShop is a Symfony-based Pimcore eCommerce platform built with a modular bundle/component architecture. The codebase follows Domain-Driven Design principles and is structured as a monorepo containing multiple related packages. + +## Commands + +### Development Commands + +```bash +# Validate code syntax and configuration +bin/console lint:yaml src +bin/console lint:twig src +bin/console lint:container +bin/console doctrine:schema:validate --skip-sync + +# Static Analysis +vendor/bin/phpstan # PHPStan analysis (level 3) +vendor/bin/psalm # Psalm static analysis + +# Code Style +vendor/bin/ecs # Easy Coding Standard +vendor/bin/ecs --fix # Fix coding standard issues + +# Testing +vendor/bin/behat # Run Behat tests +vendor/bin/behat --profile=default # Run specific Behat profile + +# Validation +composer validate # Validate composer.json +``` + +### Database & Cache +```bash +bin/console cache:clear --env=dev +bin/console doctrine:migrations:migrate +bin/console pimcore:install +``` + +## Pricing + +CoreShop stores all monetary values as **integers** (cents). For example, `383.12 EUR` is stored as `38312`. The `decimal_factor` is configurable (default `100`). + +**Frontend formatting:** Use `formatCurrency(amount, currencyCode)` from `@coreshop/pimcore/src/utils`. It divides by 100 and uses `Intl.NumberFormat` for localized output (e.g. `formatCurrency(38312, 'EUR')` → `"383,12 €"`). + +**Frontend conversion hook:** `useCurrencyConfig()` from `CurrencyBundle` provides `toDisplayPrice(int)` and `toIntegerPrice(display)` for form inputs. + +## Architecture + +### CRITICAL: Documentation Requirements +**Every code change must update documentation!** +- When adding/modifying React components -> Update Studio docs in `docs/03_Development/14_Studio/` +- When creating new features -> Document architecture, API, and usage + +### CRITICAL: Bundle Dependencies +**No bundle has a dependency to CoreBundle!** +- Individual bundles (ProductBundle, OrderBundle, etc.) MUST NOT import from CoreBundle +- Bundles are independent with cross-bundle dependencies (check composer.json) +- CoreBundle acts as a glue layer, not as a shared dependency layer + +### Bundle-Component Pattern +- **Components** (`src/CoreShop/Component/`): Domain logic, business rules, interfaces +- **Bundles** (`src/CoreShop/Bundle/`): Symfony integration, DI configuration, controllers + +### Core Architecture Layers + +#### Components (Business Logic) +`Core/`, `Product/`, `Order/`, `Customer/`, `Payment/`, `Shipping/`, `Index/`, `Currency/`, `Address/`, `Store/`, `Taxation/`, `Rule/` + +#### Bundles (Symfony Integration) +`CoreBundle/`, `FrontendBundle/`, `ResourceBundle/`, and corresponding bundles for each Component + +### Key Design Patterns +- **Factory Pattern**, **Specification Pattern**, **Event-Driven Architecture**, **Repository Pattern**, **State Machine** + +## Configuration + +- `.env` / `.env.local`: Environment configuration +- `config/`: Symfony configuration +- `phpstan.neon`, `psalm.xml`, `ecs.php`, `behat.yml.dist` + +## Localization + +Translation files: `src/CoreShop/Bundle/{BundleName}/Resources/translations/studio.*.yaml` +Use `studio.en.yml` as the source of truth for English keys. + +### CRITICAL: Always Add Translations +**Every UI-facing string must have a translation key!** +- When adding new form fields, labels, buttons, messages, or any user-visible text → add translation keys to `studio.en.yaml` in the corresponding bundle +- Never hardcode user-visible strings — always use translation keys (e.g., `t('coreshop_...')` in React, `'label' => 'coreshop_...'` in FormTypes) +- Check that all translation keys used in code actually exist in the YAML files + +## Development Workflow + +- PHP 8.3+, PSR-12 via ECS, PHPStan level 3 +- Pimcore ^12.0, Symfony 6.3+ or 7.0+ +- Branch strategy: `4.0`, `4.1`, `5.0`, `next` — PRs target `master` + +### Before Committing +```bash +composer validate +bin/console lint:yaml src +bin/console lint:twig src +bin/console lint:container +bin/console doctrine:schema:validate --skip-sync +vendor/bin/phpstan +vendor/bin/psalm +vendor/bin/ecs +``` + +## Pimcore Studio v2 Architecture (React/TypeScript) + +The admin UI uses Pimcore Studio v2 (React/TypeScript). All new UI work uses Studio v2. + +### Bundle Registry Ownership (Rule Engine) + +Each Rule Engine has **separate ConditionRegistry and ActionRegistry instances**. RuleBundle provides generic registry classes; each bundle creates its own instances and registers only what it knows about. CoreBundle acts as glue, retrieving registries from other bundles and registering shared conditions/actions. + +**Pattern:** +```typescript +// Bundle creates own registries in main.ts +container.bind(serviceIds.conditionRegistry).to(ConditionRegistry).inSingletonScope() +container.bind(serviceIds.actionRegistry).to(ActionRegistry).inSingletonScope() + +// CoreBundle extends all registries with shared components +const productRegistry = container.get(productServiceIds.conditionRegistry) +productRegistry.register('categories', CategoriesCondition) +``` + +When uncertain which bundle should register a component, check `composer.json` dependencies. If the target bundle doesn't depend on the required bundle, CoreBundle must register it. + +### Studio v2 File Structure +``` +BundleX/Resources/assets/pimcore-studio/src/ +├── modules/ +│ ├── rule-type/ # conditions/ and actions/ +│ └── icon-library/ +├── dynamic-types/ # Pimcore Data Object field types +└── main.ts # Registry creation + registration +``` + +### Select Components - Module-Level Caching + +**All Select components MUST use module-level caching** to prevent duplicate API calls when multiple instances render. Key pattern: + +```typescript +let cachedOptions: Array<{ value: number, label: string }> | null = null +let loadPromise: Promise<...> | null = null + +const loadData = async () => { + if (cachedOptions) return cachedOptions + if (loadPromise) return loadPromise // share in-flight request + loadPromise = (async () => { + const items = await api.list() + cachedOptions = items.map(i => ({ value: i.id!, label: i.name ?? `#${i.id}` })) + return cachedOptions + })() + return loadPromise +} + +export const clearCache = () => { cachedOptions = null; loadPromise = null } +``` + +Use EntityApi `.list()` method, NOT raw `fetch()`. Initialize state from cache: `useState(cachedOptions || [])`. + +## Extension System + +7 extension types for customizing entities, all imported from `@coreshop/resource/src/entities`: + +| Type | Service ID | Purpose | +|------|-----------|---------| +| Form Extensions | `entityFormExtensionsServiceId` | Add fields to entity forms | +| Table Column Extensions | `entityTableColumnExtensionsServiceId` | Add columns to nested tables | +| Save Decorators | `entitySaveDecoratorsServiceId` | Transform save payloads | +| Tab Extensions | `entityTabExtensionsServiceId` | Add tabs to entity detail views | +| Action Extensions | `entityActionExtensionsServiceId` | Add toolbar/context-menu/footer buttons | +| Validation Extensions | `entityValidationExtensionsServiceId` | Custom validation before save | +| Lifecycle Hooks | `entityLifecycleHooksServiceId` | beforeLoad/afterLoad/beforeSave/afterSave/beforeDelete/afterDelete | + +**Slot naming:** `{bundle}.{resource}.{component}` (e.g., `coreshop.address.country.form`) + +Register extensions in AbstractModule's `onInit()`, then register module in bundle's `main.ts` via `onStartup({ moduleSystem })`. + +See `CoreBundle/Resources/assets/pimcore-studio/src/modules/extension/comprehensive-example/index.tsx` for a complete example. + +### Extension Slot Reference + +Forms: `coreshop.address.country.form`, `coreshop.address.state.form`, `coreshop.address.zone.form`, `coreshop.taxation.tax_rate.form`, `coreshop.taxation.tax_rule_group.form`, `coreshop.currency.currency.form` + +Entity keys (save, validation, lifecycle, tabs, actions): `coreshop.address.country`, `coreshop.address.state`, `coreshop.address.zone`, `coreshop.taxation.tax_rate`, `coreshop.taxation.tax_rule_group`, `coreshop.currency.currency` + +## Dynamic Types for Pimcore Data Objects + +Custom field types registered in each bundle's `main.ts` `onInit()`. ID must match the PHP CoreExtension type name. Options come from the backend. + +```typescript +export class DynamicTypeObjectDataCoreShopCountry extends DynamicTypeObjectDataAbstractSelect { + readonly id = 'coreShopCountry' + readonly dynamicTypeFieldFilterType = new DynamicTypeFieldFilterMultiselect() +} +``` + +### Dynamic Types List + +| Type | Bundle | Type | Bundle | +|------|--------|------|--------| +| `coreShopCountry` | AddressBundle | `coreShopCurrency` | CurrencyBundle | +| `coreShopCountryMultiselect` | AddressBundle | `coreShopCurrencyMultiselect` | CurrencyBundle | +| `coreShopState` | AddressBundle | `coreShopStore` | StoreBundle | +| `coreShopAddressIdentifier` | AddressBundle | `coreShopStoreMultiselect` | StoreBundle | +| `coreShopCarrier` | ShippingBundle | `coreShopPaymentProvider` | PaymentBundle | +| `coreShopCarrierMultiselect` | ShippingBundle | `coreShopPaymentProviderMultiselect` | PaymentBundle | +| `coreShopTaxRate` | TaxationBundle | `coreShopCartPriceRule` | OrderBundle | +| `coreShopTaxRuleGroup` | TaxationBundle | `coreShopFilter` | IndexBundle | +| `coreShopProductUnit` | ProductBundle | `coreShopProductUnitDefinition` | ProductBundle | +| `coreShopProductUnitDefinitions` | ProductBundle | | | + +Complex types: `coreShopMoney` (MoneyBundle), `coreShopMoneyCurrency` (CurrencyBundle), `coreShopStoreValues` (CoreBundle), `coreShopRelation`/`coreShopRelations` (ResourceBundle), `coreShopProductSpecificPriceRules` (ProductBundle), `coreShopProductQuantityPriceRules` (ProductQuantityPriceRulesBundle) + +## StudioFormBundle - Schema-Driven Form System + +**This is the primary way to build forms.** Generates React forms from Symfony FormTypes via JSON schema. + +``` +Symfony FormType -> FormSchemaGenerator -> JSON Schema -> FormSchemaAdapter -> FormBuilder -> DynamicForm (React) +``` + +### Backend + +- `FormSchemaGenerator`: Converts FormView to JSON schema +- `FormSchemaEnricherInterface`: Extension point for adding tabs/sections/hiding fields (tag: `coreshop_studio_form.enricher`) +- `BlockPrefixFormTypeRegistry`: Maps block prefixes to form type classes (tag: `coreshop.studio_form`) +- API: `GET /pimcore-studio/api/coreshop-studio-form/schema/{blockPrefix}` + +### Frontend + +**Usage (preferred approach for all entity forms):** +```typescript +import { SchemaForm } from '@coreshop/studio-form' + +// Simple: auto-generates form from Symfony FormType + + +// With decorators: +const { builder, loading } = useFormSchema('coreshop_country', [ + { name: 'hide-field', decorator: removeFieldDecorator('internalCode') }, +]) +``` + +**Widget resolution:** Block prefixes resolved right-to-left (most specific first), matching Symfony's Twig block resolution. + +**Default widgets:** `text`->Input, `textarea`->Input.TextArea, `integer`->InputNumber, `checkbox`->Switch, `choice`->Select/Radio/Checkbox, `date`->DatePicker, `collection`->CollectionWidget, `grid_collection`->GridCollectionWidget. Custom widgets via `WidgetRegistry.register(blockPrefix, resolver)`. + +**Available decorators** (from `@coreshop/studio-form/src/form-builder/decorators/`): +`addFieldDecorator`, `removeFieldDecorator`, `transformFieldDecorator`, `addSectionDecorator`, `sectionSortingDecorator`, `sectionFilterDecorator`, `hiddenFieldsDecorator`, `readonlyDecorator`, `addValidationDecorator`, `requiredFieldDecorator`, `conditionalFieldsDecorator`, `groupFieldsDecorator` + +### Bundle Integration + +```yaml +services: + MyFormType: + tags: [{ name: form.type }, { name: coreshop.studio_form }] + MySchemaEnricher: + tags: [{ name: coreshop_studio_form.enricher, priority: 10 }] +``` + +## Knowledge Graph +Use the knowledge-graph-mcp before and after every task you do. \ No newline at end of file diff --git a/README.md b/README.md index 6d055f0dcc..2efb16541e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,23 @@ transcends ordinary transactions. - [Documentation](https://docs.coreshop.com/latest) - [Pimcore Github](https://github.com/pimcore/pimcore) +# Pimcore Studio UI + +CoreShop 5.0 ships with a fully rewritten admin interface built on **Pimcore Studio v2** (React/TypeScript). Each CoreShop bundle provides its own Studio plugin using Module Federation, allowing independent development and deployment. + +```bash +# Install frontend dependencies +npm ci + +# Build all Studio plugins +npm run build + +# Start dev server for a single bundle +npm run dev -- ResourceBundle +``` + +The build system auto-discovers all bundles with Studio assets under `src/CoreShop/Bundle/*/Resources/assets/pimcore-studio/` and builds them in parallel. + # Requirements - Pimcore `^12.3` diff --git a/composer.json b/composer.json index d5cb6e92d9..13c06d25b2 100644 --- a/composer.json +++ b/composer.json @@ -26,63 +26,64 @@ } ], "replace": { - "coreshop/resource": "self.version", "coreshop/address": "self.version", - "coreshop/configuration": "self.version", - "coreshop/currency": "self.version", - "coreshop/customer": "self.version", - "coreshop/index": "self.version", - "coreshop/locale": "self.version", - "coreshop/notification": "self.version", - "coreshop/order": "self.version", - "coreshop/payment": "self.version", - "coreshop/product": "self.version", - "coreshop/registry": "self.version", - "coreshop/rule": "self.version", - "coreshop/sequence": "self.version", - "coreshop/shipping": "self.version", - "coreshop/store": "self.version", - "coreshop/taxation": "self.version", - "coreshop/core": "self.version", - "coreshop/resource-bundle": "self.version", "coreshop/address-bundle": "self.version", "coreshop/admin-bundle": "self.version", + "coreshop/class-definition-patch-bundle": "self.version", + "coreshop/configuration": "self.version", "coreshop/configuration-bundle": "self.version", + "coreshop/core": "self.version", + "coreshop/core-bundle": "self.version", + "coreshop/currency": "self.version", "coreshop/currency-bundle": "self.version", + "coreshop/customer": "self.version", "coreshop/customer-bundle": "self.version", "coreshop/frontend-bundle": "self.version", + "coreshop/index": "self.version", "coreshop/index-bundle": "self.version", + "coreshop/inventory": "self.version", + "coreshop/inventory-bundle": "self.version", + "coreshop/locale": "self.version", "coreshop/locale-bundle": "self.version", + "coreshop/menu-bundle": "self.version", + "coreshop/messenger-bundle": "self.version", "coreshop/money-bundle": "self.version", + "coreshop/notification": "self.version", "coreshop/notification-bundle": "self.version", + "coreshop/optimistic-entity-lock-bundle": "self.version", + "coreshop/order": "self.version", "coreshop/order-bundle": "self.version", + "coreshop/payment": "self.version", "coreshop/payment-bundle": "self.version", "coreshop/payum-bundle": "self.version", + "coreshop/payum-payment": "self.version", + "coreshop/payum-payment-bundle": "self.version", + "coreshop/pimcore": "self.version", + "coreshop/pimcore-bundle": "self.version", + "coreshop/product": "self.version", "coreshop/product-bundle": "self.version", + "coreshop/registry": "self.version", + "coreshop/resource": "self.version", + "coreshop/resource-bundle": "self.version", + "coreshop/rule": "self.version", "coreshop/rule-bundle": "self.version", + "coreshop/seo": "self.version", + "coreshop/seo-bundle": "self.version", + "coreshop/sequence": "self.version", "coreshop/sequence-bundle": "self.version", + "coreshop/shipping": "self.version", "coreshop/shipping-bundle": "self.version", + "coreshop/storage-list": "self.version", + "coreshop/store": "self.version", "coreshop/store-bundle": "self.version", + "coreshop/studio-form-bundle": "self.version", + "coreshop/taxation": "self.version", "coreshop/taxation-bundle": "self.version", - "coreshop/tracking-bundle": "self.version", - "coreshop/core-bundle": "self.version", - "coreshop/pimcore": "self.version", - "coreshop/storage-list": "self.version", - "coreshop/inventory": "self.version", - "coreshop/inventory-bundle": "self.version", - "coreshop/workflow-bundle": "self.version", - "coreshop/seo": "self.version", - "coreshop/seo-bundle": "self.version", - "coreshop/pimcore-bundle": "self.version", - "coreshop/tracking": "self.version", + "coreshop/test-bundle": "self.version", "coreshop/theme-bundle": "self.version", - "coreshop/menu-bundle": "self.version", - "coreshop/payum-payment": "self.version", - "coreshop/payum-payment-bundle": "self.version", - "coreshop/optimistic-entity-lock-bundle": "self.version", - "coreshop/messenger-bundle": "self.version", - "coreshop/class-definition-patch-bundle": "self.version", - "coreshop/test-bundle": "self.version" + "coreshop/tracking": "self.version", + "coreshop/tracking-bundle": "self.version", + "coreshop/workflow-bundle": "self.version" }, "require": { "php": "^8.3", @@ -94,37 +95,41 @@ "doctrine/orm": "^3.0", "fakerphp/faker": "^1.16", "gedmo/doctrine-extensions": "^3.11", + "jms/serializer": "^3.32", "jms/serializer-bundle": "^5.5", "knplabs/knp-menu-bundle": "^3.7", "payum/payum": "1.7.x-dev", "payum/payum-bundle": "^2.6.2", "php-http/guzzle7-adapter": "^1.0", "php-http/message-factory": "^1.1", - "pimcore/admin-ui-classic-bundle": "^2.0", - "pimcore/google-marketing-bundle": "^2.0", - "pimcore/newsletter-bundle": "^2.0", "pimcore/pimcore": "^12.3", "rinvex/countries": "^9.0", "sebastian/diff": "^4.0 | ^5.0 | ^6.0", "stof/doctrine-extensions-bundle": "^1.14", "sylius/theme-bundle": "^2.2", - "symfony/config": "^6.3 || ^7.4", - "symfony/dotenv": "^6.3 || ^7.0", - "symfony/form": "^6.3 || ^7.0", - "symfony/http-client": "^6.3 || ^7.0", - "symfony/intl": "^6.3 || ^7.0", - "symfony/notifier": "^6.3 || ^7.0", - "symfony/scheduler": "^6.4 || ^7.0", - "symfony/serializer": "^6.3 || ^7.0", - "symfony/twig-bundle": "^6.3 || ^7.0", + "symfony/config": "^6.4.14 || ^7.4", + "symfony/dotenv": "^6.4.14 || ^7.2", + "symfony/form": "^6.4.14 || ^7.2", + "symfony/http-client": "^6.4.14 || ^7.2", + "symfony/intl": "^6.4.14 || ^7.2", + "symfony/notifier": "^6.4.14 || ^7.2", + "symfony/scheduler": "^6.4.14 || ^7.2", + "symfony/serializer": "^6.4.14 || ^7.2", + "symfony/twig-bundle": "^6.4.14 || ^7.2", "symfony/webpack-encore-bundle": "^2.4", "webmozart/assert": "^1.12" }, - "suggest": { - "pimcore/opensearch-client": "Allows to use OpenSearch as your index engine." - }, + "suggest": { + "pimcore/newsletter-bundle": "^2.0 - Enables Pimcore Newsletter document type and field integrations", + "pimcore/opensearch-client": "Allows to use OpenSearch as your index engine.", + "pimcore/elasticsearch-client": "Allows to use ElasticSearch as your index engine.", + "pimcore/generic-data-index-bundle": "^2.0 - Generic Data Index support for Pimcore Studio UI", + "pimcore/studio-ui-bundle": "^1.0 - Modern React-based Studio UI for Pimcore (recommended)", + "pimcore/google-marketing-bundle": "^2.0" + }, "conflict": { - "ezimuel/ringphp": "<1.4" + "ezimuel/ringphp": "<1.4", + "symfony/error-handler": "<6.4.14" }, "require-dev": { "behat/behat": "^3.27", @@ -137,6 +142,7 @@ "friends-of-behat/symfony-extension": "^2.6", "gotenberg/gotenberg-php": "^2.6", "lendable/composer-license-checker": "^1.2", + "php-webdriver/webdriver": "^1.15", "phpstan/phpstan": "^2.1", "phpstan/phpstan-doctrine": "^2.0", "phpstan/phpstan-symfony": "^2.0", @@ -144,11 +150,10 @@ "phpunit/phpunit": "^10.0", "pimcore/opensearch-client": "^2.1", "robertfausk/behat-panther-extension": "^1.2", + "symfony/browser-kit": "^6.4.14 || ^7.2", + "symfony/css-selector": "^6.4.14 || ^7.2", "symfony/panther": "^2.3", - "php-webdriver/webdriver": "^1.15", - "symfony/browser-kit": "^6.3 || ^7.0", - "symfony/runtime": "^6.4 || ^7.0", - "symfony/css-selector": "^6.4 || ^7.0", + "symfony/runtime": "^6.4.14 || ^7.2", "symplify/easy-coding-standard": "^11.1", "vimeo/psalm": "^6.10" }, diff --git a/config/bundles.php b/config/bundles.php index 038f64d864..c6119a4f42 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -7,4 +7,9 @@ Pimcore\Bundle\StaticRoutesBundle\PimcoreStaticRoutesBundle::class => ['all' => true], Pimcore\Bundle\NewsletterBundle\PimcoreNewsletterBundle::class => ['all' => true], Pimcore\Bundle\OpenSearchClientBundle\PimcoreOpenSearchClientBundle::class => ['all' => true], + Pimcore\Bundle\StudioUiBundle\PimcoreStudioUiBundle::class => ['all' => true], + \Pimcore\Bundle\StudioBackendBundle\PimcoreStudioBackendBundle::class => ['all' => true], + Pimcore\Bundle\GenericDataIndexBundle\PimcoreGenericDataIndexBundle::class => ['all' => true], + Pimcore\Bundle\GenericExecutionEngineBundle\PimcoreGenericExecutionEngineBundle::class => ['all' => true], + \Pimcore\Bundle\AdminBundle\PimcoreAdminBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/config.yaml b/config/packages/dev/config.yaml index 4e2684bd09..8b3dac2eae 100755 --- a/config/packages/dev/config.yaml +++ b/config/packages/dev/config.yaml @@ -1,14 +1,17 @@ imports: - { resource: ../../config.yaml } -payum: - gateways: - offline: - factory: concurrency +doctrine: + dbal: + connections: + default: + url: '%pimcore_test.db.dsn%' + host: '' + port: '' + dbname: '' + user: '' + password: '' -services: - payum.concurrency_gateway_factory: - class: Payum\Core\Bridge\Symfony\Builder\GatewayFactoryBuilder - arguments: [ CoreShop\Behat\Service\Payum\Concurrency\ConcurrencyGatewayFactory ] - tags: - - { name: payum.gateway_factory_builder, factory: concurrency } +parameters: + pimcore_test.db.dsn: '%env(PIMCORE_TEST_DB_DSN)%' + env(PIMCORE_TEST_DB_DSN): ~ diff --git a/config/packages/pimcore_studio_backend.yaml b/config/packages/pimcore_studio_backend.yaml new file mode 100644 index 0000000000..70dd455a1d --- /dev/null +++ b/config/packages/pimcore_studio_backend.yaml @@ -0,0 +1,10 @@ +pimcore_studio_backend: + mercure_settings: + # Server-seitig: Docker-internes Netzwerk + hub_url_server: 'http://mercure/.well-known/mercure' + # Client-seitig: Vollständige URL inkl. .well-known/mercure + hub_url_client: 'https://coreshop-5.localhost/hub/.well-known/mercure' + # Muss mit docker-compose.override.yaml übereinstimmen + jwt_key: 'SECRET_MERCURE_KEY_SECRET_MERCURE_KEY' + # Cookie-Pfad muss /hub sein, damit es für alle Mercure-Requests gilt + jwt_cookie_host: 'coreshop-5.localhost' diff --git a/config/packages/security.yaml b/config/packages/security.yaml index f057721291..634e861c30 100755 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -1,5 +1,5 @@ parameters: - coreshop.security.frontend_regex: "^/(?!admin)[^/]*" + coreshop.security.frontend_regex: "^/(?!admin|!pimcore-studio)[^/]*" pimcore: security: @@ -26,6 +26,8 @@ security: # Pimcore Admin Bundle firewall pimcore_admin: '%pimcore_admin_bundle.firewall_settings%' + pimcore_studio: '%pimcore_studio_backend.firewall_settings%' + coreshop_frontend: provider: coreshop_user @@ -61,6 +63,8 @@ security: - { path: ^/asset/webdav, roles: ROLE_PIMCORE_USER } - { path: "%coreshop.security.frontend_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } - { path: "%coreshop.security.frontend_regex%/_partial", role: ROLE_NO_ACCESS } + - { path: ^/pimcore-studio/api/(docs|docs/json|translations)$, roles: PUBLIC_ACCESS } + - { path: ^/pimcore-studio/api, roles: ROLE_PIMCORE_USER } role_hierarchy: # Pimcore admin // DO NOT CHANGE! diff --git a/config/reference.php b/config/reference.php new file mode 100644 index 0000000000..4ca47ba67a --- /dev/null +++ b/config/reference.php @@ -0,0 +1,4808 @@ + [ + * 'App\\' => [ + * 'resource' => '../src/', + * ], + * ], + * ]); + * ``` + * + * @psalm-type ImportsConfig = list + * @psalm-type ParametersConfig = array|Param|null>|Param|null> + * @psalm-type ArgumentsType = list|array + * @psalm-type CallType = array|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool} + * @psalm-type TagsType = list>> // arrays inside the list must have only one element, with the tag name as the key + * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator|ExpressionConfigurator + * @psalm-type DeprecationType = array{package: string, version: string, message?: string} + * @psalm-type DefaultsType = array{ + * public?: bool, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * } + * @psalm-type InstanceofType = array{ + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type DefinitionType = array{ + * class?: string, + * file?: string, + * parent?: string, + * shared?: bool, + * synthetic?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * configurator?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * decorates?: string, + * decoration_inner_name?: string, + * decoration_priority?: int, + * decoration_on_invalid?: 'exception'|'ignore'|null, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * from_callable?: CallbackType, + * } + * @psalm-type AliasType = string|array{ + * alias: string, + * public?: bool, + * deprecated?: DeprecationType, + * } + * @psalm-type PrototypeType = array{ + * resource: string, + * namespace?: string, + * exclude?: string|list, + * parent?: string, + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type StackType = array{ + * stack: list>, + * public?: bool, + * deprecated?: DeprecationType, + * } + * @psalm-type ServicesConfig = array{ + * _defaults?: DefaultsType, + * _instanceof?: InstanceofType, + * ... + * } + * @psalm-type ExtensionType = array + * @psalm-type PimcoreSeoConfig = array{ + * sitemaps?: array{ + * generators?: array, + * }, + * redirects?: array{ + * status_codes?: list, + * auto_create_redirects?: bool|Param, // Auto create redirects on moving documents & changing pretty url, updating Url slugs in Data Objects. // Default: false + * }, + * } + * @psalm-type PimcoreStaticRoutesConfig = array{ + * definitions?: list, + * methods?: list, + * priority?: int|Param, + * creationDate?: int|Param, + * modificationDate?: int|Param, + * }>, + * config_location?: array{ + * staticroutes?: array{ + * write_target?: array{ + * type?: "symfony-config"|"settings-store"|"disabled"|Param, // Default: "symfony-config" + * options?: list, + * }, + * }, + * }, + * } + * @psalm-type PimcoreNewsletterConfig = array{ + * sender?: array{ + * name?: scalar|Param|null, + * email?: scalar|Param|null, + * }, + * return?: array{ + * name?: scalar|Param|null, + * email?: scalar|Param|null, + * }, + * method?: scalar|Param|null, // Default: null + * debug?: array{ + * email_addresses?: scalar|Param|null, // Default: "" + * }, + * use_specific?: bool|Param, // Default: false + * source_adapters?: array, + * default_url_prefix?: scalar|Param|null, // Default: null + * } + * @psalm-type PimcoreOpenSearchClientConfig = array{ + * clients?: array, + * logger_channel?: scalar|Param|null, // Logger channel to be used for opensearch client logs // Default: "pimcore.opensearch.default" + * log_404_errors?: bool|Param, // Enables logging of 404 errors (default: false) // Default: false + * username?: scalar|Param|null, // Username for opensearch authentication // Default: "admin" + * password?: scalar|Param|null, // Password for opensearch authentication // Default: "admin" + * ssl_key?: scalar|Param|null, // Path to private SSL key file (.key) + * ssl_cert?: scalar|Param|null, // Path to PEM formatted SSL cert file (.cert) + * ssl_password?: scalar|Param|null, // If private key and certificate require a password (default: null) + * ssl_verification?: bool|Param, // Enable or disable the SSL verification (default: true) + * aws_region?: scalar|Param|null, // Will set the setSigV4Region() + * aws_service?: scalar|Param|null, // Will set the setSigV4ServicesetSigV4Service() + * aws_key?: scalar|Param|null, // Will set the setSigV4CredentialProvider() key + * aws_secret?: scalar|Param|null, // Will set the setSigV4CredentialProvider() key + * }>, + * } + * @psalm-type PimcoreStudioUiConfig = array{ + * url_path?: scalar|Param|null, // Default: "/pimcore-studio" + * static_resources?: array{ + * css?: list, + * js?: list, + * editmode?: array{ + * css?: list, + * js?: list, + * }, + * }, + * wysiwyg?: array{ + * defaultEditorConfig?: array{ + * document?: mixed, // Default: [] + * dataObject?: mixed, // Default: [] + * }, + * }, + * csp_header?: bool|array{ // Can be used to enable or disable the Content Security Policy headers. + * enabled?: bool|Param, // Default: true + * exclude_paths?: list, + * additional_urls?: array{ + * default-src?: list, + * img-src?: list, + * script-src?: list, + * style-src?: list, + * connect-src?: list, + * font-src?: list, + * media-src?: list, + * frame-src?: list, + * }, + * }, + * } + * @psalm-type PimcoreStudioBackendConfig = array{ + * url_prefix?: scalar|Param|null, // Default: "/pimcore-studio/api" + * open_api_scan_paths?: list, + * api_token?: array{ + * lifetime?: int|Param, // Default: 3600 + * }, + * allowed_hosts_for_cors?: list, + * security_firewall?: mixed, + * asset_default_formats?: array, + * element_recycle_bin_threshold?: int|Param, // Default: 100 + * mercure_settings?: array{ + * hub_url_server?: scalar|Param|null, // The url to the mercure hub for the server.This can also be the docker container name (e.g., http://mercure/.well-known/mercure). If it is not set, default will be set to "http(s):///hub/.well-known/mercure". // Default: null + * hub_url_client?: scalar|Param|null, // The url to the mercure hub for the (frontend) client. If it is not set, the default will be set to "http(s):///hub". It is possible to use "" as a placeholder for the current schema and host if path to mercure should be different. // Default: null + * jwt_key: scalar|Param|null, // The key used to sign the JWT token. Must be longer than 256 bits. // Default: "some-secret-default" + * cookie_lifetime?: int|Param, // Lifetime of the mercure cookie in seconds. Default is one hour. // Default: 3600 + * jwt_cookie_host?: scalar|Param|null, // Domain where to set the Mercure auth cookie, e.g. ".example.com". // Default: null + * jwt_cookie_strictness?: bool|Param, // If true, use SameSite=Strict; if false, use SameSite=None. // Default: true + * }, + * asset_download_settings?: array{ + * size_limit?: int|Param, // The maximum size of all assets together that can be downloaded in bytes. // Default: 5368709120 + * amount_limit?: int|Param, // The maximum amount of assets that can be downloaded at once. // Default: 1000 + * }, + * csv_settings?: array{ + * default_delimiter?: scalar|Param|null, // Default delimiter to be used for csv operations. // Default: ";" + * }, + * grid?: array{ + * asset?: array{ + * predefined_columns?: list, + * }, + * data_object?: array{ + * predefined_columns?: list, + * skip_field_types?: list, + * }, + * }, + * search_grid?: array{ + * asset?: array{ + * predefined_columns?: list, + * }, + * data_object?: array{ + * predefined_columns?: list, + * }, + * }, + * notes?: array{ + * types?: array{ // List all note types for asset, document, and data-object. + * asset?: list, + * document?: list, + * data-object?: list, + * }, + * }, + * asset_metadata_adapter_mapping?: array>, + * data_object_data_adapter_mapping?: array>, + * document_type_adapter_mapping?: array>, + * user?: array{ + * default_key_bindings?: list, + * }, + * open_api_servers?: list, + * widget_types?: list, + * studio_perspectives?: array, + * widgetsRight?: array, + * widgetsBottom?: array, + * expandedLeft?: scalar|Param|null, // The id of the widget that should be expanded on the left side. // Default: null + * expandedRight?: scalar|Param|null, // The id of the widget that should be expanded on the right side. // Default: null + * contextPermissions?: array>, + * }>, + * element_tree_widgets?: array, + * pql?: scalar|Param|null, // Default: null + * contextPermissions?: list, + * }>, + * studio_from_default_email?: scalar|Param|null, // Default: "studio-admin@pimcore.com" + * twig?: array{ // Configure the Twig sandbox policy. + * sandbox_security_policy?: array{ + * tags?: list, + * filters?: list, + * functions?: list, + * }, + * }, + * config_location?: array{ + * element_tree_widgets?: array{ + * write_target?: array{ + * type?: "symfony-config"|"settings-store"|"disabled"|Param, // Default: "symfony-config" + * options?: list, + * }, + * read_target?: array{ + * type?: "symfony-config"|"settings-store"|Param, // Default: null + * options?: list, + * }, + * }, + * studio_perspectives?: array{ + * write_target?: array{ + * type?: "symfony-config"|"settings-store"|"disabled"|Param, // Default: "symfony-config" + * options?: list, + * }, + * read_target?: array{ + * type?: "symfony-config"|"settings-store"|Param, // Default: null + * options?: list, + * }, + * }, + * }, + * } + * @psalm-type PimcoreGenericDataIndexConfig = array{ + * index_service?: array{ + * client_params?: array{ + * client_name?: scalar|Param|null, // Name of search client from to be used. // Default: "default" + * client_type?: "openSearch"|"elasticsearch"|Param, // Type of search client to be used. // Default: "openSearch" + * index_prefix?: scalar|Param|null, // Default: "pimcore_" + * }, + * search_settings?: array{ + * list_page_size?: scalar|Param|null, // Default: 60 + * list_max_filter_options?: scalar|Param|null, // Default: 500 + * max_synchronous_children_rename_limit?: scalar|Param|null, // Maximum number of direct/synchronous children path updates if asset folders get renamed. If more then the given number of children need an path update the process will be done by the asynchronous index update command. This mechanismn is needed to be able to see directly the new paths in the folder navigation. // Default: 500 + * search_analyzer_attributes?: array, + * }, + * index_settings?: mixed, // Default: [] + * queue_settings?: array{ + * worker_count?: scalar|Param|null, // Default: 1 + * min_batch_size?: scalar|Param|null, // Default: 5 + * max_batch_size?: scalar|Param|null, // Default: 400 + * }, + * system_fields_settings?: array{ + * general?: array, + * document?: array, + * data_object?: array, + * asset?: array, + * }, + * }, + * } + * @psalm-type PimcoreGenericExecutionEngineConfig = array{ + * error_handling?: "continue_on_error"|"stop_on_first_error"|Param, // Specifies how errors should be handled for all job run executions. // Default: "continue_on_error" + * execution_context?: list, + * } + * @psalm-type PimcoreAdminConfig = array{ + * gdpr_data_extractor?: array{ + * dataObjects?: array{ // Settings for DataObjects DataProvider + * classes?: list, + * }>, + * }, + * assets?: array{ // Settings for Assets DataProvider + * types?: list, + * }, + * }, + * objects?: array{ + * notes_events?: array{ + * types?: list, + * }, + * }, + * assets?: array{ + * notes_events?: array{ + * types?: list, + * }, + * hide_edit_image?: bool|Param, // Default: false + * disable_tree_preview?: bool|Param, // Default: true + * }, + * documents?: array{ + * notes_events?: array{ + * types?: list, + * }, + * email_search?: list, + * }, + * notifications?: bool|array{ + * enabled?: bool|Param, // Default: true + * check_new_notification?: bool|array{ // Can be used to enable or disable the check of new notifications (url: /admin/notification/find-last-unread). + * enabled?: bool|Param, // Default: true + * interval?: int|Param, // Interval in seconds to check new notifications // Default: 30 + * }, + * }, + * user?: array{ + * default_key_bindings?: list, + * }, + * admin_languages?: list, + * csrf_protection?: array{ + * excluded_routes?: list, + * }, + * admin_csp_header?: bool|array{ // Can be used to enable or disable the Content Security Policy headers. + * enabled?: bool|Param, // Default: true + * exclude_paths?: list, + * additional_urls?: array{ + * default-src?: list, + * img-src?: list, + * script-src?: list, + * style-src?: list, + * connect-src?: list, + * font-src?: list, + * media-src?: list, + * frame-src?: list, + * }, + * }, + * custom_admin_path_identifier?: scalar|Param|null, // Default: null + * custom_admin_route_name?: scalar|Param|null, // Default: "my_custom_admin_entry_point" + * branding?: array{ + * login_screen_invert_colors?: bool|Param, // Default: false + * color_login_screen?: scalar|Param|null, // Default: null + * color_admin_interface?: scalar|Param|null, // Default: null + * color_admin_interface_background?: scalar|Param|null, // Default: null + * login_screen_custom_image?: scalar|Param|null, // Default: "" + * }, + * session?: array{ + * attribute_bags?: array, + * }, + * translations?: array{ + * path?: scalar|Param|null, // Default: null + * }, + * security_firewall?: mixed, + * config_location?: array{ + * admin_system_settings?: array{ + * write_target?: array{ + * type?: "symfony-config"|"settings-store"|"disabled"|Param, // Default: "symfony-config" + * options?: list, + * }, + * read_target?: array{ + * type?: "symfony-config"|"settings-store"|Param, // Default: null + * options?: list, + * }, + * }, + * }, + * } + * @psalm-type PimcoreCustomReportsConfig = array{ + * definitions?: list, + * columnConfiguration?: list, + * pagination?: bool|Param, + * }>, + * adapters?: array, + * config_location?: array{ + * custom_reports?: array{ + * write_target?: array{ + * type?: "symfony-config"|"settings-store"|"disabled"|Param, // Default: "symfony-config" + * options?: list, + * }, + * }, + * }, + * } + * @psalm-type CoreShopMenuConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * } + * @psalm-type JmsSerializerConfig = array{ + * twig_enabled?: scalar|Param|null, // Default: "default" + * profiler?: scalar|Param|null, // Default: true + * enum_support?: scalar|Param|null, // Default: false + * default_value_property_reader_support?: scalar|Param|null, // Default: false + * handlers?: array{ + * datetime?: array{ + * default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP" + * default_deserialization_formats?: list, + * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin" + * cdata?: scalar|Param|null, // Default: true + * }, + * array_collection?: array{ + * initialize_excluded?: bool|Param, // Default: false + * }, + * symfony_uid?: array{ + * default_format?: scalar|Param|null, // Default: "canonical" + * cdata?: scalar|Param|null, // Default: true + * }, + * }, + * subscribers?: array{ + * doctrine_proxy?: array{ + * initialize_excluded?: bool|Param, // Default: false + * initialize_virtual_types?: bool|Param, // Default: false + * }, + * }, + * object_constructors?: array{ + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: true + * fallback_strategy?: "null"|"exception"|"fallback"|Param, // Default: "null" + * }, + * }, + * property_naming?: string|array{ + * id?: scalar|Param|null, + * separator?: scalar|Param|null, // Default: "_" + * lower_case?: bool|Param, // Default: true + * }, + * expression_evaluator?: string|array{ + * id?: scalar|Param|null, // Default: "jms_serializer.expression_evaluator" + * }, + * metadata?: array{ + * warmup?: array{ + * paths?: array{ + * included?: list, + * excluded?: list, + * }, + * }, + * cache?: scalar|Param|null, // Default: "file" + * debug?: bool|Param, // Default: true + * file_cache?: array{ + * dir?: scalar|Param|null, // Default: null + * }, + * include_interfaces?: bool|Param, // Default: false + * auto_detection?: bool|Param, // Default: true + * infer_types_from_doc_block?: bool|Param, // Default: false + * infer_types_from_doctrine_metadata?: bool|Param, // Infers type information from Doctrine metadata if no explicit type has been defined for a property. // Default: true + * directories?: array, + * }, + * visitors?: array{ + * json_serialization?: array{ + * depth?: scalar|Param|null, + * options?: scalar|Param|null, // Default: 1024 + * }, + * json_deserialization?: array{ + * options?: scalar|Param|null, // Default: 0 + * strict?: bool|Param, // Default: false + * }, + * xml_serialization?: array{ + * version?: scalar|Param|null, + * encoding?: scalar|Param|null, + * format_output?: bool|Param, // Default: false + * default_root_name?: scalar|Param|null, + * default_root_ns?: scalar|Param|null, // Default: "" + * }, + * xml_deserialization?: array{ + * doctype_whitelist?: list, + * external_entities?: bool|Param, // Default: false + * options?: scalar|Param|null, // Default: 0 + * }, + * }, + * default_context?: array{ + * serialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * deserialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * }, + * instances?: array, + * default_timezone?: scalar|Param|null, // Default: "Europe/Berlin" + * cdata?: scalar|Param|null, // Default: true + * }, + * array_collection?: array{ + * initialize_excluded?: bool|Param, // Default: false + * }, + * symfony_uid?: array{ + * default_format?: scalar|Param|null, // Default: "canonical" + * cdata?: scalar|Param|null, // Default: true + * }, + * }, + * subscribers?: array{ + * doctrine_proxy?: array{ + * initialize_excluded?: bool|Param, // Default: false + * initialize_virtual_types?: bool|Param, // Default: false + * }, + * }, + * object_constructors?: array{ + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: true + * fallback_strategy?: "null"|"exception"|"fallback"|Param, // Default: "null" + * }, + * }, + * property_naming?: string|array{ + * id?: scalar|Param|null, + * separator?: scalar|Param|null, // Default: "_" + * lower_case?: bool|Param, // Default: true + * }, + * expression_evaluator?: string|array{ + * id?: scalar|Param|null, // Default: "jms_serializer.expression_evaluator" + * }, + * metadata?: array{ + * warmup?: array{ + * paths?: array{ + * included?: list, + * excluded?: list, + * }, + * }, + * cache?: scalar|Param|null, // Default: "file" + * debug?: bool|Param, // Default: true + * file_cache?: array{ + * dir?: scalar|Param|null, // Default: null + * }, + * include_interfaces?: bool|Param, // Default: false + * auto_detection?: bool|Param, // Default: true + * infer_types_from_doc_block?: bool|Param, // Default: false + * infer_types_from_doctrine_metadata?: bool|Param, // Infers type information from Doctrine metadata if no explicit type has been defined for a property. // Default: true + * directories?: array, + * }, + * visitors?: array{ + * json_serialization?: array{ + * depth?: scalar|Param|null, + * options?: scalar|Param|null, // Default: 1024 + * }, + * json_deserialization?: array{ + * options?: scalar|Param|null, // Default: 0 + * strict?: bool|Param, // Default: false + * }, + * xml_serialization?: array{ + * version?: scalar|Param|null, + * encoding?: scalar|Param|null, + * format_output?: bool|Param, // Default: false + * default_root_name?: scalar|Param|null, + * default_root_ns?: scalar|Param|null, // Default: "" + * }, + * xml_deserialization?: array{ + * doctype_whitelist?: list, + * external_entities?: bool|Param, // Default: false + * options?: scalar|Param|null, // Default: 0 + * }, + * }, + * default_context?: array{ + * serialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * deserialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * }, + * }>, + * } + * @psalm-type CoreShopPimcoreConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * } + * @psalm-type CoreShopLocaleConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * } + * @psalm-type CoreShopResourceConfig = array{ + * mapping?: array{ + * paths?: list, + * }, + * resources?: array, + * pimcore?: array, + * classes?: array{ + * model: scalar|Param|null, + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Pimcore\\PimcoreRepository" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * install_file?: scalar|Param|null, + * type?: scalar|Param|null, // Default: "object" + * pimcore_controller?: array, + * }, + * }>, + * translation?: bool|array{ + * enabled?: bool|Param, // Default: true + * locale_provider?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Translation\\Provider\\TranslationLocaleProviderInterface" + * }, + * drivers?: list<"doctrine/orm"|Param>, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * orm_cascade_merge_associations?: array, + * }>, + * } + * @psalm-type CoreShopSeoConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * } + * @psalm-type CoreShopMoneyConfig = array{ + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * } + * @psalm-type CoreShopWorkflowConfig = array{ + * state_machine?: array, + * transitions: array, + * to?: list, + * }>, + * place_colors?: array, + * transition_colors?: array, + * callbacks?: array{ + * guard?: array, + * }>, + * before?: array, + * }>, + * after?: array, + * }>, + * }, + * }>, + * } + * @psalm-type CoreShopMessengerConfig = array{ + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["messenger"] + * }, + * doctrine?: array{ + * table_name?: scalar|Param|null, // Default: null + * connection?: scalar|Param|null, // Default: null + * }, + * } + * @psalm-type CoreShopRuleConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * rule_condition?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Rule\\Model\\Condition" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Rule\\Model\\ConditionInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * }, + * }, + * rule_action?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Rule\\Model\\Action" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Rule\\Model\\ActionInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * } + * @psalm-type CoreShopConfigurationConfig = array{ + * resources?: array{ + * configuration?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Configuration\\Model\\Configuration" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Configuration\\Model\\ConfigurationInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ConfigurationBundle\\Controller\\ConfigurationController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ConfigurationBundle\\Doctrine\\ORM\\ConfigurationRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ConfigurationBundle\\Form\\Type\\ConfigurationType" + * }, + * }, + * }, + * } + * @psalm-type CoreShopOrderConfig = array{ + * allow_order_edit?: bool|Param, // Default: false + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * cart_price_rule?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "cart_price_rule" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\CartPriceRuleController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Doctrine\\ORM\\CartPriceRuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Form\\Type\\CartPriceRuleType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Form\\Type\\CartPriceRuleTranslationType" + * }, + * }, + * }, + * cart_price_rule_voucher_code?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleVoucherCode" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleVoucherCodeInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Doctrine\\ORM\\CartPriceRuleVoucherRepository" + * }, + * }, + * cart_price_rule_voucher_code_customer?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleVoucherCodeCustomer" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\CartPriceRuleVoucherCodeCustomerInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Factory\\CartPriceRuleVoucherCodeCustomerFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Doctrine\\ORM\\CartPriceRuleVoucherCodeCustomerRepository" + * }, + * }, + * }, + * pimcore?: array{ + * order?: array{ + * options?: mixed, + * path?: array{ + * order?: scalar|Param|null, // Default: "orders" + * quote?: scalar|Param|null, // Default: "quotes" + * cart?: scalar|Param|null, // Default: "carts" + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrder" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Pimcore\\Repository\\OrderRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrder.json" + * type?: scalar|Param|null, // Default: "object" + * pimcore_controller?: array{ + * default?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderController" + * creation?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderCreationController" + * edit?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderEditController" + * payment?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderPaymentController" + * comment?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderCommentController" + * customer_creation?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\CustomerCreationController" + * address_creation?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\AddressCreationController" + * }, + * }, + * }, + * order_item?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "items" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrderItem" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Pimcore\\Repository\\OrderItemRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrderItem.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * order_invoice?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "invoices" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrderInvoice" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInvoiceInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Pimcore\\Repository\\OrderInvoiceRepository" + * pimcore_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderInvoiceController" + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrderInvoice.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * order_invoice_item?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "items" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrderInvoiceItem" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInvoiceItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrderInvoiceItem.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * order_shipment?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "shipments" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrderShipment" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderShipmentInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Pimcore\\Repository\\OrderShipmentRepository" + * pimcore_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\OrderBundle\\Controller\\OrderShipmentController" + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrderShipment.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * order_shipment_item?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "items" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopOrderShipmentItem" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderShipmentItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/classes/CoreShopOrderShipmentItem.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * cart_price_rule_item?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\CoreShopProposalCartPriceRuleItem" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\ProposalCartPriceRuleItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/fieldcollections/CoreShopProposalCartPriceRuleItem.json" + * type?: scalar|Param|null, // Default: "fieldcollection" + * }, + * }, + * price_rule_item?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\CoreShopPriceRuleItem" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\PriceRuleItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/fieldcollections/CoreShopPriceRuleItem.json" + * type?: scalar|Param|null, // Default: "fieldcollection" + * }, + * }, + * adjustment?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\CoreShopAdjustment" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\AdjustmentInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/fieldcollections/CoreShopAdjustment.json" + * type?: scalar|Param|null, // Default: "fieldcollection" + * }, + * }, + * order_item_attribute?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\CoreShopOrderItemAttribute" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderItemAttributeInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopOrderBundle/Resources/install/pimcore/fieldcollections/CoreShopOrderItemAttribute.json" + * type?: scalar|Param|null, // Default: "fieldcollection" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["cart_price_rule","order_list","order_detail","order_create","quote_list","quote_detail","quote_create","cart_list","cart_detail","cart_create"] + * install?: array{ + * grid_config?: list, + * }, + * }, + * stack?: array{ + * purchasable?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\PurchasableInterface" + * order?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInterface" + * order_item?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderItemInterface" + * order_invoice?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInvoiceInterface" + * order_invoice_item?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderInvoiceItemInterface" + * order_shipment?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderShipmentInterface" + * order_shipment_item?: scalar|Param|null, // Default: "CoreShop\\Component\\Order\\Model\\OrderShipmentItemInterface" + * }, + * } + * @psalm-type CoreShopCustomerConfig = array{ + * login_identifier?: "email"|"username"|Param, // Default: "email" + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * stack?: array{ + * customer?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CustomerInterface" + * customer_group?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CustomerGroupInterface" + * company?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CompanyInterface" + * }, + * pimcore?: array{ + * company?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "companies" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopCompany" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CompanyInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CustomerBundle\\Pimcore\\Repository\\CompanyRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopCustomerBundle/Resources/install/pimcore/classes/CoreShopCompany.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * customer?: array{ + * options?: mixed, + * path?: array{ + * customer?: scalar|Param|null, // Default: "customers" + * guest?: scalar|Param|null, // Default: "guests" + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopCustomer" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CustomerInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CustomerBundle\\Pimcore\\Repository\\CustomerRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopCustomerBundle/Resources/install/pimcore/classes/CoreShopCustomer.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * customer_group?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "customer_groups" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopCustomerGroup" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Customer\\Model\\CustomerGroupInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopCustomerBundle/Resources/install/pimcore/classes/CoreShopCustomerGroup.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["customer_list","customer_group_list"] + * install?: array{ + * grid_config?: list, + * }, + * }, + * } + * @psalm-type CoreShopUserConfig = array{ + * driver?: scalar|Param|null, // Default: "doctrine/orm" + * stack?: array{ + * user?: scalar|Param|null, // Default: "CoreShop\\Component\\User\\Model\\UserInterface" + * }, + * pimcore?: array{ + * user?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "user" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopUser" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\User\\Model\\UserInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\UserBundle\\Pimcore\\Repository\\UserRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopUserBundle/Resources/install/pimcore/classes/CoreShopUser.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * } + * @psalm-type CoreShopInventoryConfig = array{ + * checker?: scalar|Param|null, // Default: "CoreShop\\Component\\Inventory\\Checker\\AvailabilityChecker" + * } + * @psalm-type CoreShopVariantConfig = array{ + * stack?: array{ + * attribute_group?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\AttributeGroupInterface" + * attribute?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\AttributeInterface" + * variant_aware?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\ProductVariantAwareInterface" + * }, + * pimcore?: array{ + * attribute_group?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopAttributeGroup" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\AttributeGroupInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopVariantBundle/Resources/install/pimcore/classes/CoreShopAttributeGroup.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * attribute_value?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopAttributeValue" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\AttributeValueInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopVariantBundle/Resources/install/pimcore/classes/CoreShopAttributeValue.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * attribute_color?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopAttributeColor" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Variant\\Model\\AttributeColorInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopVariantBundle/Resources/install/pimcore/classes/CoreShopAttributeColor.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * }, + * redirect_to_main_variant?: scalar|Param|null, // Default: true + * } + * @psalm-type CoreShopProductConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * product_price_rule?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "product_price_rule" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductPriceRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductPriceRuleInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Controller\\ProductPriceRuleController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Doctrine\\ORM\\ProductPriceRuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\ProductPriceRuleType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductPriceRuleTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductPriceRuleTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\ProductPriceRuleTranslationType" + * }, + * }, + * }, + * product_specific_price_rule?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductSpecificPriceRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductSpecificPriceRuleInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Doctrine\\ORM\\ProductSpecificPriceRuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\ProductSpecificPriceRuleType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductSpecificPriceRuleTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductSpecificPriceRuleTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\ProductSpecificPriceRuleTranslationType" + * }, + * }, + * }, + * product_unit?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "product_unit" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnit" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Doctrine\\ORM\\ProductUnitRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\Unit\\ProductUnitType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Form\\Type\\Unit\\ProductUnitTranslationType" + * }, + * }, + * }, + * product_unit_definitions?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinitions" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinitionsInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Controller\\ProductUnitDefinitionsController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Doctrine\\ORM\\ProductUnitDefinitionsRepository" + * }, + * }, + * product_unit_definition?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinition" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinitionInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * }, + * }, + * product_unit_definition_price?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinitionPrice" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductUnitDefinitionPriceInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * }, + * }, + * }, + * pimcore?: array{ + * product?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "products" + * slug?: bool|Param, // Default: true + * route?: array{ + * name?: scalar|Param|null, // Default: "coreshop_product_detail" + * id_param?: scalar|Param|null, // Default: "product" + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopProduct" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Pimcore\\Repository\\ProductRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * category?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "categories" + * slug?: bool|Param, // Default: true + * route?: array{ + * name?: scalar|Param|null, // Default: "coreshop_category_list" + * id_param?: scalar|Param|null, // Default: "category" + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopCategory" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\CategoryInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductBundle\\Pimcore\\Repository\\CategoryRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopCategory.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * manufacturer?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "manufacturers" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopManufacturer" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ManufacturerInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopManufacturer.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["product_price_rule","product_unit"] + * }, + * stack?: array{ + * product?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ProductInterface" + * category?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\CategoryInterface" + * manufacturer?: scalar|Param|null, // Default: "CoreShop\\Component\\Product\\Model\\ManufacturerInterface" + * }, + * } + * @psalm-type CoreShopThemeConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * default_resolvers?: array{ + * pimcore_site?: bool|Param, // Default: false + * pimcore_document_property?: bool|Param, // Default: false + * }, + * } + * @psalm-type CoreShopAddressConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * stack?: array{ + * address?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\AddressInterface" + * }, + * resources?: array{ + * country?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "country" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\Country" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\CountryInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Controller\\CountryController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Doctrine\\ORM\\CountryRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\CountryType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\CountryTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\CountryTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\CountryTranslationType" + * }, + * }, + * }, + * zone?: array{ + * permission?: scalar|Param|null, // Default: "zone" + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\Zone" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\ZoneInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\ZoneType" + * }, + * }, + * state?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "state" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\State" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\StateInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\StateType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\StateTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\StateTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\StateTranslationType" + * }, + * }, + * }, + * address_identifier?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "address_identifier" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\AddressIdentifier" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\AddressIdentifierInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Doctrine\\ORM\\AddressIdentifierRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\AddressBundle\\Form\\Type\\AddressIdentifierType" + * }, + * }, + * }, + * pimcore?: array{ + * address?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "addresses" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopAddress" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Address\\Model\\AddressInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopAddressBundle/Resources/install/pimcore/classes/CoreShopAddress.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["country","state","zone"] + * }, + * } + * @psalm-type CoreShopCurrencyConfig = array{ + * money_decimal_factor?: int|Param, // Default: 100 + * money_decimal_precision?: int|Param, // Default: 2 + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * currency?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * permission?: scalar|Param|null, // Default: "currency" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Currency\\Model\\Currency" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Currency\\Model\\CurrencyInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Controller\\CurrencyController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Doctrine\\ORM\\CurrencyRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Form\\Type\\CurrencyType" + * }, + * }, + * exchange_rate?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "exchange_rate" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Currency\\Model\\ExchangeRate" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Currency\\Model\\ExchangeRateInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Controller\\ExchangeRateController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Doctrine\\ORM\\ExchangeRateRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CurrencyBundle\\Form\\Type\\ExchangeRateType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["currency","exchange_rate"] + * }, + * } + * @psalm-type CoreShopTaxationConfig = array{ + * resources?: array{ + * tax_rate?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "tax_rate" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRate" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRateInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Doctrine\\ORM\\TaxRateRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Form\\Type\\TaxRateType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRateTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRateTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Form\\Type\\TaxRateTranslationType" + * }, + * }, + * }, + * tax_rule_group?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "tax_rule_group" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRuleGroup" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRuleGroupInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Controller\\TaxRuleGroupController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Form\\Type\\TaxRuleGroupType" + * }, + * }, + * tax_rule?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxRuleInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Doctrine\\ORM\\TaxRuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\TaxationBundle\\Form\\Type\\TaxRuleType" + * }, + * }, + * }, + * pimcore?: array{ + * tax_item?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\CoreShopTaxItem" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Taxation\\Model\\TaxItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, + * install_file?: scalar|Param|null, // Default: "@CoreShopTaxationBundle/Resources/install/pimcore/fieldcollections/CoreShopTaxItem.json" + * type?: scalar|Param|null, // Default: "fieldcollection" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["tax_rate","tax_rule_group"] + * }, + * } + * @psalm-type CoreShopStoreConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * store?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "store" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Store\\Model\\Store" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Store\\Model\\StoreInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\StoreBundle\\Controller\\StoreController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\StoreBundle\\Doctrine\\ORM\\StoreRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["store"] + * }, + * } + * @psalm-type CoreShopIndexConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * mysql_auto_generate_migrations?: scalar|Param|null, // Default: false + * resources?: array{ + * index?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "index" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\Index" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\IndexInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Controller\\IndexController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Form\\Type\\IndexType" + * }, + * }, + * index_column?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\IndexColumn" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\IndexColumnInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Form\\Type\\IndexColumnType" + * }, + * }, + * filter?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "filter" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\Filter" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\FilterInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Controller\\FilterController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Form\\Type\\FilterType" + * }, + * }, + * filter_condition?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\FilterCondition" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Index\\Model\\FilterConditionInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\IndexBundle\\Form\\Type\\FilterConditionType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["index","filter"] + * }, + * mapping_types?: array, + * worker_mapping_types?: array>, + * } + * @psalm-type CoreShopShippingConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * default_resolver?: scalar|Param|null, + * resources?: array{ + * carrier?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "carrier" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\Carrier" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\CarrierInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Controller\\CarrierController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Form\\Type\\CarrierType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\CarrierTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\CarrierTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Form\\Type\\CarrierTranslationType" + * }, + * }, + * }, + * shipping_rule?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "shipping_rule" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\ShippingRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\ShippingRuleInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Controller\\ShippingRuleController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\RuleBundle\\Doctrine\\ORM\\RuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Form\\Type\\ShippingRuleType" + * }, + * }, + * shipping_rule_group?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\ShippingRuleGroup" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Shipping\\Model\\ShippingRuleGroupInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ShippingBundle\\Form\\Type\\ShippingRuleGroupType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["carrier","shipping_rule"] + * }, + * } + * @psalm-type CoreShopPaymentConfig = array{ + * driver?: scalar|Param|null, // Default: "doctrine/orm" + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * payment_provider?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "payment_provider" + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProvider" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\TranslatableFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Doctrine\\ORM\\PaymentProviderRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Form\\Type\\PaymentProviderType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Form\\Type\\PaymentProviderTranslationType" + * }, + * }, + * }, + * payment?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\Payment" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Doctrine\\ORM\\PaymentRepository" + * }, + * }, + * payment_provider_rule?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "payment_provider_rule" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRuleInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Controller\\PaymentProviderRuleController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\RuleBundle\\Doctrine\\ORM\\RuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Form\\Type\\PaymentProviderRuleType" + * }, + * translation?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRuleTranslation" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRuleTranslationInterface" + * repository?: scalar|Param|null, + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Form\\Type\\PaymentProviderRuleTranslationType" + * }, + * }, + * }, + * payment_provider_rule_group?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRuleGroup" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Payment\\Model\\PaymentProviderRuleGroupInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PaymentBundle\\Form\\Type\\PaymentProviderRuleGroupType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["payment_provider","payment_provider_rule"] + * }, + * } + * @psalm-type CoreShopSequenceConfig = array{ + * resources?: array{ + * sequence?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Sequence\\Model\\Sequence" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Sequence\\Model\\SequenceInterface" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Sequence\\Factory\\SequenceFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\SequenceBundle\\Doctrine\\ORM\\SequenceRepository" + * }, + * }, + * }, + * } + * @psalm-type CoreShopPayumPaymentConfig = array{ + * driver?: scalar|Param|null, // Default: "doctrine/orm" + * resources?: array{ + * gateway_config?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\PayumPayment\\Model\\GatewayConfig" + * controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * }, + * }, + * payment_security_token?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\PayumPayment\\Model\\PaymentSecurityToken" + * controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ResourceBundle\\Controller\\ResourceController" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * }, + * }, + * }, + * } + * @psalm-type CoreShopNotificationConfig = array{ + * resources?: array{ + * notification_rule?: array{ + * options?: mixed, + * permission?: scalar|Param|null, // Default: "notification" + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Notification\\Model\\NotificationRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Notification\\Model\\NotificationRuleInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\NotificationBundle\\Doctrine\\ORM\\NotificationRuleRepository" + * admin_controller?: scalar|Param|null, // Default: "CoreShop\\Bundle\\NotificationBundle\\Controller\\NotificationRuleController" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\NotificationBundle\\Form\\Type\\NotificationRuleType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["notification"] + * }, + * } + * @psalm-type CoreShopTrackingConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * trackers?: array, + * } + * @psalm-type CoreShopFrontendConfig = array{ + * view_suffix?: scalar|Param|null, // Default: "twig" + * view_bundle?: scalar|Param|null, // Deprecated: Use view_prefix instead // Default: "@CoreShopFrontend" + * view_prefix?: scalar|Param|null, // Default: "@CoreShopFrontend" + * category?: array{ + * valid_sort_options?: list, + * default_sort_name?: scalar|Param|null, // Default: "name" + * default_sort_direction?: scalar|Param|null, // Default: "asc" + * }, + * pimcore_admin?: array{ + * install?: array{ + * routes?: list, + * documents?: list, + * image_thumbnails?: list, + * }, + * }, + * controllers?: array{ + * index?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\IndexController" + * register?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\RegisterController" + * customer?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\CustomerController" + * currency?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\CurrencyController" + * search?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\SearchController" + * cart?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\CartController" + * checkout?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\CheckoutController" + * order?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\OrderController" + * category?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\CategoryController" + * product?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\ProductController" + * quote?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\QuoteController" + * security?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\SecurityController" + * payment?: scalar|Param|null, // Default: "CoreShop\\Bundle\\PayumBundle\\Controller\\PaymentController" + * mail?: scalar|Param|null, // Default: "CoreShop\\Bundle\\FrontendBundle\\Controller\\MailController" + * }, + * } + * @psalm-type CoreShopPayumConfig = array{ + * template?: array{ + * layout?: scalar|Param|null, // Default: "@CoreShopPayum/:layout.html.twig" + * obtain_credit_card?: scalar|Param|null, // Default: "@CoreShopPayum/Action/obtainCreditCard.html.twig" + * }, + * } + * @psalm-type CoreShopProductQuantityPriceRulesConfig = array{ + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * action_constraints?: list, + * }>, + * resources?: array{ + * product_quantity_price_rule_range?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\ProductQuantityPriceRules\\Model\\QuantityRange" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\ProductQuantityPriceRules\\Model\\QuantityRangeInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, + * }, + * }, + * product_quantity_price_rule?: array{ + * options?: mixed, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\ProductQuantityPriceRules\\Model\\ProductQuantityPriceRule" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\ProductQuantityPriceRules\\Model\\ProductQuantityPriceRuleInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductQuantityPriceRulesBundle\\Doctrine\\ORM\\ProductQuantityPriceRuleRepository" + * form?: scalar|Param|null, // Default: "CoreShop\\Bundle\\ProductQuantityPriceRulesBundle\\Form\\Type\\ProductQuantityPriceRuleType" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array, + * editmode_js?: array, + * editmode_css?: array, + * permissions?: scalar|Param|null, // Default: ["notification"] + * }, + * } + * @psalm-type CoreShopWishlistConfig = array{ + * pimcore?: array{ + * wishlist?: array{ + * options?: mixed, + * path?: array{ + * wishlist?: scalar|Param|null, // Default: "wishlists" + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopWishlist" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Wishlist\\Model\\WishlistInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\WishlistBundle\\Pimcore\\Repository\\WishlistRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopWishlistBundle/Resources/install/pimcore/classes/CoreShopWishlist.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * wishlist_item?: array{ + * options?: mixed, + * path?: scalar|Param|null, // Default: "items" + * classes?: array{ + * model?: scalar|Param|null, // Default: "Pimcore\\Model\\DataObject\\CoreShopWishlistItem" + * pimcore_class_name?: scalar|Param|null, + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Wishlist\\Model\\WishlistItemInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\PimcoreFactory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\WishlistBundle\\Pimcore\\Repository\\WishlistItemRepository" + * install_file?: scalar|Param|null, // Default: "@CoreShopWishlistBundle/Resources/install/pimcore/classes/CoreShopWishlistItem.json" + * type?: scalar|Param|null, // Default: "object" + * }, + * }, + * }, + * stack?: array{ + * wishlist?: scalar|Param|null, // Default: "CoreShop\\Component\\Wishlist\\Model\\WishlistInterface" + * wishlist_item?: scalar|Param|null, // Default: "CoreShop\\Component\\Wishlist\\Model\\WishlistItemInterface" + * wishlist_product?: scalar|Param|null, // Default: "CoreShop\\Component\\Wishlist\\Model\\WishlistProductInterface" + * }, + * } + * @psalm-type CoreShopClassDefinitionPatchConfig = array{ + * patches?: array, + * parent_class?: scalar|Param|null, + * group?: scalar|Param|null, + * description?: scalar|Param|null, + * listing_parent_class?: scalar|Param|null, + * use_traits?: list, + * listing_use_traits?: list, + * fields?: array, + * }>, + * } + * @psalm-type PayumConfig = array{ + * security: array{ + * token_storage: array, + * propel2?: array, + * }>, + * }, + * dynamic_gateways?: array{ + * sonata_admin?: bool|Param, // Default: false + * config_storage: array, + * propel2?: array, + * }>, + * encryption?: array{ + * defuse_secret_key?: scalar|Param|null, + * }, + * }, + * gateways?: array, + * storages?: array, + * factories?: array, + * }, + * filesystem?: array{ + * storage_dir: scalar|Param|null, + * id_property?: scalar|Param|null, // Default: null + * }, + * doctrine?: string|array{ + * driver: scalar|Param|null, + * }, + * custom?: string|array{ + * service: scalar|Param|null, + * }, + * propel1?: array, + * propel2?: array, + * }>, + * } + * @psalm-type StofDoctrineExtensionsConfig = array{ + * orm?: array, + * mongodb?: array, + * class?: array{ + * translatable?: scalar|Param|null, // Default: "Gedmo\\Translatable\\TranslatableListener" + * timestampable?: scalar|Param|null, // Default: "Gedmo\\Timestampable\\TimestampableListener" + * blameable?: scalar|Param|null, // Default: "Gedmo\\Blameable\\BlameableListener" + * sluggable?: scalar|Param|null, // Default: "Gedmo\\Sluggable\\SluggableListener" + * tree?: scalar|Param|null, // Default: "Gedmo\\Tree\\TreeListener" + * loggable?: scalar|Param|null, // Default: "Gedmo\\Loggable\\LoggableListener" + * sortable?: scalar|Param|null, // Default: "Gedmo\\Sortable\\SortableListener" + * softdeleteable?: scalar|Param|null, // Default: "Gedmo\\SoftDeleteable\\SoftDeleteableListener" + * uploadable?: scalar|Param|null, // Default: "Gedmo\\Uploadable\\UploadableListener" + * reference_integrity?: scalar|Param|null, // Default: "Gedmo\\ReferenceIntegrity\\ReferenceIntegrityListener" + * }, + * softdeleteable?: array{ + * handle_post_flush_event?: bool|Param, // Default: false + * }, + * uploadable?: array{ + * default_file_path?: scalar|Param|null, // Default: null + * mime_type_guesser_class?: scalar|Param|null, // Default: "Stof\\DoctrineExtensionsBundle\\Uploadable\\MimeTypeGuesserAdapter" + * default_file_info_class?: scalar|Param|null, // Default: "Stof\\DoctrineExtensionsBundle\\Uploadable\\UploadedFileInfo" + * validate_writable_directory?: bool|Param, // Default: true + * }, + * default_locale?: scalar|Param|null, // Default: "en" + * translation_fallback?: bool|Param, // Default: false + * persist_default_translation?: bool|Param, // Default: false + * skip_translation_on_load?: bool|Param, // Default: false + * metadata_cache_pool?: scalar|Param|null, // Default: null + * } + * @psalm-type SyliusThemeConfig = array{ + * sources?: array{ + * filesystem?: bool|array{ + * enabled?: bool|Param, // Default: false + * filename?: scalar|Param|null, // Default: "composer.json" + * scan_depth?: scalar|Param|null, // Restrict depth to scan for configuration file inside theme folder // Default: 1 + * directories?: list, + * }, + * test?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * }, + * assets?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * templating?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * translations?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * context?: scalar|Param|null, // Default: "sylius.theme.context.settable" + * legacy_mode?: bool|Param, // Deprecated: "legacy_mode" at path "sylius_theme.legacy_mode" is deprecated since Sylius/ThemeBundle 2.0 and will be removed in 3.0. // Default: false + * } + * @psalm-type PimcoreGoogleMarketingConfig = array{ + * client_id?: scalar|Param|null, // This is required for the Google API integrations. Only use a `Service Account´ from the Google Cloud Console. // Default: null + * email?: scalar|Param|null, // Email address of the Google service account // Default: null + * simple_api_key?: scalar|Param|null, // Server API key // Default: null + * browser_api_key?: scalar|Param|null, // Browser API key // Default: null + * } + * @psalm-type FrameworkConfig = array{ + * secret?: scalar|Param|null, + * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false + * allowed_http_method_override?: list|null, + * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" + * test?: bool|Param, + * default_locale?: scalar|Param|null, // Default: "en" + * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false + * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false + * enabled_locales?: list, + * trusted_hosts?: list, + * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] + * trusted_headers?: list, + * error_controller?: scalar|Param|null, // Default: "error_controller" + * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * }, + * form?: bool|array{ // Form configuration + * enabled?: bool|Param, // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * token_id?: scalar|Param|null, // Default: null + * field_name?: scalar|Param|null, // Default: "_token" + * field_attr?: array, + * }, + * }, + * http_cache?: bool|array{ // HTTP cache configuration + * enabled?: bool|Param, // Default: false + * debug?: bool|Param, // Default: "%kernel.debug%" + * trace_level?: "none"|"short"|"full"|Param, + * trace_header?: scalar|Param|null, + * default_ttl?: int|Param, + * private_headers?: list, + * skip_response_headers?: list, + * allow_reload?: bool|Param, + * allow_revalidate?: bool|Param, + * stale_while_revalidate?: int|Param, + * stale_if_error?: int|Param, + * terminate_on_cache_hit?: bool|Param, + * }, + * esi?: bool|array{ // ESI configuration + * enabled?: bool|Param, // Default: false + * }, + * ssi?: bool|array{ // SSI configuration + * enabled?: bool|Param, // Default: false + * }, + * fragments?: bool|array{ // Fragments configuration + * enabled?: bool|Param, // Default: false + * hinclude_default_template?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Default: "/_fragment" + * }, + * profiler?: bool|array{ // Profiler configuration + * enabled?: bool|Param, // Default: false + * collect?: bool|Param, // Default: true + * collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * only_exceptions?: bool|Param, // Default: false + * only_main_requests?: bool|Param, // Default: false + * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" + * collect_serializer_data?: bool|Param, // Enables the serializer data collector and profiler panel. // Default: false + * }, + * workflows?: bool|array{ + * enabled?: bool|Param, // Default: false + * workflows?: array, + * definition_validators?: list, + * support_strategy?: scalar|Param|null, + * initial_marking?: list, + * events_to_dispatch?: list|null, + * places?: list, + * }>, + * transitions: list, + * to?: list, + * weight?: int|Param, // Default: 1 + * metadata?: list, + * }>, + * metadata?: list, + * }>, + * }, + * router?: bool|array{ // Router configuration + * enabled?: bool|Param, // Default: false + * resource: scalar|Param|null, + * type?: scalar|Param|null, + * cache_dir?: scalar|Param|null, // Deprecated: Setting the "framework.router.cache_dir.cache_dir" configuration option is deprecated. It will be removed in version 8.0. // Default: "%kernel.build_dir%" + * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|Param|null, // Default: 80 + * https_port?: scalar|Param|null, // Default: 443 + * strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * utf8?: bool|Param, // Default: true + * }, + * session?: bool|array{ // Session configuration + * enabled?: bool|Param, // Default: false + * storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native" + * handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|Param|null, + * cookie_lifetime?: scalar|Param|null, + * cookie_path?: scalar|Param|null, + * cookie_domain?: scalar|Param|null, + * cookie_secure?: true|false|"auto"|Param, // Default: "auto" + * cookie_httponly?: bool|Param, // Default: true + * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * use_cookies?: bool|Param, + * gc_divisor?: scalar|Param|null, + * gc_probability?: scalar|Param|null, + * gc_maxlifetime?: scalar|Param|null, + * save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 + * sid_length?: int|Param, // Deprecated: Setting the "framework.session.sid_length.sid_length" configuration option is deprecated. It will be removed in version 8.0. No alternative is provided as PHP 8.4 has deprecated the related option. + * sid_bits_per_character?: int|Param, // Deprecated: Setting the "framework.session.sid_bits_per_character.sid_bits_per_character" configuration option is deprecated. It will be removed in version 8.0. No alternative is provided as PHP 8.4 has deprecated the related option. + * }, + * request?: bool|array{ // Request configuration + * enabled?: bool|Param, // Default: false + * formats?: array>, + * }, + * assets?: bool|array{ // Assets configuration + * enabled?: bool|Param, // Default: true + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, // Default: null + * version_format?: scalar|Param|null, // Default: "%%s?%%s" + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: list, + * packages?: array, + * }>, + * }, + * asset_mapper?: bool|array{ // Asset Mapper configuration + * enabled?: bool|Param, // Default: false + * paths?: array, + * excluded_patterns?: list, + * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true + * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true + * public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" + * extensions?: array, + * importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. + * enabled?: bool|Param, // Default: false + * formats?: list, + * extensions?: list, + * }, + * }, + * translator?: bool|array{ // Translator configuration + * enabled?: bool|Param, // Default: true + * fallbacks?: list, + * logging?: bool|Param, // Default: false + * formatter?: scalar|Param|null, // Default: "translator.formatter.default" + * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, + * pseudo_localization?: bool|array{ + * enabled?: bool|Param, // Default: false + * accents?: bool|Param, // Default: true + * expansion_factor?: float|Param, // Default: 1.0 + * brackets?: bool|Param, // Default: true + * parse_html?: bool|Param, // Default: false + * localizable_html_attributes?: list, + * }, + * providers?: array, + * locales?: list, + * }>, + * globals?: array, + * domain?: string|Param, + * }>, + * }, + * validation?: bool|array{ // Validation configuration + * enabled?: bool|Param, // Default: true + * cache?: scalar|Param|null, // Deprecated: Setting the "framework.validation.cache.cache" configuration option is deprecated. It will be removed in version 8.0. + * enable_attributes?: bool|Param, // Default: true + * static_method?: list, + * translation_domain?: scalar|Param|null, // Default: "validators" + * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|"loose"|Param, // Default: "html5" + * mapping?: array{ + * paths?: list, + * }, + * not_compromised_password?: bool|array{ + * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true + * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * }, + * disable_translation?: bool|Param, // Default: false + * auto_mapping?: array, + * }>, + * }, + * annotations?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * serializer?: bool|array{ // Serializer configuration + * enabled?: bool|Param, // Default: true + * enable_attributes?: bool|Param, // Default: true + * name_converter?: scalar|Param|null, + * circular_reference_handler?: scalar|Param|null, + * max_depth_handler?: scalar|Param|null, + * mapping?: array{ + * paths?: list, + * }, + * default_context?: list, + * named_serializers?: array, + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true + * }>, + * }, + * property_access?: bool|array{ // Property access configuration + * enabled?: bool|Param, // Default: true + * magic_call?: bool|Param, // Default: false + * magic_get?: bool|Param, // Default: true + * magic_set?: bool|Param, // Default: true + * throw_exception_on_invalid_index?: bool|Param, // Default: false + * throw_exception_on_invalid_property_path?: bool|Param, // Default: true + * }, + * type_info?: bool|array{ // Type info configuration + * enabled?: bool|Param, // Default: true + * aliases?: array, + * }, + * property_info?: bool|array{ // Property info configuration + * enabled?: bool|Param, // Default: true + * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. + * }, + * cache?: array{ // Cache configuration + * prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|Param|null, + * default_redis_provider?: scalar|Param|null, // Default: "redis://localhost" + * default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" + * default_pdo_provider?: scalar|Param|null, // Default: null + * pools?: array, + * tags?: scalar|Param|null, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. + * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|Param|null, + * clearer?: scalar|Param|null, + * }>, + * }, + * php_errors?: array{ // PHP errors handling configuration + * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true + * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true + * }, + * exceptions?: array, + * web_link?: bool|array{ // Web links configuration + * enabled?: bool|Param, // Default: true + * }, + * lock?: bool|string|array{ // Lock configuration + * enabled?: bool|Param, // Default: true + * resources?: array>, + * }, + * semaphore?: bool|string|array{ // Semaphore configuration + * enabled?: bool|Param, // Default: false + * resources?: array, + * }, + * messenger?: bool|array{ // Messenger configuration + * enabled?: bool|Param, // Default: true + * routing?: array, + * }>, + * serializer?: array{ + * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * symfony_serializer?: array{ + * format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * context?: array, + * }, + * }, + * transports?: array, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * retry_strategy?: string|array{ + * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * }, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null + * }>, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: list, + * default_bus?: scalar|Param|null, // Default: null + * buses?: array, + * }>, + * }>, + * }, + * scheduler?: bool|array{ // Scheduler configuration + * enabled?: bool|Param, // Default: true + * }, + * disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true + * http_client?: bool|array{ // HTTP Client configuration + * enabled?: bool|Param, // Default: true + * max_host_connections?: int|Param, // The maximum number of connections to a single host. + * default_options?: array{ + * headers?: array, + * vars?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }, + * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * scoped_clients?: array, + * headers?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }>, + * }, + * mailer?: bool|array{ // Mailer configuration + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|Param|null, // Default: null + * transports?: array, + * envelope?: array{ // Mailer Envelope configuration + * sender?: scalar|Param|null, + * recipients?: list, + * allowed_recipients?: list, + * }, + * headers?: array, + * dkim_signer?: bool|array{ // DKIM signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|Param|null, // Default: "" + * select?: scalar|Param|null, // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: "" + * options?: array, + * }, + * smime_signer?: bool|array{ // S/MIME signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: null + * extra_certificates?: scalar|Param|null, // Default: null + * sign_options?: int|Param, // Default: null + * }, + * smime_encrypter?: bool|array{ // S/MIME encrypter configuration + * enabled?: bool|Param, // Default: false + * repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null + * }, + * }, + * secrets?: bool|array{ + * enabled?: bool|Param, // Default: true + * vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local" + * decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * }, + * notifier?: bool|array{ // Notifier configuration + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, + * notification_on_failed_messages?: bool|Param, // Default: false + * channel_policy?: array>, + * admin_recipients?: list, + * }, + * rate_limiter?: bool|array{ // Rate limiter configuration + * enabled?: bool|Param, // Default: true + * limiters?: array, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". + * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 + * }, + * }>, + * }, + * uid?: bool|array{ // Uid configuration + * enabled?: bool|Param, // Default: true + * default_uuid_version?: 7|6|4|1|Param, // Default: 7 + * name_based_uuid_version?: 5|3|Param, // Default: 5 + * name_based_uuid_namespace?: scalar|Param|null, + * time_based_uuid_version?: 7|6|1|Param, // Default: 7 + * time_based_uuid_node?: scalar|Param|null, + * }, + * html_sanitizer?: bool|array{ // HtmlSanitizer configuration + * enabled?: bool|Param, // Default: true + * sanitizers?: array, + * block_elements?: list, + * drop_elements?: list, + * allow_attributes?: array, + * drop_attributes?: array, + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: list, + * allowed_link_hosts?: list|null, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: list, + * allowed_media_hosts?: list|null, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: list, + * without_attribute_sanitizers?: list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 + * }>, + * }, + * webhook?: bool|array{ // Webhook configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" + * routing?: array, + * }, + * remote-event?: bool|array{ // RemoteEvent configuration + * enabled?: bool|Param, // Default: false + * }, + * json_streamer?: bool|array{ // JSON streamer configuration + * enabled?: bool|Param, // Default: false + * }, + * } + * @psalm-type SecurityConfig = array{ + * access_denied_url?: scalar|Param|null, // Default: null + * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" + * hide_user_not_found?: bool|Param, // Deprecated: The "hide_user_not_found" option is deprecated and will be removed in 8.0. Use the "expose_security_errors" option instead. + * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" + * erase_credentials?: bool|Param, // Default: true + * access_decision_manager?: array{ + * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, + * service?: scalar|Param|null, + * strategy_service?: scalar|Param|null, + * allow_if_all_abstain?: bool|Param, // Default: false + * allow_if_equal_granted_denied?: bool|Param, // Default: true + * }, + * password_hashers?: array, + * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" + * key_length?: scalar|Param|null, // Default: 40 + * ignore_case?: bool|Param, // Default: false + * encode_as_base64?: bool|Param, // Default: true + * iterations?: scalar|Param|null, // Default: 5000 + * cost?: int|Param, // Default: null + * memory_cost?: scalar|Param|null, // Default: null + * time_cost?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * }>, + * providers?: array, + * }, + * memory?: array{ + * users?: array, + * }>, + * }, + * ldap?: array{ + * service: scalar|Param|null, + * base_dn: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: null + * search_password?: scalar|Param|null, // Default: null + * extra_fields?: list, + * default_roles?: list, + * role_fetcher?: scalar|Param|null, // Default: null + * uid_key?: scalar|Param|null, // Default: "sAMAccountName" + * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" + * password_attribute?: scalar|Param|null, // Default: null + * }, + * entity?: array{ + * class: scalar|Param|null, // The full entity class name of your user class. + * property?: scalar|Param|null, // Default: null + * manager_name?: scalar|Param|null, // Default: null + * }, + * }>, + * firewalls: array, + * security?: bool|Param, // Default: true + * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" + * request_matcher?: scalar|Param|null, + * access_denied_url?: scalar|Param|null, + * access_denied_handler?: scalar|Param|null, + * entry_point?: scalar|Param|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". + * provider?: scalar|Param|null, + * stateless?: bool|Param, // Default: false + * lazy?: bool|Param, // Default: false + * context?: scalar|Param|null, + * logout?: array{ + * enable_csrf?: bool|Param|null, // Default: null + * csrf_token_id?: scalar|Param|null, // Default: "logout" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_manager?: scalar|Param|null, + * path?: scalar|Param|null, // Default: "/logout" + * target?: scalar|Param|null, // Default: "/" + * invalidate_session?: bool|Param, // Default: true + * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, + * delete_cookies?: array, + * }, + * switch_user?: array{ + * provider?: scalar|Param|null, + * parameter?: scalar|Param|null, // Default: "_switch_user" + * role?: scalar|Param|null, // Default: "ROLE_ALLOWED_TO_SWITCH" + * target_route?: scalar|Param|null, // Default: null + * }, + * required_badges?: list, + * custom_authenticators?: list, + * login_throttling?: array{ + * limiter?: scalar|Param|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". + * max_attempts?: int|Param, // Default: 5 + * interval?: scalar|Param|null, // Default: "1 minute" + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null + * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" + * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null + * }, + * two_factor?: array{ + * check_path?: scalar|Param|null, // Default: "/2fa_check" + * post_only?: bool|Param, // Default: true + * auth_form_path?: scalar|Param|null, // Default: "/2fa" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * success_handler?: scalar|Param|null, // Default: null + * failure_handler?: scalar|Param|null, // Default: null + * authentication_required_handler?: scalar|Param|null, // Default: null + * auth_code_parameter_name?: scalar|Param|null, // Default: "_auth_code" + * trusted_parameter_name?: scalar|Param|null, // Default: "_trusted" + * remember_me_sets_trusted?: scalar|Param|null, // Default: false + * multi_factor?: bool|Param, // Default: false + * prepare_on_login?: bool|Param, // Default: false + * prepare_on_access_denied?: bool|Param, // Default: false + * enable_csrf?: scalar|Param|null, // Default: false + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "two_factor" + * csrf_header?: scalar|Param|null, // Default: null + * csrf_token_manager?: scalar|Param|null, // Default: "scheb_two_factor.csrf_token_manager" + * provider?: scalar|Param|null, // Default: null + * }, + * x509?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN_Email" + * credentials?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN" + * user_identifier?: scalar|Param|null, // Default: "emailAddress" + * }, + * remote_user?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "REMOTE_USER" + * }, + * login_link?: array{ + * check_route: scalar|Param|null, // Route that will validate the login link - e.g. "app_login_link_verify". + * check_post_only?: scalar|Param|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false + * signature_properties: list, + * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 + * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null + * used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set. + * success_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. + * failure_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. + * provider?: scalar|Param|null, // The user provider to load users from. + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * login_path?: scalar|Param|null, // Default: "/login" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * json_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * }, + * json_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * access_token?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: null + * token_extractors?: list, + * token_handler: string|array{ + * id?: scalar|Param|null, + * oidc_user_info?: string|array{ + * base_uri: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * discovery?: array{ // Enable the OIDC discovery. + * cache?: array{ + * id: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" + * client?: scalar|Param|null, // HttpClient service id to use to call the OIDC server. + * }, + * oidc?: array{ + * discovery?: array{ // Enable the OIDC discovery. + * base_uri: list, + * cache?: array{ + * id: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" + * audience: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers: list, + * algorithm?: array, + * algorithms: list, + * key?: scalar|Param|null, // Deprecated: The "key" option is deprecated and will be removed in 8.0. Use the "keyset" option instead. // JSON-encoded JWK used to sign the token (must contain a "kty" key). + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). + * encryption?: bool|array{ + * enabled?: bool|Param, // Default: false + * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false + * algorithms: list, + * keyset: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * }, + * }, + * cas?: array{ + * validation_url: scalar|Param|null, // CAS server validation URL + * prefix?: scalar|Param|null, // CAS prefix // Default: "cas" + * http_client?: scalar|Param|null, // HTTP Client service // Default: null + * }, + * oauth2?: scalar|Param|null, + * }, + * }, + * http_basic?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * }, + * http_basic_ldap?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * remember_me?: array{ + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * service?: scalar|Param|null, + * user_providers?: list, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, + * token_provider?: string|array{ + * service?: scalar|Param|null, // The service ID of a custom remember-me token provider. + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: false + * connection?: scalar|Param|null, // Default: null + * }, + * }, + * token_verifier?: scalar|Param|null, // The service ID of a custom rememberme token verifier. + * name?: scalar|Param|null, // Default: "REMEMBERME" + * lifetime?: int|Param, // Default: 31536000 + * path?: scalar|Param|null, // Default: "/" + * domain?: scalar|Param|null, // Default: null + * secure?: true|false|"auto"|Param, // Default: null + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" + * }, + * }>, + * access_control?: list, + * attributes?: array, + * route?: scalar|Param|null, // Default: null + * methods?: list, + * allow_if?: scalar|Param|null, // Default: null + * roles?: list, + * }>, + * role_hierarchy?: array>, + * } + * @psalm-type TwigConfig = array{ + * form_themes?: list, + * globals?: array, + * autoescape_service?: scalar|Param|null, // Default: null + * autoescape_service_method?: scalar|Param|null, // Default: null + * base_template_class?: scalar|Param|null, // Deprecated: The child node "base_template_class" at path "twig.base_template_class" is deprecated. + * cache?: scalar|Param|null, // Default: true + * charset?: scalar|Param|null, // Default: "%kernel.charset%" + * debug?: bool|Param, // Default: "%kernel.debug%" + * strict_variables?: bool|Param, // Default: "%kernel.debug%" + * auto_reload?: scalar|Param|null, + * optimizations?: int|Param, + * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" + * file_name_pattern?: list, + * paths?: array, + * date?: array{ // The default format options used by the date filter. + * format?: scalar|Param|null, // Default: "F j, Y H:i" + * interval_format?: scalar|Param|null, // Default: "%d days" + * timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null + * }, + * number_format?: array{ // The default format options for the number_format filter. + * decimals?: int|Param, // Default: 0 + * decimal_point?: scalar|Param|null, // Default: "." + * thousands_separator?: scalar|Param|null, // Default: "," + * }, + * mailer?: array{ + * html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null + * }, + * } + * @psalm-type TwigExtraConfig = array{ + * cache?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * html?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * markdown?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * intl?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * cssinliner?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * inky?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * string?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * commonmark?: array{ + * renderer?: array{ // Array of options for rendering HTML. + * block_separator?: scalar|Param|null, + * inner_separator?: scalar|Param|null, + * soft_break?: scalar|Param|null, + * }, + * html_input?: "strip"|"allow"|"escape"|Param, // How to handle HTML input. + * allow_unsafe_links?: bool|Param, // Remove risky link and image URLs by setting this to false. // Default: true + * max_nesting_level?: int|Param, // The maximum nesting level for blocks. // Default: 9223372036854775807 + * max_delimiters_per_line?: int|Param, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 + * slug_normalizer?: array{ // Array of options for configuring how URL-safe slugs are created. + * instance?: mixed, + * max_length?: int|Param, // Default: 255 + * unique?: mixed, + * }, + * commonmark?: array{ // Array of options for configuring the CommonMark core extension. + * enable_em?: bool|Param, // Default: true + * enable_strong?: bool|Param, // Default: true + * use_asterisk?: bool|Param, // Default: true + * use_underscore?: bool|Param, // Default: true + * unordered_list_markers?: list, + * }, + * ... + * }, + * } + * @psalm-type MonologConfig = array{ + * use_microseconds?: scalar|Param|null, // Default: true + * channels?: list, + * handlers?: array, + * excluded_http_codes?: list, + * }>, + * accepted_levels?: list, + * min_level?: scalar|Param|null, // Default: "DEBUG" + * max_level?: scalar|Param|null, // Default: "EMERGENCY" + * buffer_size?: scalar|Param|null, // Default: 0 + * flush_on_overflow?: bool|Param, // Default: false + * handler?: scalar|Param|null, + * url?: scalar|Param|null, + * exchange?: scalar|Param|null, + * exchange_name?: scalar|Param|null, // Default: "log" + * room?: scalar|Param|null, + * message_format?: scalar|Param|null, // Default: "text" + * api_version?: scalar|Param|null, // Default: null + * channel?: scalar|Param|null, // Default: null + * bot_name?: scalar|Param|null, // Default: "Monolog" + * use_attachment?: scalar|Param|null, // Default: true + * use_short_attachment?: scalar|Param|null, // Default: false + * include_extra?: scalar|Param|null, // Default: false + * icon_emoji?: scalar|Param|null, // Default: null + * webhook_url?: scalar|Param|null, + * exclude_fields?: list, + * team?: scalar|Param|null, + * notify?: scalar|Param|null, // Default: false + * nickname?: scalar|Param|null, // Default: "Monolog" + * token?: scalar|Param|null, + * region?: scalar|Param|null, + * source?: scalar|Param|null, + * use_ssl?: bool|Param, // Default: true + * user?: mixed, + * title?: scalar|Param|null, // Default: null + * host?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 514 + * config?: list, + * members?: list, + * connection_string?: scalar|Param|null, + * timeout?: scalar|Param|null, + * time?: scalar|Param|null, // Default: 60 + * deduplication_level?: scalar|Param|null, // Default: 400 + * store?: scalar|Param|null, // Default: null + * connection_timeout?: scalar|Param|null, + * persistent?: bool|Param, + * dsn?: scalar|Param|null, + * hub_id?: scalar|Param|null, // Default: null + * client_id?: scalar|Param|null, // Default: null + * auto_log_stacks?: scalar|Param|null, // Default: false + * release?: scalar|Param|null, // Default: null + * environment?: scalar|Param|null, // Default: null + * message_type?: scalar|Param|null, // Default: 0 + * parse_mode?: scalar|Param|null, // Default: null + * disable_webpage_preview?: bool|Param|null, // Default: null + * disable_notification?: bool|Param|null, // Default: null + * split_long_messages?: bool|Param, // Default: false + * delay_between_messages?: bool|Param, // Default: false + * topic?: int|Param, // Default: null + * factor?: int|Param, // Default: 1 + * tags?: list, + * console_formater_options?: mixed, // Deprecated: "monolog.handlers..console_formater_options.console_formater_options" is deprecated, use "monolog.handlers..console_formater_options.console_formatter_options" instead. + * console_formatter_options?: mixed, // Default: [] + * formatter?: scalar|Param|null, + * nested?: bool|Param, // Default: false + * publisher?: string|array{ + * id?: scalar|Param|null, + * hostname?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 12201 + * chunk_size?: scalar|Param|null, // Default: 1420 + * encoder?: "json"|"compressed_json"|Param, + * }, + * mongo?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 27017 + * user?: scalar|Param|null, + * pass?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * mongodb?: string|array{ + * id?: scalar|Param|null, // ID of a MongoDB\Client service + * uri?: scalar|Param|null, + * username?: scalar|Param|null, + * password?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * elasticsearch?: string|array{ + * id?: scalar|Param|null, + * hosts?: list, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 9200 + * transport?: scalar|Param|null, // Default: "Http" + * user?: scalar|Param|null, // Default: null + * password?: scalar|Param|null, // Default: null + * }, + * index?: scalar|Param|null, // Default: "monolog" + * document_type?: scalar|Param|null, // Default: "logs" + * ignore_error?: scalar|Param|null, // Default: false + * redis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * password?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 6379 + * database?: scalar|Param|null, // Default: 0 + * key_name?: scalar|Param|null, // Default: "monolog_redis" + * }, + * predis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * }, + * from_email?: scalar|Param|null, + * to_email?: list, + * subject?: scalar|Param|null, + * content_type?: scalar|Param|null, // Default: null + * headers?: list, + * mailer?: scalar|Param|null, // Default: null + * email_prototype?: string|array{ + * id: scalar|Param|null, + * method?: scalar|Param|null, // Default: null + * }, + * lazy?: bool|Param, // Default: true + * verbosity_levels?: array{ + * VERBOSITY_QUIET?: scalar|Param|null, // Default: "ERROR" + * VERBOSITY_NORMAL?: scalar|Param|null, // Default: "WARNING" + * VERBOSITY_VERBOSE?: scalar|Param|null, // Default: "NOTICE" + * VERBOSITY_VERY_VERBOSE?: scalar|Param|null, // Default: "INFO" + * VERBOSITY_DEBUG?: scalar|Param|null, // Default: "DEBUG" + * }, + * channels?: string|array{ + * type?: scalar|Param|null, + * elements?: list, + * }, + * }>, + * } + * @psalm-type DoctrineConfig = array{ + * dbal?: array{ + * default_connection?: scalar|Param|null, + * types?: array, + * driver_schemes?: array, + * connections?: array, + * mapping_types?: array, + * default_table_options?: array, + * schema_manager_factory?: scalar|Param|null, // Default: "doctrine.dbal.default_schema_manager_factory" + * result_cache?: scalar|Param|null, + * slaves?: array, + * replicas?: array, + * }>, + * }, + * orm?: array{ + * default_entity_manager?: scalar|Param|null, + * auto_generate_proxy_classes?: scalar|Param|null, // Auto generate mode possible values are: "NEVER", "ALWAYS", "FILE_NOT_EXISTS", "EVAL", "FILE_NOT_EXISTS_OR_CHANGED", this option is ignored when the "enable_native_lazy_objects" option is true // Default: false + * enable_lazy_ghost_objects?: bool|Param, // Enables the new implementation of proxies based on lazy ghosts instead of using the legacy implementation // Default: true + * enable_native_lazy_objects?: bool|Param, // Enables the new native implementation of PHP lazy objects instead of generated proxies // Default: false + * proxy_dir?: scalar|Param|null, // Configures the path where generated proxy classes are saved when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true // Default: "%kernel.build_dir%/doctrine/orm/Proxies" + * proxy_namespace?: scalar|Param|null, // Defines the root namespace for generated proxy classes when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true // Default: "Proxies" + * controller_resolver?: bool|array{ + * enabled?: bool|Param, // Default: true + * auto_mapping?: bool|Param|null, // Set to false to disable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: null + * evict_cache?: bool|Param, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false + * }, + * entity_managers?: array, + * }>, + * }>, + * }, + * connection?: scalar|Param|null, + * class_metadata_factory_name?: scalar|Param|null, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory" + * default_repository_class?: scalar|Param|null, // Default: "Doctrine\\ORM\\EntityRepository" + * auto_mapping?: scalar|Param|null, // Default: false + * naming_strategy?: scalar|Param|null, // Default: "doctrine.orm.naming_strategy.default" + * quote_strategy?: scalar|Param|null, // Default: "doctrine.orm.quote_strategy.default" + * typed_field_mapper?: scalar|Param|null, // Default: "doctrine.orm.typed_field_mapper.default" + * entity_listener_resolver?: scalar|Param|null, // Default: null + * fetch_mode_subselect_batch_size?: scalar|Param|null, + * repository_factory?: scalar|Param|null, // Default: "doctrine.orm.container_repository_factory" + * schema_ignore_classes?: list, + * report_fields_where_declared?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.16 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/10455. // Default: true + * validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14. See https://github.com/doctrine/orm/pull/6728. // Default: false + * second_level_cache?: array{ + * region_cache_driver?: string|array{ + * type?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * pool?: scalar|Param|null, + * }, + * region_lock_lifetime?: scalar|Param|null, // Default: 60 + * log_enabled?: bool|Param, // Default: true + * region_lifetime?: scalar|Param|null, // Default: 3600 + * enabled?: bool|Param, // Default: true + * factory?: scalar|Param|null, + * regions?: array, + * loggers?: array, + * }, + * hydrators?: array, + * mappings?: array, + * dql?: array{ + * string_functions?: array, + * numeric_functions?: array, + * datetime_functions?: array, + * }, + * filters?: array, + * }>, + * identity_generation_preferences?: array, + * }>, + * resolve_target_entities?: array, + * }, + * } + * @psalm-type DoctrineMigrationsConfig = array{ + * migrations_paths?: array, + * services?: array, + * factories?: array, + * storage?: array{ // Storage to use for migration status metadata. + * table_storage?: array{ // The default metadata storage, implemented as a table in the database. + * table_name?: scalar|Param|null, // Default: null + * version_column_name?: scalar|Param|null, // Default: null + * version_column_length?: scalar|Param|null, // Default: null + * executed_at_column_name?: scalar|Param|null, // Default: null + * execution_time_column_name?: scalar|Param|null, // Default: null + * }, + * }, + * migrations?: list, + * connection?: scalar|Param|null, // Connection name to use for the migrations database. // Default: null + * em?: scalar|Param|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null + * all_or_nothing?: scalar|Param|null, // Run all migrations in a transaction. // Default: false + * check_database_platform?: scalar|Param|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true + * custom_template?: scalar|Param|null, // Custom template path for generated migration classes. // Default: null + * organize_migrations?: scalar|Param|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false + * enable_profiler?: bool|Param, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false + * transactional?: bool|Param, // Whether or not to wrap migrations in a single transaction. // Default: true + * } + * @psalm-type CmfRoutingConfig = array{ + * chain?: array{ + * routers_by_id?: array, + * replace_symfony_router?: bool|Param, // Default: true + * }, + * dynamic?: bool|array{ + * enabled?: bool|Param, // Default: false + * route_collection_limit?: scalar|Param|null, // Default: 0 + * generic_controller?: scalar|Param|null, // Default: null + * default_controller?: scalar|Param|null, // Default: null + * controllers_by_type?: array, + * controllers_by_class?: array, + * templates_by_class?: array, + * persistence?: array{ + * phpcr?: bool|array{ + * enabled?: bool|Param, // Default: false + * manager_name?: scalar|Param|null, // Default: null + * route_basepaths?: list, + * enable_initializer?: bool|Param, // Default: true + * }, + * orm?: bool|array{ + * enabled?: bool|Param, // Default: false + * manager_name?: scalar|Param|null, // Default: null + * route_class?: scalar|Param|null, // Default: "Symfony\\Cmf\\Bundle\\RoutingBundle\\Doctrine\\Orm\\Route" + * }, + * }, + * uri_filter_regexp?: scalar|Param|null, // Default: "" + * route_provider_service_id?: scalar|Param|null, + * route_filters_by_id?: array, + * content_repository_service_id?: scalar|Param|null, + * locales?: list, + * limit_candidates?: int|Param, // Default: 20 + * match_implicit_locale?: bool|Param, // Default: true + * redirectable_url_matcher?: bool|Param, // Default: false + * auto_locale_pattern?: bool|Param, // Default: false + * url_generator?: scalar|Param|null, // URL generator service ID // Default: "cmf_routing.generator" + * }, + * } + * @psalm-type SchebTwoFactorConfig = array{ + * persister?: scalar|Param|null, // Default: "scheb_two_factor.persister.doctrine" + * model_manager_name?: scalar|Param|null, // Default: null + * security_tokens?: list, + * ip_whitelist?: list, + * ip_whitelist_provider?: scalar|Param|null, // Default: "scheb_two_factor.default_ip_whitelist_provider" + * two_factor_token_factory?: scalar|Param|null, // Default: "scheb_two_factor.default_token_factory" + * two_factor_provider_decider?: scalar|Param|null, // Default: "scheb_two_factor.default_provider_decider" + * two_factor_condition?: scalar|Param|null, // Default: null + * code_reuse_cache?: scalar|Param|null, // Default: null + * code_reuse_cache_duration?: int|Param, // Default: 60 + * code_reuse_default_handler?: scalar|Param|null, // Default: null + * google?: bool|array{ + * enabled?: scalar|Param|null, // Default: false + * form_renderer?: scalar|Param|null, // Default: null + * issuer?: scalar|Param|null, // Default: null + * server_name?: scalar|Param|null, // Default: null + * template?: scalar|Param|null, // Default: "@SchebTwoFactor/Authentication/form.html.twig" + * digits?: int|Param, // Default: 6 + * leeway?: int|Param, // Default: 0 + * }, + * } + * @psalm-type FosJsRoutingConfig = array{ + * serializer?: scalar|Param|null, + * routes_to_expose?: list, + * router?: scalar|Param|null, // Default: "router" + * request_context_base_url?: scalar|Param|null, // Default: null + * cache_control?: array{ + * public?: bool|Param, // Default: false + * expires?: scalar|Param|null, // Default: null + * maxage?: scalar|Param|null, // Default: null + * smaxage?: scalar|Param|null, // Default: null + * vary?: list, + * }, + * } + * @psalm-type FlysystemConfig = array{ + * storages?: array, + * visibility?: scalar|Param|null, // Default: null + * directory_visibility?: scalar|Param|null, // Default: null + * retain_visibility?: bool|Param|null, // Default: null + * case_sensitive?: bool|Param, // Default: true + * disable_asserts?: bool|Param, // Default: false + * public_url?: list, + * path_normalizer?: scalar|Param|null, // Default: null + * public_url_generator?: scalar|Param|null, // Default: null + * temporary_url_generator?: scalar|Param|null, // Default: null + * read_only?: bool|Param, // Default: false + * }>, + * } + * @psalm-type KnpPaginatorConfig = array{ + * default_options?: array{ + * sort_field_name?: scalar|Param|null, // Default: "sort" + * sort_direction_name?: scalar|Param|null, // Default: "direction" + * filter_field_name?: scalar|Param|null, // Default: "filterField" + * filter_value_name?: scalar|Param|null, // Default: "filterValue" + * page_name?: scalar|Param|null, // Default: "page" + * distinct?: bool|Param, // Default: true + * page_out_of_range?: scalar|Param|null, // Default: "ignore" + * default_limit?: scalar|Param|null, // Default: 10 + * }, + * template?: array{ + * pagination?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sliding.html.twig" + * rel_links?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/rel_links.html.twig" + * filtration?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/filtration.html.twig" + * sortable?: scalar|Param|null, // Default: "@KnpPaginator/Pagination/sortable_link.html.twig" + * }, + * page_range?: scalar|Param|null, // Default: 5 + * page_limit?: scalar|Param|null, // Default: null + * convert_exception?: bool|Param, // Default: false + * remove_first_page_param?: bool|Param, // Default: false + * } + * @psalm-type CoreShopCoreConfig = array{ + * send_usage_log?: scalar|Param|null, // Default: true + * checkout_manager_factory?: scalar|Param|null, + * after_logout_redirect_route?: scalar|Param|null, // Default: "coreshop_index" + * autoconfigure_with_attributes?: scalar|Param|null, // Default: false + * resources?: array{ + * product_store_values?: array{ + * options?: mixed, + * graphql?: array{ + * enabled?: bool|Param, // Default: true + * }, + * classes?: array{ + * model?: scalar|Param|null, // Default: "CoreShop\\Component\\Core\\Model\\ProductStoreValues" + * interface?: scalar|Param|null, // Default: "CoreShop\\Component\\Core\\Model\\ProductStoreValuesInterface" + * factory?: scalar|Param|null, // Default: "CoreShop\\Component\\Resource\\Factory\\Factory" + * repository?: scalar|Param|null, // Default: "CoreShop\\Bundle\\CoreBundle\\Doctrine\\ORM\\ProductStoreValuesRepository" + * }, + * }, + * }, + * pimcore_admin?: array{ + * js?: array, + * css?: array{ + * core?: scalar|Param|null, // Default: "/bundles/coreshopcore/pimcore/css/core.css" + * ... + * }, + * permissions?: scalar|Param|null, // Default: ["settings","ctc_assign_to_new","ctc_assign_to_existing"] + * editmode_js?: array, + * editmode_css?: array, + * }, + * checkout: array, + * }>, + * } + * @psalm-type CoreShopStorageListConfig = array{ + * list?: array, + * } + * @psalm-type DebugConfig = array{ + * max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 + * min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 + * max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1 + * dump_destination?: scalar|Param|null, // A stream URL where dumps should be written to. // Default: null + * theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" + * } + * @psalm-type WebProfilerConfig = array{ + * toolbar?: bool|array{ // Profiler toolbar configuration + * enabled?: bool|Param, // Default: false + * ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false + * }, + * intercept_redirects?: bool|Param, // Default: false + * excluded_ajax_paths?: scalar|Param|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" + * } + * @psalm-type PrestaSitemapConfig = array{ + * generator?: scalar|Param|null, // Default: "presta_sitemap.generator_default" + * dumper?: scalar|Param|null, // Default: "presta_sitemap.dumper_default" + * timetolive?: int|Param, // Default: 3600 + * sitemap_file_prefix?: scalar|Param|null, // Sets sitemap filename prefix defaults to "sitemap" -> sitemap.xml (for index); sitemap.
.xml(.gz) (for sitemaps) // Default: "sitemap" + * items_by_set?: int|Param, // The maximum number of items allowed in single sitemap. // Default: 50000 + * route_annotation_listener?: scalar|Param|null, // Default: true + * dump_directory?: scalar|Param|null, // The directory to which the sitemap will be dumped. It can be either absolute, or relative (to the place where the command will be triggered). Default to Symfony's public dir. // Default: "%kernel.project_dir%/public" + * defaults?: array{ + * priority?: scalar|Param|null, // Default: 0.5 + * changefreq?: scalar|Param|null, // Default: "daily" + * lastmod?: scalar|Param|null, // Default: "now" + * }, + * default_section?: scalar|Param|null, // The default section in which static routes are registered. // Default: "default" + * alternate?: bool|array{ // Automatically generate alternate (hreflang) urls with static routes. Requires route_annotation_listener config to be enabled. + * enabled?: bool|Param, // Default: false + * default_locale?: scalar|Param|null, // The default locale of your routes. // Default: "en" + * locales?: list, + * i18n?: "symfony"|"jms"|Param, // Strategy used to create your i18n routes. // Default: "symfony" + * }, + * } + * @psalm-type PimcoreElasticsearchClientConfig = array{ + * es_clients?: array, + * logger_channel?: scalar|Param|null, // Logger channel to be used for elasticsearch client logs // Default: "pimcore.elasticsearch.default" + * username?: scalar|Param|null, // Username for elasticsearch authentication + * password?: scalar|Param|null, // Password for elasticsearch authentication + * ca_bundle?: scalar|Param|null, // Path to certificate authority file (.crt) + * ssl_key?: scalar|Param|null, // Path to private SSL key file (.key) + * ssl_cert?: scalar|Param|null, // Path to PEM formatted SSL cert file (.cert) + * ssl_password?: scalar|Param|null, // If private key and certificate require a password (default: null) + * ssl_verification?: bool|Param, // Enable or disable the SSL verification (default: true) + * http_options?: list, + * cloud_id?: scalar|Param|null, // Elastic Cloud Id for elasticsearch cloud authentication + * api_key?: scalar|Param|null, // Elastic Cloud API key for elasticsearch cloud authentication + * }>, + * } + * @psalm-type MercureConfig = array{ + * hubs?: array, + * subscribe?: list, + * secret?: scalar|Param|null, // The JWT Secret to use. + * passphrase?: scalar|Param|null, // The JWT secret passphrase. // Default: "" + * algorithm?: scalar|Param|null, // The algorithm to use to sign the JWT // Default: "hmac.sha256" + * }, + * jwt_provider?: scalar|Param|null, // Deprecated: The child node "jwt_provider" at path "mercure.hubs..jwt_provider" is deprecated, use "jwt.provider" instead. // The ID of a service to call to generate the JSON Web Token. + * bus?: scalar|Param|null, // Name of the Messenger bus where the handler for this hub must be registered. Default to the default bus if Messenger is enabled. + * }>, + * default_hub?: scalar|Param|null, + * default_cookie_lifetime?: int|Param, // Default lifetime of the cookie containing the JWT, in seconds. Defaults to the value of "framework.session.cookie_lifetime". // Default: null + * enable_profiler?: bool|Param, // Deprecated: The child node "enable_profiler" at path "mercure.enable_profiler" is deprecated. // Enable Symfony Web Profiler integration. + * } + * @psalm-type WebpackEncoreConfig = array{ + * output_path: scalar|Param|null, // The path where Encore is building the assets - i.e. Encore.setOutputPath() + * crossorigin?: false|"anonymous"|"use-credentials"|Param, // crossorigin value when Encore.enableIntegrityHashes() is used, can be false (default), anonymous or use-credentials // Default: false + * preload?: bool|Param, // preload all rendered script and link tags automatically via the http2 Link header. // Default: false + * cache?: bool|Param, // Enable caching of the entry point file(s) // Default: false + * strict_mode?: bool|Param, // Throw an exception if the entrypoints.json file is missing or an entry is missing from the data // Default: true + * builds?: array, + * script_attributes?: array, + * link_attributes?: array, + * } + * @psalm-type KnpMenuConfig = array{ + * providers?: array{ + * builder_alias?: bool|Param, // Default: true + * }, + * twig?: array{ + * template?: scalar|Param|null, // Default: "@KnpMenu/menu.html.twig" + * }, + * templating?: bool|Param, // Default: false + * default_renderer?: scalar|Param|null, // Default: "twig" + * } + * @psalm-type PimcoreConfig = array{ + * bundles?: array{ // Define parameters for Pimcore Bundle Locator + * search_paths?: list, + * handle_composer?: bool|Param, // Define whether it should be scanning bundles through composer /vendor folder or not // Default: true + * }, + * flags?: list, + * translations?: array{ + * domains?: list, + * admin_translation_mapping?: array, + * debugging?: bool|array{ // If debugging is enabled, the translator will return the plain translation key instead of the translated message. + * enabled?: bool|Param, // Default: true + * parameter?: scalar|Param|null, // Default: "pimcore_debug_translations" + * }, + * }, + * maps?: array{ + * tile_layer_url_template?: scalar|Param|null, // Default: "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" + * geocoding_url_template?: scalar|Param|null, // Default: "https://nominatim.openstreetmap.org/search?q={q}&addressdetails=1&format=json&limit=1" + * reverse_geocoding_url_template?: scalar|Param|null, // Default: "https://nominatim.openstreetmap.org/reverse?format=json&lat={lat}&lon={lon}&addressdetails=1" + * }, + * general?: array{ + * timezone?: scalar|Param|null, // Default: "" + * path_variable?: scalar|Param|null, // Additional $PATH variable (: separated) (/x/y:/foo/bar): // Default: null + * domain?: scalar|Param|null, // Default: "" + * redirect_to_maindomain?: bool|Param, // Default: false + * language?: scalar|Param|null, // Deprecated: The child node "language" at path "pimcore.general.language" is deprecated. // Default: "en" + * valid_languages?: list, + * required_languages?: list, + * fallback_languages?: list, + * default_language?: scalar|Param|null, // Default: "en" + * disable_usage_statistics?: bool|Param, // Default: false + * debug_admin_translations?: bool|Param, // Debug Admin-Translations (text in UI will be displayed wrapped in +) // Default: false + * }, + * maintenance?: array{ + * housekeeping?: array{ + * cleanup_tmp_files_atime_older_than?: int|Param, // Integer value in seconds. // Default: 86400 + * cleanup_profiler_files_atime_older_than?: int|Param, // Integer value in seconds. // Default: 1800 + * }, + * }, + * objects?: array{ + * ignore_localized_query_fallback?: bool|Param, // Default: false + * tree_paging_limit?: int|Param, // Default: 30 + * auto_save_interval?: int|Param, // Default: 60 + * versions?: array{ + * days?: scalar|Param|null, // Default: null + * steps?: scalar|Param|null, // Default: null + * disable_events?: bool|Param, // Default: false + * disable_stack_trace?: bool|Param, // Default: false + * }, + * custom_layouts?: array{ + * definitions?: list, + * }, + * select_options?: array{ + * definitions?: list, + * }>, + * }, + * class_definitions?: array{ + * data?: array{ + * map?: array, + * prefixes?: list, + * }, + * layout?: array{ + * map?: array, + * prefixes?: list, + * }, + * }, + * ... + * }, + * assets?: array{ + * thumbnails?: array{ + * allowed_formats?: list, + * max_scaling_factor?: float|Param, // Default: 5.0 + * }, + * frontend_prefixes?: array{ + * source?: scalar|Param|null, // Default: "" + * thumbnail?: scalar|Param|null, // Default: "" + * thumbnail_deferred?: scalar|Param|null, // Default: "" + * }, + * preview_image_thumbnail?: scalar|Param|null, // Default: null + * default_upload_path?: scalar|Param|null, // Default: "_default_upload_bucket" + * tree_paging_limit?: int|Param, // Default: 100 + * image?: array{ + * max_pixels?: int|Param, // Maximum number of pixels an image can have when added (width × height). // Default: 40000000 + * low_quality_image_preview?: bool|array{ // Allow a LQIP SVG image to be generated alongside any other thumbnails. + * enabled?: bool|Param, // Default: true + * }, + * thumbnails?: array{ + * definitions?: list, + * }>, + * medias?: list, + * }>>, + * }>, + * clip_auto_support?: bool|Param, // Try to detect and use clipping paths and masks in images when generating thumbnails. // Default: true + * max_srcset_dpi_factor?: int|Param, // Maximum generated srcset DPI factor for web images. // Default: 2 + * image_optimizers?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * auto_formats?: list, + * status_cache?: bool|Param, // Store image metadata such as filename and modification date in assets_image_thumbnail_cache, this is helpful when using remote object storage for thumbnails. // Default: true + * auto_clear_temp_files?: bool|Param, // Automatically delete all image thumbnail files any time an image or its metadata is updated. // Default: true + * }, + * }, + * video?: array{ + * thumbnails?: array{ + * definitions?: list, + * }>, + * medias?: list, + * }>>, + * }>, + * auto_clear_temp_files?: bool|Param, // Automatically delete all video thumbnail files any time an image or its metadata is updated. // Default: true + * }, + * }, + * document?: array{ + * thumbnails?: array{ + * enabled?: bool|Param, // Process thumbnails for Asset documents. // Default: true + * }, + * process_page_count?: bool|Param, // Process & store page count for Asset documents. Internally required for thumbnails & text generation // Default: true + * process_text?: bool|Param, // Process text for Asset documents (e.g. used by backend search). // Default: true + * scan_pdf?: bool|Param, // Scan PDF documents for unsafe JavaScript. // Default: true + * open_pdf_in_new_tab?: "all-pdfs"|"only-unsafe"|"none"|Param, // Default: "only-unsafe" + * }, + * versions?: array{ + * days?: scalar|Param|null, // Default: null + * steps?: scalar|Param|null, // Default: null + * disable_events?: bool|Param, // Default: false + * use_hardlinks?: bool|Param, // Default: true + * disable_stack_trace?: bool|Param, // Default: false + * }, + * icc_rgb_profile?: scalar|Param|null, // Absolute path to default ICC RGB profile (if no embedded profile is given) // Default: null + * icc_cmyk_profile?: scalar|Param|null, // Absolute path to default ICC CMYK profile (if no embedded profile is given) // Default: null + * metadata?: array{ + * alt?: scalar|Param|null, // Set to replace the default metadata used for auto alt functionality in frontend // Default: "" + * copyright?: scalar|Param|null, // Set to replace the default metadata used for copyright in frontend // Default: "" + * title?: scalar|Param|null, // Set to replace the default metadata used for title in frontend // Default: "" + * predefined?: array{ + * definitions?: list, + * }, + * class_definitions?: array{ + * data?: array{ + * map?: array, + * prefixes?: list, + * }, + * }, + * }, + * type_definitions?: array{ + * map?: list, + * }>, + * }, + * }, + * documents?: array{ + * doc_types?: array{ + * definitions?: list, + * }, + * versions?: array{ + * days?: scalar|Param|null, // Default: null + * steps?: scalar|Param|null, // Default: null + * disable_events?: bool|Param, // Default: false + * disable_stack_trace?: bool|Param, // Default: false + * }, + * default_controller?: scalar|Param|null, // Default: "App\\Controller\\DefaultController::defaultAction" + * error_pages?: array{ + * default?: scalar|Param|null, // Default: null + * localized?: list, + * }, + * allow_trailing_slash?: scalar|Param|null, // Default: "no" + * generate_preview?: bool|Param, // Default: false + * preview_url_prefix?: scalar|Param|null, // Default: "" + * tree_paging_limit?: int|Param, // Default: 50 + * editables?: array{ + * map?: array, + * prefixes?: list, + * }, + * areas?: array{ + * autoload?: bool|Param, // Default: true + * }, + * auto_save_interval?: int|Param, // Default: 60 + * static_page_router?: array{ + * enabled?: bool|Param, // Enable Static Page router for document when using remote storage for generated pages // Default: false + * route_pattern?: scalar|Param|null, // Optionally define route patterns to lookup static pages. Regular Expressions like: /^\/en\/Magazine/ // Default: null + * }, + * static_page_generator?: array{ + * use_main_domain?: bool|Param, // Use main domain for static pages folder in tmp/pages // Default: false + * headers?: list, + * }, + * type_definitions?: array{ + * map?: list, + * }, + * ... + * }, + * encryption?: array{ + * secret?: scalar|Param|null, // Default: null + * }, + * models?: array{ + * class_overrides?: array, + * }, + * routing?: array{ + * static?: array{ + * locale_params?: list, + * }, + * }, + * full_page_cache?: bool|array{ + * enabled?: bool|Param, // Default: true + * lifetime?: scalar|Param|null, // Optional output-cache lifetime (in seconds) after the cache expires, if not defined the cache will be cleaned on every action inside the CMS, otherwise not (for high traffic sites) // Default: null + * exclude_patterns?: scalar|Param|null, // Regular Expressions like: /^\/dir\/toexclude/ + * exclude_cookie?: scalar|Param|null, // Comma separated list of cookie names, that will automatically disable the full-page cache + * ... + * }, + * context?: array, + * }>, + * }>, + * web_profiler?: array{ + * toolbar?: array{ + * excluded_routes?: list, + * }>, + * }, + * }, + * security?: array{ + * password?: array{ + * algorithm?: "2y"|"argon2i"|"argon2id"|Param, // The hashing algorithm to use for backend users and objects containing a "password" field. // Default: "2y" + * options?: list, + * }, + * factory_type?: "encoder"|"password_hasher"|Param, // Default: "encoder" + * encoder_factories?: array, + * password_hasher_factories?: array, + * }, + * email?: array{ + * sender?: array{ + * name?: scalar|Param|null, // Default: "" + * email?: scalar|Param|null, // Default: "" + * }, + * return?: array{ + * name?: scalar|Param|null, // Default: "" + * email?: scalar|Param|null, // Default: "" + * }, + * debug?: array{ + * email_addresses?: scalar|Param|null, // Default: "" + * }, + * usespecific?: scalar|Param|null, // Default: false + * }, + * workflows?: array, + * custom_extensions?: array, + * enabled?: bool|Param, // Can be used to enable or disable the workflow. // Default: true + * priority?: int|Param, // When multiple custom view or permission settings from different places in different workflows are valid, the workflow with the highest priority will be used. // Default: 0 + * label?: scalar|Param|null, // Will be used in the backend interface as nice name for the workflow. If not set the technical workflow name will be used as label too. + * audit_trail?: bool|array{ // Enable default audit trail feature provided by Symfony. Take a look at the Symfony docs for more details. + * enabled?: bool|Param, // Default: false + * }, + * type?: "workflow"|"state_machine"|Param, // A workflow with type "workflow" can handle multiple places at one time whereas a state_machine provides a finite state_machine (only one place at one time). Take a look at the Symfony docs for more details. + * marking_store?: array{ // Handles the way how the state/place is stored. If not defined "state_table" will be used as default. Take a look at @TODO for a description of the different types. + * type?: "multiple_state"|"single_state"|"state_table"|"data_object_multiple_state"|"data_object_splitted_state"|Param, + * arguments?: list, + * service?: scalar|Param|null, + * }, + * supports?: list, + * support_strategy?: array{ // Can be used to implement a special logic which subjects are supported by the workflow. For example only products matching certain criteria. + * type?: "expression"|Param, // Type "expression": a symfony expression to define a criteria. + * arguments?: list, + * service?: scalar|Param|null, // Define a custom service to handle the logic. Take a look at the Symfony docs for more details. + * }, + * initial_markings?: list, + * places?: list