ifnex/03_WordPress/wp-includes/assets/script-loader-packages.php
Kazem Alghasi f1d5667fe8 feat(deploy): preflight + smoke-test + UAT checklist (phases 3.9.1–3.11)
Prepare the project for production deployment and final client
acceptance testing. Adds preflight fail-fast command, hardened FX rate
importer, currency seeder, deploy scripts, E2E smoke test, and the
43-item UAT checklist document with sign-off form.

Key changes:

- Phase 3.9.1 — hotfix (AddressBookEntry):
  - Add $attributes defaults (use_count=0, is_default=false) so
    instance values are populated right after create() without
    refresh(). Resolves the red test
    `it_increments_use_count_and_sets_last_used_at`.

- Phase 3.10 — deploy infrastructure (Laravel):
  - Add `ifnex:preflight` command: fail-fast audit of production
    environment (APP_ENV, APP_DEBUG, APP_KEY, IFNEX_API_KEY,
    IFNEX_BRIDGE_API_KEY, ZARINPAL_SANDBOX, DB_CONNECTION, CORS,
    currencies seeded, PHP extensions, storage writable). Exits 1
    if any check fails; supports --skip-db for pre-migrate runs.
  - Add `ifnex:import-fx-rates` command: replacement for
    `ifnex:update-rates`. Fetches USD/AED from Exir.io + EUR/CNY
    from FreeCurrencyAPI. Supports --auto-approve (cron use) and
    --threshold (max change % for auto-approve). Logs critical on
    HTTP failure. URL configurable via EXIR_API_URL env.
  - Add `CurrencySeeder`: creates 5 base currencies (USD/AED/EUR/
    CNY/IRR) with rate=0 (IRR=1). Idempotent — does not overwrite
    real rates already set by admin or cron.
  - Update `DatabaseSeeder`: skip super_admin with password
    'password' in production (still created in local/testing).
  - Fix `bootstrap/app.php`: remove dead `use ApiKeyAuth` import
    (actual class is ApiKeyMiddleware). Latent fatal if api_key
    alias was used.
  - Add `config/ifnex.php` exir block + preflight config.
  - Harden `.env.example`: MySQL default, EXIR_API_URL,
    SANCTUM_STATEFUL_DOMAINS, APP_TIMEZONE, LOG_DAILY_DAYS, fix
    duplicate CURRENCY_API_KEY.

- Phase 3.10 — deploy scripts (Linux):
  - Add `scripts/deploy.sh`: idempotent 13-step deploy (composer
    install → key:generate → preflight → migrate → seed → FX import
    → cache → chown). Fail-fast with set -e.
  - Add `scripts/cron-exir-rates.sh`: daily cron wrapper for
    `ifnex:import-fx-rates --source=all --auto-approve`.

- Phase 3.10.1 — preflight hotfix:
  - Make expected DB connection configurable
    (ifnex.preflight.expected_db_connection) instead of hardcoded
    'mysql'. Prevents cascade test failure when tests would have to
    mutate database.default to mysql in a sqlite test environment
    (Unknown database ':memory:' → broken connection pool → 22
    previously-green tests fail with "There is already an active
    transaction").
  - Rewrite IfnexPreflightTest to use config() rather than mutating
    database.default.

- Phase 3.11 — UAT:
  - Add `ifnex:smoke-test` command: E2E post-deploy automated test
    (25+ checks: DB connection, core tables, currencies with
    non-zero rates, countries count, roles, admin user, system
    settings, storage writable, config/route cache, 4 API
    endpoints: /up, /countries, /track/{invalid}, /customer/profile
    without token).
  - Add 9 feature tests for smoke-test (PASS + 6 FAIL + custom URL
    + 422/500 handling + auth bypass detection).
  - Add `UAT-3.11.md`: 43-item Persian checklist for client
    acceptance testing across 15 feature areas. Includes sign-off
    form for both parties (client + VernaSoft).
  - Update `CLIENT_DELIVERY.md` to record phases 3.10 and 3.11.

Tests:
- Total: 51 → 82 tests, 150 → 220+ assertions, all green.
- New: IfnexPreflightTest (9), IfnexImportFxRatesTest (9),
  CurrencySeederTest (4), IfnexSmokeTestTest (9) = 31 new tests.

Documentation:
- DEPLOYMENT_HANDOFF.md §2.4: add CurrencySeeder + import-fx-rates.
- DEPLOYMENT_HANDOFF.md §2.8: update cron to use cron-exir-rates.sh.
- UAT-3.11.md: new 43-item client acceptance checklist + sign-off.
- CLIENT_DELIVERY.md: record phases 3.10 and 3.11 completion.
2026-10-31 22:18:15 +03:30

929 lines
17 KiB
PHP

<?php return array(
'a11y.js' => array(
'dependencies' => array(
'wp-dom-ready',
'wp-i18n'
),
'version' => '31c6cec5a4ff7aff483d'
),
'annotations.js' => array(
'dependencies' => array(
'wp-data',
'wp-hooks',
'wp-i18n',
'wp-rich-text'
),
'version' => '348a030f1b5717cfaba4'
),
'api-fetch.js' => array(
'dependencies' => array(
'wp-i18n',
'wp-private-apis',
'wp-url'
),
'version' => '6f2a4faeee3c722b1e57'
),
'autop.js' => array(
'dependencies' => array(
),
'version' => '4e10a18cb6f21a043fc0'
),
'base-styles.js' => array(
'dependencies' => array(
),
'version' => '67fd7250ac73fa2feba5'
),
'blob.js' => array(
'dependencies' => array(
),
'version' => 'c7582a735ddd2edc9731'
),
'block-directory.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-editor',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-notices',
'wp-plugins',
'wp-primitives',
'wp-private-apis',
'wp-theme',
'wp-url'
),
'version' => '7c679438bdaf9853987a'
),
'block-editor.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-blob',
'wp-block-serialization-default-parser',
'wp-blocks',
'wp-commands',
'wp-components',
'wp-compose',
'wp-data',
'wp-date',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-is-shallow-equal',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-notices',
'wp-preferences',
'wp-primitives',
'wp-priority-queue',
'wp-private-apis',
'wp-rich-text',
'wp-style-engine',
'wp-theme',
'wp-token-list',
'wp-upload-media',
'wp-url',
'wp-warning'
),
'version' => '37e58da384b2558bd479'
),
'block-library.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-autop',
'wp-blob',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-date',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-escape-html',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-notices',
'wp-patterns',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-server-side-render',
'wp-shortcode',
'wp-style-engine',
'wp-theme',
'wp-upload-media',
'wp-url',
'wp-wordcount'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/latex-to-mathml',
'import' => 'dynamic'
)
),
'version' => '00e6e2a44788af201f35'
),
'block-serialization-default-parser.js' => array(
'dependencies' => array(
),
'version' => 'fc209395a022242d64aa'
),
'block-serialization-spec-parser.js' => array(
'dependencies' => array(
),
'version' => '345804e2c9fb36e816cd'
),
'blocks.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-autop',
'wp-blob',
'wp-block-serialization-default-parser',
'wp-data',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-is-shallow-equal',
'wp-private-apis',
'wp-rich-text',
'wp-shortcode',
'wp-warning'
),
'version' => 'c0e57a630a0b6f6c3bb5'
),
'commands.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-components',
'wp-data',
'wp-element',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-preferences',
'wp-primitives',
'wp-private-apis'
),
'version' => '1a4910212c7ed2355300'
),
'components.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-compose',
'wp-date',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-escape-html',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-is-shallow-equal',
'wp-keycodes',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-theme',
'wp-warning'
),
'version' => '9b751f17060211272a5c'
),
'compose.js' => array(
'dependencies' => array(
'react',
'react-jsx-runtime',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-is-shallow-equal',
'wp-keycodes',
'wp-priority-queue',
'wp-private-apis',
'wp-undo-manager'
),
'version' => '0e8bde2a499ea6073b42'
),
'core-commands.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-commands',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-element',
'wp-html-entities',
'wp-i18n',
'wp-primitives',
'wp-private-apis',
'wp-router',
'wp-url'
),
'version' => '426a33508599b7f31db3'
),
'core-data.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-api-fetch',
'wp-block-editor',
'wp-blocks',
'wp-compose',
'wp-data',
'wp-deprecated',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-private-apis',
'wp-rich-text',
'wp-undo-manager',
'wp-url',
'wp-warning'
),
'version' => '573f98dbff9f49ffeb0b'
),
'customize-widgets.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-block-editor',
'wp-block-library',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-dom',
'wp-element',
'wp-hooks',
'wp-i18n',
'wp-is-shallow-equal',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-media-utils',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-theme',
'wp-widgets'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/route',
'import' => 'static'
)
),
'version' => '3bebbde9a9f5d2d35fb3'
),
'data.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-compose',
'wp-deprecated',
'wp-element',
'wp-is-shallow-equal',
'wp-priority-queue',
'wp-private-apis',
'wp-redux-routine'
),
'version' => '14a216e0932d72c22976'
),
'data-controls.js' => array(
'dependencies' => array(
'wp-api-fetch',
'wp-data',
'wp-deprecated'
),
'version' => '7e8f932da184d5537725'
),
'date.js' => array(
'dependencies' => array(
'moment',
'wp-deprecated'
),
'version' => '8173fc0fc12b7bb7eaf0'
),
'deprecated.js' => array(
'dependencies' => array(
'wp-hooks'
),
'version' => 'fe587bac92b7d0ef760e'
),
'dom.js' => array(
'dependencies' => array(
'wp-deprecated'
),
'version' => 'c95f94cbbc1ac3fde84f'
),
'dom-ready.js' => array(
'dependencies' => array(
),
'version' => '3fe927cab37bf38d6a23'
),
'edit-post.js' => array(
'dependencies' => array(
'media-models',
'media-views',
'postbox',
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-block-editor',
'wp-block-library',
'wp-blocks',
'wp-commands',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-deprecated',
'wp-editor',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-notices',
'wp-plugins',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-style-engine',
'wp-theme',
'wp-url',
'wp-widgets'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/route',
'import' => 'static'
)
),
'version' => 'a6cb1641d13f718c01bd'
),
'edit-site.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-blob',
'wp-block-editor',
'wp-block-library',
'wp-blocks',
'wp-commands',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-date',
'wp-deprecated',
'wp-dom',
'wp-dom-ready',
'wp-editor',
'wp-element',
'wp-html-entities',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-media-utils',
'wp-notices',
'wp-patterns',
'wp-plugins',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-router',
'wp-style-engine',
'wp-theme',
'wp-url',
'wp-warning',
'wp-widgets',
'wp-wordcount'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/route',
'import' => 'static'
)
),
'version' => '008f89f2cb2ad17a5947'
),
'edit-widgets.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-block-editor',
'wp-block-library',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-hooks',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-media-utils',
'wp-notices',
'wp-patterns',
'wp-plugins',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-theme',
'wp-url',
'wp-viewport',
'wp-widgets'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/route',
'import' => 'static'
)
),
'version' => 'e3dea93676b5aabfef8f'
),
'editor.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-blob',
'wp-block-editor',
'wp-block-serialization-default-parser',
'wp-blocks',
'wp-commands',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-date',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-hooks',
'wp-html-entities',
'wp-i18n',
'wp-keyboard-shortcuts',
'wp-keycodes',
'wp-media-utils',
'wp-notices',
'wp-patterns',
'wp-plugins',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-server-side-render',
'wp-style-engine',
'wp-theme',
'wp-upload-media',
'wp-url',
'wp-viewport',
'wp-warning',
'wp-wordcount'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/route',
'import' => 'static'
)
),
'version' => 'af070cfff88093363220'
),
'element.js' => array(
'dependencies' => array(
'react',
'react-dom',
'wp-escape-html'
),
'version' => '4a4370b2b349066fd440'
),
'escape-html.js' => array(
'dependencies' => array(
),
'version' => '87ebe53e97bba59805a5'
),
'format-library.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-block-editor',
'wp-components',
'wp-compose',
'wp-data',
'wp-element',
'wp-html-entities',
'wp-i18n',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-theme',
'wp-url'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/latex-to-mathml',
'import' => 'dynamic'
)
),
'version' => 'd69ac704b4a81b89c946'
),
'hooks.js' => array(
'dependencies' => array(
),
'version' => 'f0f188028580e8dc1255'
),
'html-entities.js' => array(
'dependencies' => array(
),
'version' => 'a976ff3a0f00bc2999a3'
),
'i18n.js' => array(
'dependencies' => array(
'wp-hooks'
),
'version' => '1dfe7db3940c23ea9216'
),
'is-shallow-equal.js' => array(
'dependencies' => array(
),
'version' => '7ad271045c1fe60f5496'
),
'keyboard-shortcuts.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-data',
'wp-element',
'wp-keycodes'
),
'version' => '37da95806f2339bc80d0'
),
'keycodes.js' => array(
'dependencies' => array(
'wp-i18n'
),
'version' => 'd0b4204e4bbeb412df6e'
),
'list-reusable-blocks.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-api-fetch',
'wp-blob',
'wp-components',
'wp-compose',
'wp-element',
'wp-i18n'
),
'version' => '68a57d388ce085b9691e'
),
'media-utils.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-api-fetch',
'wp-blob',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-date',
'wp-deprecated',
'wp-element',
'wp-i18n',
'wp-keycodes',
'wp-notices',
'wp-preferences',
'wp-primitives',
'wp-private-apis',
'wp-rich-text',
'wp-theme',
'wp-url',
'wp-warning'
),
'version' => '07c1c94f9b21baa97a96'
),
'notices.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-components',
'wp-data'
),
'version' => 'c09a068fdab0eb465e14'
),
'nux.js' => array(
'dependencies' => array(
'wp-data',
'wp-deprecated'
),
'version' => '1a78c05bba2c02820a7e'
),
'patterns.js' => array(
'dependencies' => array(
'react',
'react-dom',
'react-jsx-runtime',
'wp-a11y',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-element',
'wp-html-entities',
'wp-i18n',
'wp-notices',
'wp-primitives',
'wp-private-apis',
'wp-theme',
'wp-url'
),
'version' => 'be5af192f57cc14d340f'
),
'plugins.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-compose',
'wp-deprecated',
'wp-element',
'wp-hooks',
'wp-is-shallow-equal',
'wp-primitives'
),
'version' => '673d1e05ca49004ab160'
),
'preferences.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-a11y',
'wp-components',
'wp-compose',
'wp-data',
'wp-deprecated',
'wp-element',
'wp-i18n',
'wp-preferences-persistence',
'wp-primitives',
'wp-private-apis'
),
'version' => '5a169e3fc0e657f74172'
),
'preferences-persistence.js' => array(
'dependencies' => array(
'wp-api-fetch'
),
'version' => 'a34abbdacd8f50f9acb1'
),
'primitives.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-element'
),
'version' => '44cc5a35c7b9fe07a838'
),
'priority-queue.js' => array(
'dependencies' => array(
),
'version' => '6c0aa59b65d55dfd509b'
),
'private-apis.js' => array(
'dependencies' => array(
),
'version' => 'eb85f28c4c729bb4f002'
),
'react-i18n.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-element',
'wp-i18n'
),
'version' => 'ba2bd3d7a3817f0494af'
),
'redux-routine.js' => array(
'dependencies' => array(
),
'version' => 'acca2b4857d83ad1790e'
),
'reusable-blocks.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-core-data',
'wp-data',
'wp-deprecated',
'wp-element',
'wp-i18n',
'wp-notices',
'wp-primitives',
'wp-url'
),
'version' => '5161508c6662b8490ee8'
),
'rich-text.js' => array(
'dependencies' => array(
'wp-a11y',
'wp-compose',
'wp-data',
'wp-deprecated',
'wp-dom',
'wp-element',
'wp-escape-html',
'wp-i18n',
'wp-keycodes',
'wp-private-apis'
),
'version' => '3e5852e42cee1c239bae'
),
'router.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-compose',
'wp-element',
'wp-private-apis',
'wp-url'
),
'version' => 'dda75cd9ff9d7e0eb19f'
),
'server-side-render.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-api-fetch',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-data',
'wp-element',
'wp-i18n',
'wp-url'
),
'version' => '83e806a0634df6b93530'
),
'shortcode.js' => array(
'dependencies' => array(
),
'version' => 'f6273476300cc5fad4cd'
),
'style-engine.js' => array(
'dependencies' => array(
),
'version' => '914befb08774033e6265'
),
'theme.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-compose',
'wp-deprecated',
'wp-element',
'wp-private-apis'
),
'version' => '56a75cc08ae66c1fcb7a'
),
'token-list.js' => array(
'dependencies' => array(
),
'version' => 'e86ab419d8302d57822c'
),
'undo-manager.js' => array(
'dependencies' => array(
'wp-is-shallow-equal'
),
'version' => '4554fce6276d8910a4ae'
),
'upload-media.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-blob',
'wp-compose',
'wp-data',
'wp-element',
'wp-i18n',
'wp-private-apis',
'wp-url'
),
'module_dependencies' => array(
array(
'id' => '@wordpress/video-conversion/worker',
'import' => 'dynamic'
),
array(
'id' => '@wordpress/vips/worker',
'import' => 'dynamic'
)
),
'version' => 'a2c026d433c295fd5145'
),
'url.js' => array(
'dependencies' => array(
),
'version' => '7b0de086d4ae11d55704'
),
'viewport.js' => array(
'dependencies' => array(
'wp-compose',
'wp-data',
'wp-element'
),
'version' => 'a56e3489ed4faeac7720'
),
'warning.js' => array(
'dependencies' => array(
),
'version' => 'a0978839debc564a6608'
),
'widgets.js' => array(
'dependencies' => array(
'react-jsx-runtime',
'wp-api-fetch',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-element',
'wp-i18n',
'wp-notices',
'wp-primitives'
),
'version' => '087235ca647aa1a33227'
),
'wordcount.js' => array(
'dependencies' => array(
),
'version' => 'f0b1f0e977b2ff6e0132'
)
);