[!!!][TASK] Drop core 7->8 auto TCA migrations 45/59445/4
authorChristian Kuhn <lolli@schwarzbu.ch>
Tue, 15 Jan 2019 14:09:46 +0000 (15:09 +0100)
committerGeorg Ringer <georg.ringer@gmail.com>
Wed, 16 Jan 2019 07:03:36 +0000 (08:03 +0100)
Auto TCA migrations are now handled identical to
core upgrade wizards: They are kept for two versions.
The patch thus removes all TCA auto migrations
that applied if upgrading from v7 to v8 in current
v10 master. Along other stuff, especially the old
TCA 'wizard' stuff is no longer migrated to the
new syntax.

Resolves: #87447
Related: #87335
Releases: master
Change-Id: I05d795ef5c2c36bae3654d81eab5b82b4d3a2fa0
Reviewed-on: https://review.typo3.org/59445
Tested-by: TYPO3com <noreply@typo3.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
typo3/sysext/backend/Tests/UnitDeprecated/Form/FormDataProvider/TcaFlexPrepareTest.php
typo3/sysext/core/Classes/Migrations/TcaMigration.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-87193-DeprecatedFunctionalityRemoved.rst
typo3/sysext/core/Tests/Unit/Migrations/TcaMigrationTest.php

index 90b37d4..74af15f 100644 (file)
@@ -94,9 +94,6 @@ class TcaFlexPrepareTest extends UnitTestCase
                                                             <TCEforms>
                                                                 <label>aFlexFieldLabel</label>
                                                                 <config>
-                                                                    <type>input</type>
-                                                                    <renderType>inputDateTime</renderType>
-                                                                    <max>42</max>
                                                                 </config>
                                                             </TCEforms>
                                                         </aFlexField>
@@ -127,8 +124,7 @@ class TcaFlexPrepareTest extends UnitTestCase
                             'aFlexField' => [
                                 'label' => 'aFlexFieldLabel',
                                 'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'inputDateTime',
+                                    'type' => 'none',
                                 ],
                             ],
                         ],
@@ -181,9 +177,6 @@ class TcaFlexPrepareTest extends UnitTestCase
                                                                             <TCEforms>
                                                                                 <label>aFlexFieldLabel</label>
                                                                                 <config>
-                                                                                    <type>input</type>
-                                                                                    <renderType>inputDateTime</renderType>
-                                                                                    <max>42</max>
                                                                                 </config>
                                                                             </TCEforms>
                                                                         </aFlexField>
@@ -227,8 +220,7 @@ class TcaFlexPrepareTest extends UnitTestCase
                                             'aFlexField' => [
                                                 'label' => 'aFlexFieldLabel',
                                                 'config' => [
-                                                    'type' => 'input',
-                                                    'renderType' => 'inputDateTime',
+                                                    'type' => 'none',
                                                 ],
                                             ],
                                         ],
index a87cf1e..e8273a8 100644 (file)
@@ -15,8 +15,6 @@ namespace TYPO3\CMS\Core\Migrations;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-
 /**
  * Migrate TCA from old to new syntax. Used in bootstrap and Flex Form Data Structures.
  *
@@ -49,36 +47,9 @@ class TcaMigration
         $this->validateTcaType($tca);
 
         $tca = $this->migrateColumnsConfig($tca);
-        $tca = $this->migrateDefaultExtrasRteTransFormOptions($tca);
-        $tca = $this->migrateSelectTreeOptions($tca);
-        $tca = $this->migrateTSconfigSoftReferences($tca);
-        $tca = $this->migrateShowIfRteOption($tca);
-        $tca = $this->migrateWorkspacesOptions($tca);
-        $tca = $this->migrateTranslationTable($tca);
-        $tca = $this->migrateL10nModeDefinitions($tca);
-        $tca = $this->migratePageLocalizationDefinitions($tca);
-        $tca = $this->migrateInlineLocalizationMode($tca);
-        $tca = $this->migrateRequestUpdate($tca);
-        $tca = $this->migrateInputDateTimeToRenderType($tca);
-        $tca = $this->migrateWizardEnableByTypeConfigToColumnsOverrides($tca);
-        $tca = $this->migrateColorPickerWizardToRenderType($tca);
-        $tca = $this->migrateSelectWizardToValuePicker($tca);
-        $tca = $this->migrateSliderWizardToSliderConfiguration($tca);
-        $tca = $this->migrateLinkWizardToRenderTypeAndFieldControl($tca);
-        $tca = $this->migrateEditWizardToFieldControl($tca);
-        $tca = $this->migrateAddWizardToFieldControl($tca);
-        $tca = $this->migrateListWizardToFieldControl($tca);
-        $tca = $this->migrateLastPiecesOfDefaultExtras($tca);
-        $tca = $this->migrateTableWizardToRenderType($tca);
-        $tca = $this->migrateFullScreenRichtextToFieldControl($tca);
-        $tca = $this->migrateSuggestWizardTypeGroup($tca);
-        $tca = $this->migrateOptionsOfTypeGroup($tca);
-        $tca = $this->migrateSelectShowIconTable($tca);
-        $tca = $this->migrateImageManipulationConfig($tca);
-        $tca = $this->migrateInputDateTimeMax($tca);
-        $tca = $this->migrateInlineOverrideChildTca($tca);
         $tca = $this->migrateLocalizeChildrenAtParentLocalization($tca);
         $tca = $this->migratePagesLanguageOverlayRemoval($tca);
+
         return $tca;
     }
 
@@ -142,1789 +113,6 @@ class TcaMigration
     }
 
     /**
-     * Migrate defaultExtras "richtext:rte_transform[mode=ts_css]" and similar stuff like
-     * "richtext:rte_transform[mode=ts_css]" to "richtext:rte_transform"
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migrateDefaultExtrasRteTransFormOptions(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (isset($fieldConfig['defaultExtras'])) {
-                    $originalValue = $fieldConfig['defaultExtras'];
-                    $defaultExtrasArray = GeneralUtility::trimExplode(':', $originalValue, true);
-                    $isRichtextField = false;
-                    foreach ($defaultExtrasArray as $defaultExtrasField) {
-                        if (strpos($defaultExtrasField, 'richtext') === 0) {
-                            $isRichtextField = true;
-                            $fieldConfig['config']['enableRichtext'] = true;
-                            $fieldConfig['config']['richtextConfiguration'] = 'default';
-                        }
-                    }
-                    if ($isRichtextField) {
-                        unset($fieldConfig['defaultExtras']);
-                        $this->messages[] = 'RTE configuration via \'defaultExtras\' options are deprecated. String "' . $originalValue . '" in TCA'
-                            . ' ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'defaultExtras\'] was changed to'
-                            . ' options in ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                    }
-                }
-            }
-        }
-
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['types']) || !is_array($tableDefinition['types'])) {
-                continue;
-            }
-            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                if (!isset($typeArray['columnsOverrides']) || !is_array($typeArray['columnsOverrides'])) {
-                    continue;
-                }
-                foreach ($typeArray['columnsOverrides'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['defaultExtras'])) {
-                        $originalValue = $fieldConfig['defaultExtras'];
-                        $defaultExtrasArray = GeneralUtility::trimExplode(':', $originalValue, true);
-                        $isRichtextField = false;
-                        foreach ($defaultExtrasArray as $defaultExtrasField) {
-                            if (strpos($defaultExtrasField, 'richtext') === 0) {
-                                $isRichtextField = true;
-                                $fieldConfig['config']['enableRichtext'] = true;
-                                $fieldConfig['config']['richtextConfiguration'] = 'default';
-                            }
-                        }
-                        if ($isRichtextField) {
-                            unset($fieldConfig['defaultExtras']);
-                            $this->messages[] = 'RTE configuration via \'defaultExtras\' options are deprecated. String "' . $originalValue . '" in TCA'
-                                . ' ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'defaultExtras\']' .
-                                ' was changed to options in ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrates selectTree fields deprecated options
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateSelectTreeOptions(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (isset($fieldConfig['config']['renderType']) && $fieldConfig['config']['renderType'] === 'selectTree') {
-                    if (isset($fieldConfig['config']['treeConfig']['appearance']['width'])) {
-                        $this->messages[] = 'The selectTree field [\'treeConfig\'][\'appearance\'][\'width\'] setting is deprecated'
-                                    . ' and was removed in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . '[\'treeConfig\'][\'appearance\'][\'width\'] ';
-                        unset($fieldConfig['config']['treeConfig']['appearance']['width']);
-                    }
-
-                    if (isset($fieldConfig['config']['treeConfig']['appearance']['allowRecursiveMode'])) {
-                        $this->messages[] = 'The selectTree field [\'treeConfig\'][\'appearance\'][\'allowRecursiveMode\'] setting is deprecated'
-                                    . ' and was removed in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . '[\'treeConfig\'][\'appearance\'][\'allowRecursiveMode\'] ';
-                        unset($fieldConfig['config']['treeConfig']['appearance']['allowRecursiveMode']);
-                    }
-
-                    if (isset($fieldConfig['config']['autoSizeMax'])) {
-                        $this->messages[] = 'The selectTree field [\'autoSizeMax\'] setting is deprecated'
-                                    . ' and was removed in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'autoSizeMax\'].'
-                                    . ' The \'size\' value was adapted to the previous autoSizeMax value';
-                        $fieldConfig['config']['size'] = $fieldConfig['config']['autoSizeMax'];
-                        unset($fieldConfig['config']['autoSizeMax']);
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Migrates selectTree fields deprecated options
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateTSconfigSoftReferences(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (isset($fieldConfig['config'])) {
-                    if (isset($fieldConfig['config']['softref'])) {
-                        $softReferences = array_flip(GeneralUtility::trimExplode(',', $fieldConfig['config']['softref']));
-                        $changed = false;
-                        if (isset($softReferences['TSconfig'])) {
-                            $changed = true;
-                            unset($softReferences['TSconfig']);
-                        }
-                        if (isset($softReferences['TStemplate'])) {
-                            $changed = true;
-                            unset($softReferences['TStemplate']);
-                        }
-                        if ($changed) {
-                            if (!empty($softReferences)) {
-                                $softReferences = array_flip($softReferences);
-                                $fieldConfig['config']['softref'] = implode(',', $softReferences);
-                            } else {
-                                unset($fieldConfig['config']['softref']);
-                            }
-                            $this->messages[] = 'The soft reference setting using \'TSconfig\' and '
-                                . '\'TStemplate\' was removed in TCA ' . $table . '[\'columns\']'
-                                . '[\'' . $fieldName . '\'][\'config\'][\'softref\']';
-                        }
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Removes the option "showIfRTE" for TCA type "check"
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateShowIfRteOption(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (isset($fieldConfig['config']) && $fieldConfig['config']['type'] === 'check') {
-                    if (isset($fieldConfig['config']['showIfRTE'])) {
-                        unset($fieldConfig['config']['showIfRTE']);
-                        $this->messages[] = 'The TCA setting \'showIfRTE\' was removed '
-                            . 'in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Casts "versioningWS" to bool, and removes "versioning_followPages"
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateWorkspacesOptions(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['ctrl']['versioningWS']) && !is_bool($tableDefinition['ctrl']['versioningWS'])) {
-                $tableDefinition['ctrl']['versioningWS'] = (bool)$tableDefinition['ctrl']['versioningWS'];
-                $this->messages[] = 'The TCA setting \'versioningWS\' was set to a boolean value '
-                    . 'in TCA ' . $table . '[\'ctrl\'][\'versioningWS\']';
-            }
-            if (isset($tableDefinition['ctrl']['versioning_followPages']) && !empty($tableDefinition['ctrl']['versioning_followPages'])) {
-                unset($tableDefinition['ctrl']['versioning_followPages']);
-                $this->messages[] = 'The TCA setting \'versioning_followPages\' was removed as it is unused '
-                    . 'in TCA ' . $table . '[\'ctrl\'][\'versioning_followPages\']';
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Removes "transForeignTable" and "transOrigPointerTable" which has been
-     * used for tables "pages" and "pages_languages_overlay" in the core only.
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateTranslationTable(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!empty($tableDefinition['ctrl']['transForeignTable'])) {
-                unset($tableDefinition['ctrl']['transForeignTable']);
-                $this->messages[] = 'The TCA setting \'transForeignTable\' was removed '
-                    . 'in TCA ' . $table . '[\'ctrl\'][\'transForeignTable\']';
-            }
-            if (!empty($tableDefinition['ctrl']['transOrigPointerTable'])) {
-                unset($tableDefinition['ctrl']['transOrigPointerTable']);
-                $this->messages[] = 'The TCA setting \'transOrigPointerTable\' was removed '
-                    . 'in TCA ' . $table . '[\'ctrl\'][\'transOrigPointerTable\']';
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Removes "noCopy" from possible settings for "l10n_mode" for each column.
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migrateL10nModeDefinitions(array $tca)
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (empty($fieldConfig['l10n_mode'])) {
-                    continue;
-                }
-                if ($fieldConfig['l10n_mode'] === 'noCopy') {
-                    unset($fieldConfig['l10n_mode']);
-                    $this->messages[] = 'The TCA setting \'noCopy\' was removed '
-                        . 'in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'l10n_mode\']';
-                }
-                if (!empty($fieldConfig['l10n_mode']) && $fieldConfig['l10n_mode'] === 'mergeIfNotBlank') {
-                    unset($fieldConfig['l10n_mode']);
-                    if (empty($fieldConfig['config']['behaviour']['allowLanguageSynchronization'])) {
-                        $fieldConfig['config']['behaviour']['allowLanguageSynchronization'] = true;
-                    }
-                    $this->messages[] = 'The TCA setting \'mergeIfNotBlank\' was removed '
-                        . 'in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'l10n_mode\']'
-                        . ' and changed to ' . $table . '[\'columns\'][\'' . $fieldName . '\']'
-                        . '[\'config\'][\'behaviour\'][\'allowLanguageSynchronization\'] = true';
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Migrates localization definitions such as "allowLanguageSynchronization"
-     * or "l10n_mode" for tables pages and pages_language_overlay.
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migratePageLocalizationDefinitions(array $tca)
-    {
-        if (
-            empty($tca['pages_language_overlay']['columns'])
-        ) {
-            return $tca;
-        }
-
-        // ensure, that localization settings are defined for
-        // pages and not for pages_language_overlay
-        foreach ($tca['pages_language_overlay']['columns'] as $fieldName => &$fieldConfig) {
-            $l10nMode = $fieldConfig['l10n_mode'] ?? null;
-            $allowLanguageSynchronization = $fieldConfig['config']['behaviour']['allowLanguageSynchronization'] ?? null;
-
-            $oppositeFieldConfig = $tca['pages']['columns'][$fieldName] ?? [];
-            $oppositeL10nMode = $oppositeFieldConfig['l10n_mode'] ?? null;
-            $oppositeAllowLanguageSynchronization = $oppositeFieldConfig['config']['behaviour']['allowLanguageSynchronization'] ?? null;
-
-            if ($l10nMode !== null) {
-                if (!empty($oppositeFieldConfig) && $oppositeL10nMode !== 'exclude') {
-                    $tca['pages']['columns'][$fieldName]['l10n_mode'] = $l10nMode;
-                    $this->messages[] = 'The TCA setting \'l10n_mode\' was migrated '
-                        . 'to TCA pages[\'columns\'][\'' . $fieldName . '\'][\'l10n_mode\'] '
-                        . 'from TCA pages_language_overlay[\'columns\'][\'' . $fieldName . '\'][\'l10n_mode\']';
-                }
-            }
-
-            if (!empty($allowLanguageSynchronization) && empty($oppositeAllowLanguageSynchronization)) {
-                $tca['pages']['columns'][$fieldName]['config']['behaviour']['allowLanguageSynchronization'] = (bool)$allowLanguageSynchronization;
-                $this->messages[] = 'The TCA setting \'allowLanguageSynchronization\' was migrated '
-                    . 'to TCA pages[\'columns\'][\'' . $fieldName . '\']'
-                    . '[\'config\'][\'behaviour\'][\'allowLanguageSynchronization\'] '
-                    . 'from TCA pages_language_overlay[\'columns\'][\'' . $fieldName . '\']'
-                    . '[\'config\'][\'behaviour\'][\'allowLanguageSynchronization\']';
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Removes "localizationMode" set to "keep" if used in combination with
-     * "allowLanguageSynchronization" - in general "localizationMode" is
-     * deprecated since TYPO3 CMS 8 and will be removed in TYPO3 v9.
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateInlineLocalizationMode(array $tca)
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (($fieldConfig['config']['type'] ?? null) !== 'inline') {
-                    continue;
-                }
-
-                $inlineLocalizationMode = ($fieldConfig['config']['behaviour']['localizationMode'] ?? null);
-                if ($inlineLocalizationMode === null) {
-                    continue;
-                }
-
-                $allowLanguageSynchronization = ($fieldConfig['config']['behaviour']['allowLanguageSynchronization'] ?? null);
-                if ($inlineLocalizationMode === 'keep' && $allowLanguageSynchronization) {
-                    unset($fieldConfig['config']['behaviour']['localizationMode']);
-                    $this->messages[] = 'The TCA setting \'localizationMode\' is counter-productive '
-                        . ' if being used in combination with \'allowLanguageSynchronization\' and '
-                        . ' thus has been removed from TCA for ' . $table . '[\'columns\']'
-                        . '[\'' . $fieldName . '\'][\'config\'][\'behaviour\'][\'localizationMode\']';
-                } else {
-                    $this->messages[] = 'The TCA setting \'localizationMode\' is deprecated '
-                        . ' and should be removed from TCA for ' . $table . '[\'columns\']'
-                        . '[\'' . $fieldName . '\'][\'config\'][\'behaviour\'][\'localizationMode\']';
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Move ['ctrl']['requestUpdate'] to 'onChange => "reload"' of single fields
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateRequestUpdate(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!empty($tableDefinition['ctrl']['requestUpdate'])) {
-                $fields = GeneralUtility::trimExplode(',', $tableDefinition['ctrl']['requestUpdate']);
-                foreach ($fields as $field) {
-                    if (isset($tableDefinition['columns'][$field])) {
-                        $tableDefinition['columns'][$field]['onChange'] = 'reload';
-                    }
-                }
-                $this->messages[] = 'The TCA setting [\'ctrl\'][\'requestUpdate\'] was removed from '
-                    . ' table ' . $table . '. The column field(s) "' . implode('" and "', $fields) . '" were updated'
-                    . ' and contain option "\'onChange\' => \'reload\'" parallel to \'config\' and \'label\' section.';
-                unset($tableDefinition['ctrl']['requestUpdate']);
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Move all type=input with eval=date/time configuration to an own renderType
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migrateInputDateTimeToRenderType(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] !== 'input') {
-                    continue;
-                }
-                $eval = $fieldConfig['config']['eval'] ?? '';
-                $eval = GeneralUtility::trimExplode(',', $eval, true);
-                if (in_array('date', $eval, true)
-                    || in_array('datetime', $eval, true)
-                    || in_array('time', $eval, true)
-                    || in_array('timesec', $eval, true)
-                ) {
-                    if (!isset($fieldConfig['config']['renderType'])) {
-                        $fieldConfig['config']['renderType'] = 'inputDateTime';
-                        $this->messages[] = 'The TCA setting \'renderType\' => \'inputDateTime\' was added '
-                            . 'in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Wizards configuration may hold "enableByTypeConfig" and are then enabled
-     * for certain types via "defaultExtras".
-     * Find wizards configured like that and migrate them to "columnsOverrides"
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    public function migrateWizardEnableByTypeConfigToColumnsOverrides(array $tca): array
-    {
-        $newTca = $tca;
-        foreach ($tca as $table => $tableDefinition) {
-            if (!isset($tableDefinition['columns']) || !is_array($tableDefinition['columns'])) {
-                continue;
-            }
-            foreach ($tableDefinition['columns'] as $fieldName => $fieldConfig) {
-                if (
-                    !empty($fieldConfig['config']['type']) // type is set
-                    && isset($fieldConfig['config']['wizards'])
-                    && is_array($fieldConfig['config']['wizards']) // and there are wizards
-                ) {
-                    foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                        if (isset($wizardConfig['enableByTypeConfig']) // and enableByTypeConfig is given
-                            && $wizardConfig['enableByTypeConfig'] // and enabled
-                        ) { // and enableByTypeConfig is enabled
-                            // Remove this "enableByTypeConfig" wizard from columns
-                            unset($newTca[$table]['columns'][$fieldName]['config']['wizards'][$wizardName]);
-                            if (!isset($tableDefinition['types']) || !is_array($tableDefinition['types'])) {
-                                // No type definition at all ... continue directly
-                                continue;
-                            }
-                            foreach ($tableDefinition['types'] as $typeName => $typeArray) {
-                                if (empty($typeArray['columnsOverrides'][$fieldName]['defaultExtras'])
-                                    || strpos($typeArray['columnsOverrides'][$fieldName]['defaultExtras'], $wizardName) === false
-                                ) {
-                                    // Continue directly if this wizard is not enabled for given type
-                                    continue;
-                                }
-                                $defaultExtras = $typeArray['columnsOverrides'][$fieldName]['defaultExtras'];
-                                $defaultExtrasArray = GeneralUtility::trimExplode(':', $defaultExtras, true);
-                                $newDefaultExtrasArray = [];
-                                foreach ($defaultExtrasArray as $fieldExtraField) {
-                                    if (strpos($fieldExtraField, 'wizards[') === 0) {
-                                        $enabledWizards = substr($fieldExtraField, 8, strlen($fieldExtraField) - 8); // Cut off "wizards[
-                                        $enabledWizards = substr($enabledWizards, 0, strlen($enabledWizards) - 1);
-                                        $enabledWizardsArray = GeneralUtility::trimExplode('|', $enabledWizards, true);
-                                        foreach ($enabledWizardsArray as $enabledWizardName) {
-                                            if ($enabledWizardName === $wizardName) {
-                                                // Fill new array
-                                                unset($newTca[$table]['types'][$typeName]['columnsOverrides'][$fieldName]['defaultExtras']);
-                                                $newTca[$table]['types'][$typeName]['columnsOverrides'][$fieldName]['config']['wizards'][$enabledWizardName] = $wizardConfig;
-                                                unset($newTca[$table]['types'][$typeName]['columnsOverrides'][$fieldName]['config']['wizards'][$enabledWizardName]['enableByTypeConfig']);
-                                                $this->messages[] = 'The wizard with "enableByTypeConfig" set to 1 has been migrated to \'columnsOverrides\'.'
-                                                    . ' It has been migrated from "'
-                                                . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']" to '
-                                                . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\'].';
-                                            }
-                                        }
-                                    } else {
-                                        $newDefaultExtrasArray[] = $fieldExtraField;
-                                    }
-                                }
-                                if ($defaultExtrasArray !== $newDefaultExtrasArray
-                                    && !empty($newDefaultExtrasArray)
-                                ) {
-                                    $newTca[$table]['types'][$typeName]['columnsOverrides'][$fieldName]['defaultExtras'] = implode(':', $newDefaultExtrasArray);
-                                }
-                            }
-                        } elseif (isset($wizardConfig['enableByTypeConfig'])) {
-                            // enableByTypeConfig is set, but not true or 1 or '1', just delete it.
-                            unset($newTca[$table]['columns'][$fieldName]['config']['wizards'][$wizardName]['enableByTypeConfig']);
-                        }
-                    }
-                }
-            }
-        }
-        return $newTca;
-    }
-
-    /**
-     * Migrates fields having a colorpicker wizard to a color field
-     *
-     * @param array $tca Incoming TCA
-     * @return array Migrated TCA
-     */
-    protected function migrateColorPickerWizardToRenderType(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config'])) {
-                        // Do not handle field where the render type is set.
-                        if (!empty($fieldConfig['config']['renderType'])) {
-                            continue;
-                        }
-                        if ($fieldConfig['config']['type'] === 'input') {
-                            if (isset($fieldConfig['config']['wizards']) && is_array($fieldConfig['config']['wizards'])) {
-                                foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizard) {
-                                    if (isset($wizard['type']) && ($wizard['type'] === 'colorbox')) {
-                                        unset($fieldConfig['config']['wizards'][$wizardName]);
-                                        if (empty($fieldConfig['config']['wizards'])) {
-                                            unset($fieldConfig['config']['wizards']);
-                                        }
-                                        $fieldConfig['config']['renderType'] = 'colorpicker';
-                                        $this->messages[] = 'The color-picker wizard using \'colorbox\' is deprecated'
-                                            . ' in TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                            . '[\'wizards\'][\'' . $wizardName . '\'] and was changed to ' . $table
-                                            . '[\'columns\'][\'' . $fieldName . '\'][\'config\'] = \'colorpicker\'';
-                                    }
-                                }
-                            }
-                            if (empty($fieldConfig['config']['wizards'])) {
-                                unset($fieldConfig['config']['wizards']);
-                            }
-                            if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                                foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                    if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                        if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                            && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        ) {
-                                            foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                                if (isset($wizard['type']) && ($wizard['type'] === 'colorbox')) {
-                                                    unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['type'] = 'input';
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['renderType'] = 'colorpicker';
-                                                    $this->messages[] = 'The color-picker wizard in columnsOverrides using \'colorbox\' has been migrated to a \'rendertype\' = \'colorpicker\'.'
-                                                        . ' It has been migrated from TCA "' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                        . '[\'wizards\'][\'' . $wizardName . '\'][\'type\'] = \'colorbox\'"" to "' . $table
-                                                        . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'renderType\'] = \'colorpicker\'"';
-                                                }
-                                            }
-                                            if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Move type=input with select wizard to config['valuePicker']
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migrateSelectWizardToValuePicker(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'input' || $fieldConfig['config']['type'] === 'text')) {
-                        if (isset($fieldConfig['config']['wizards']) && is_array($fieldConfig['config']['wizards'])) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'select'
-                                    && isset($wizardConfig['items'])
-                                    && is_array($wizardConfig['items'])
-                                ) {
-                                    $fieldConfig['config']['valuePicker']['items'] = $wizardConfig['items'];
-                                    if (isset($wizardConfig['mode'])
-                                        && is_string($wizardConfig['mode'])
-                                        && in_array($wizardConfig['mode'], ['append', 'prepend', ''])
-                                    ) {
-                                        $fieldConfig['config']['valuePicker']['mode'] = $wizardConfig['mode'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The select wizard in TCA '
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . ' has been migrated to '
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'valuePicker\'].';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && ($wizard['type'] === 'select')
-                                                && isset($wizard['items'])
-                                                && is_array($wizard['items'])
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['valuePicker'] = $wizard;
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['valuePicker']['type']);
-                                                $this->messages[] = 'The select wizard in columnsOverrides using \'type\' = \'select\' has been migrated'
-                                                    . ' from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\'] to ' . $table
-                                                    . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'valuePicker\']';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Move type=input with select wizard to config['valuePicker']
-     *
-     * @param array $tca
-     * @return array Migrated TCA
-     */
-    protected function migrateSliderWizardToSliderConfiguration(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'input') {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type']) && $wizardConfig['type'] === 'slider') {
-                                    $fieldConfig['config']['slider'] = [];
-                                    if (isset($wizardConfig['width'])) {
-                                        $fieldConfig['config']['slider']['width'] = $wizardConfig['width'];
-                                    }
-                                    if (isset($wizardConfig['step'])) {
-                                        $fieldConfig['config']['slider']['step'] = $wizardConfig['step'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The slider wizard in TCA '
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . ' has been migrated to '
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'slider\'].';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type']) && ($wizard['type'] === 'slider')) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['slider'] = $wizard;
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['slider']['type']);
-                                                $this->messages[] = 'The slider wizard in columnsOverrides using \'type\' = \'slider\' has been migrated'
-                                                    . ' from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\'] to ' . $table
-                                                    . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'slider\']';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return $tca;
-    }
-
-    /**
-     * Move type=input fields that have a "link" wizard to an own renderType with fieldControl
-     *
-     * @param array $tca
-     * @return array Modified TCA
-     */
-    protected function migrateLinkWizardToRenderTypeAndFieldControl(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'input'
-                        && !isset($fieldConfig['config']['renderType'])
-                    ) {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'popup'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_link'
-                                ) {
-                                    $fieldConfig['config']['renderType'] = 'inputLink';
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['linkPopup']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    if (isset($wizardConfig['JSopenParams'])) {
-                                        $fieldConfig['config']['fieldControl']['linkPopup']['options']['windowOpenParameters']
-                                            = $wizardConfig['JSopenParams'];
-                                    }
-                                    if (isset($wizardConfig['params']['blindLinkOptions'])) {
-                                        $fieldConfig['config']['fieldControl']['linkPopup']['options']['blindLinkOptions']
-                                            = $wizardConfig['params']['blindLinkOptions'];
-                                    }
-                                    if (isset($wizardConfig['params']['blindLinkFields'])) {
-                                        $fieldConfig['config']['fieldControl']['linkPopup']['options']['blindLinkFields']
-                                            = $wizardConfig['params']['blindLinkFields'];
-                                    }
-                                    if (isset($wizardConfig['params']['allowedExtensions'])) {
-                                        $fieldConfig['config']['fieldControl']['linkPopup']['options']['allowedExtensions']
-                                            = $wizardConfig['params']['allowedExtensions'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The link wizard has been migrated to a \'renderType\' => \'inputLink \'. '
-                                        . 'It has been migrated from TCA table "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']" to "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'renderType\'] = \'inputLink\'".';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'popup'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_link'
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['renderType'] = 'inputLink';
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['linkPopup']['options']['title'] = $wizard['title'];
-                                                }
-                                                if (isset($wizard['JSopenParams'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['linkPopup']['options']['windowOpenParameters']
-                                                        = $wizard['JSopenParams'];
-                                                }
-                                                if (isset($wizard['params']['blindLinkOptions'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['linkPopup']['options']['blindLinkOptions']
-                                                        = $wizard['params']['blindLinkOptions'];
-                                                }
-                                                if (isset($wizard['params']['blindLinkFields'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['linkPopup']['options']['blindLinkFields']
-                                                        = $wizard['params']['blindLinkFields'];
-                                                }
-                                                if (isset($wizard['params']['allowedExtensions'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['linkPopup']['options']['allowedExtensions']
-                                                        = $wizard['params']['allowedExtensions'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The link wizard in columnsOverrides using \'type\' = \'popup\' has been migrated to a \'renderType\' = \'inputLink\'.'
-                                                    . ' It has been migrated from TCA "' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']" to "' . $table
-                                                    . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'renderType\'] = \'inputLink\'"';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Find select and group fields with enabled edit wizard and migrate to "fieldControl"
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateEditWizardToFieldControl(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'group'
-                        || $fieldConfig['config']['type'] === 'select')
-                    ) {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])
-                        ) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'popup'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_edit'
-                                    && !isset($fieldConfig['config']['fieldControl']['editPopup'])
-                                ) {
-                                    $fieldConfig['config']['fieldControl']['editPopup']['disabled'] = false;
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['editPopup']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    if (isset($wizardConfig['JSopenParams'])) {
-                                        $fieldConfig['config']['fieldControl']['editPopup']['options']['windowOpenParameters']
-                                            = $wizardConfig['JSopenParams'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The edit wizard in TCA  has been migrated to a \'fieldControl\' = \'editPopup\' element.'
-                                        . ' It has been migrated from TCA "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']" to "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldControl\']=\'editPopup\'".';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'popup'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_edit'
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['editPopup']['disabled'] = false;
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['editPopup']['options']['title']
-                                                        = $wizard['title'];
-                                                }
-                                                if (isset($wizard['JSopenParams'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['editPopup']['options']['windowOpenParameters']
-                                                        = $wizard['JSopenParams'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The edit wizard in columnsOverrides using \'type\' = \'popup\' has been migrated to a \'fieldControl\' = \'editPopup\' element.'
-                                                    . ' It has been migrated from TCA "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']" , to "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'fieldControl\']=\'editPopup\'".';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Find select and group fields with enabled add wizard and migrate to "fieldControl"
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateAddWizardToFieldControl(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'group'
-                        || $fieldConfig['config']['type'] === 'select')
-                    ) {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])
-                        ) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'script'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_add'
-                                    && !isset($fieldConfig['config']['fieldControl']['addRecord'])
-                                ) {
-                                    $fieldConfig['config']['fieldControl']['addRecord']['disabled'] = false;
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['addRecord']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    if (isset($wizardConfig['params']['table'])) {
-                                        $fieldConfig['config']['fieldControl']['addRecord']['options']['table']
-                                            = $wizardConfig['params']['table'];
-                                    }
-                                    if (isset($wizardConfig['params']['pid'])) {
-                                        $fieldConfig['config']['fieldControl']['addRecord']['options']['pid']
-                                            = $wizardConfig['params']['pid'];
-                                    }
-                                    if (isset($wizardConfig['params']['setValue'])) {
-                                        $fieldConfig['config']['fieldControl']['addRecord']['options']['setValue']
-                                            = $wizardConfig['params']['setValue'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The add wizard in TCA has been migrated to a \'fieldControl\' = \'addRecord\' element.'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . ' It has been migrated from TCA "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldControl\']=\'addRecord\'.';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'script'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_add'
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['addRecord']['disabled'] = false;
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['addRecord']['options']['title']
-                                                        = $wizard['title'];
-                                                }
-                                                if (isset($wizard['params']['table'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['addRecord']['options']['table']
-                                                        = $wizard['params']['table'];
-                                                }
-                                                if (isset($wizard['params']['pid'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['addRecord']['options']['pid']
-                                                        = $wizard['params']['pid'];
-                                                }
-                                                if (isset($wizard['params']['setValue'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['addRecord']['options']['setValue']
-                                                        = $wizard['params']['setValue'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The add wizard in columnsOverrides using \'type\' = \'script\' has been migrated to a \'fieldControl\' = \'addRecord\' element.'
-                                                    . ' It has been migrated from TCA "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']"  to "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'fieldControl\'=\'addRecord\'".';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Find select and group fields with enabled list wizard and migrate to "fieldControl"
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateListWizardToFieldControl(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'group'
-                        || $fieldConfig['config']['type'] === 'select')
-                    ) {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])
-                        ) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'script'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_list'
-                                    && !isset($fieldConfig['config']['fieldControl']['listModule'])
-                                ) {
-                                    $fieldConfig['config']['fieldControl']['listModule']['disabled'] = false;
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['listModule']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    if (isset($wizardConfig['params']['table'])) {
-                                        $fieldConfig['config']['fieldControl']['listModule']['options']['table']
-                                            = $wizardConfig['params']['table'];
-                                    }
-                                    if (isset($wizardConfig['params']['pid'])) {
-                                        $fieldConfig['config']['fieldControl']['listModule']['options']['pid']
-                                            = $wizardConfig['params']['pid'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The list wizard in TCA has been migrated to a \'fieldControl\' = \'listModule\' element.'
-                                        . ' It has been migrated from TCA "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . '" to "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldControl\'=\'listModule\'".';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'script'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_list'
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['listModule']['disabled'] = false;
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['listModule']['options']['title']
-                                                        = $wizard['title'];
-                                                }
-                                                if (isset($wizard['params']['table'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['listModule']['options']['table']
-                                                        = $wizard['params']['table'];
-                                                }
-                                                if (isset($wizard['params']['pid'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['listModule']['options']['pid']
-                                                        = $wizard['params']['pid'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The list wizard in columnsOverrides using \'type\' = \'script\' has been migrated to a \'fieldControl\' = \'listModule\' element.'
-                                                    . ' It has been migrated from TCA "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']" to "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'fieldControl\'=\'listModule\'".';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate defaultExtras "nowrap", "enable-tab", "fixed-font". Then drop all
-     * remaining "defaultExtras", there shouldn't exist anymore.
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateLastPiecesOfDefaultExtras(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['defaultExtras'])) {
-                        $defaultExtrasArray = GeneralUtility::trimExplode(':', $fieldConfig['defaultExtras'], true);
-                        foreach ($defaultExtrasArray as $defaultExtrasSetting) {
-                            if ($defaultExtrasSetting === 'rte_only') {
-                                $this->messages[] = 'The defaultExtras setting \'rte_only\' in TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'] has been dropped, the setting'
-                                    . ' is no longer supported';
-                                continue;
-                            }
-                            if ($defaultExtrasSetting === 'nowrap') {
-                                $fieldConfig['config']['wrap'] = 'off';
-                                $this->messages[] = 'The defaultExtras setting \'nowrap\' in TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'] has been migrated to TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wrap\'] = \'off\'';
-                            } elseif ($defaultExtrasSetting === 'enable-tab') {
-                                $fieldConfig['config']['enableTabulator'] = true;
-                                $this->messages[] = 'The defaultExtras setting \'enable-tab\' in TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'] has been migrated to TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'enableTabulator\'] = true';
-                            } elseif ($defaultExtrasSetting === 'fixed-font') {
-                                $fieldConfig['config']['fixedFont'] = true;
-                                $this->messages[] = 'The defaultExtras setting \'fixed-font\' in TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'] has been migrated to TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fixedFont\'] = true';
-                            } else {
-                                $this->messages[] = 'The defaultExtras setting \'' . $defaultExtrasSetting . '\' in TCA table '
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'] is unknown and has been dropped.';
-                            }
-                        }
-                        unset($fieldConfig['defaultExtras']);
-                    }
-                }
-            }
-            if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                    if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                        foreach ($typeArray['columnsOverrides'] as $fieldName => &$overrideConfig) {
-                            if (!isset($overrideConfig['defaultExtras'])) {
-                                continue;
-                            }
-                            $defaultExtrasArray = GeneralUtility::trimExplode(':', $overrideConfig['defaultExtras'], true);
-                            foreach ($defaultExtrasArray as $defaultExtrasSetting) {
-                                if ($defaultExtrasSetting === 'rte_only') {
-                                    $this->messages[] = 'The defaultExtras setting \'rte_only\' in TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\']'
-                                        . ' has been dropped, the setting is no longer supported';
-                                    continue;
-                                }
-                                if ($defaultExtrasSetting === 'nowrap') {
-                                    $overrideConfig['config']['wrap'] = 'off';
-                                    $this->messages[] = 'The defaultExtras setting \'nowrap\' in TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\']'
-                                        . ' has been migrated to TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'wrap\'] = \'off\'';
-                                } elseif ($defaultExtrasSetting === 'enable-tab') {
-                                    $overrideConfig['config']['enableTabulator'] = true;
-                                    $this->messages[] = 'The defaultExtras setting \'enable-tab\' in TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\']'
-                                        . ' has been migrated to TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'enableTabulator\'] = true';
-                                } elseif ($defaultExtrasSetting === 'fixed-font') {
-                                    $overrideConfig['config']['fixedFont'] = true;
-                                    $this->messages[] = 'The defaultExtras setting \'fixed-font\' in TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\']'
-                                        . ' has been migrated to TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'fixedFont\'] = true';
-                                } else {
-                                    $this->messages[] = 'The defaultExtras setting \'' . $defaultExtrasSetting . '\' in TCA table '
-                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\']'
-                                        . ' is unknown and has been dropped.';
-                                }
-                            }
-                            unset($overrideConfig['defaultExtras']);
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate wizard_table script to renderType="textTable" with options in fieldControl
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateTableWizardToRenderType(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'text') {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])
-                        ) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'script'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_table'
-                                    && !isset($fieldConfig['config']['fieldControl']['tableWizard'])
-                                    && !isset($fieldConfig['config']['renderType'])
-                                ) {
-                                    $fieldConfig['config']['renderType'] = 'textTable';
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['tableWizard']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    if (isset($wizardConfig['params']['xmlOutput']) && (int)$wizardConfig['params']['xmlOutput'] !== 0) {
-                                        $fieldConfig['config']['fieldControl']['tableWizard']['options']['xmlOutput']
-                                            = (int)$wizardConfig['params']['xmlOutput'];
-                                    }
-                                    if (isset($wizardConfig['params']['numNewRows'])) {
-                                        $fieldConfig['config']['fieldControl']['tableWizard']['options']['numNewRows']
-                                            = $wizardConfig['params']['numNewRows'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The table wizard in TCA has been migrated to a \'renderType\' = \'textTable\'.'
-                                        . ' It has been migrated from TCA "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . '" to "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'renderType\'] = \'textTable\'".';
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'script'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_table'
-                                                && !isset($typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['tableWizard'])
-                                                && !isset($typeArray['columnsOverrides'][$fieldName]['config']['renderType'])
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['renderType'] = 'textTable';
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['tableWizard']['options']['title']
-                                                        = $wizard['title'];
-                                                }
-                                                if (isset($wizard['params']['xmlOutput']) && (int)$wizard['params']['xmlOutput'] !== 0) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['tableWizard']['options']['xmlOutput']
-                                                        = (int)$wizard['params']['xmlOutput'];
-                                                }
-                                                if (isset($wizard['params']['numNewRows'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['tableWizard']['options']['numNewRows']
-                                                        = $wizard['params']['numNewRows'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The table wizard in columnsOverrides using \'type\' = \'script\' has been migrated to a \'renderType\' = \'textTable\'.'
-                                                    . ' It has been migrated from TCA "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']"  to "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'renderType\'] = \'textTable\'".';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate "wizard_rte" wizards to rtehtmlarea fieldControl
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateFullScreenRichtextToFieldControl(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'text') {
-                        if (isset($fieldConfig['config']['wizards'])
-                            && is_array($fieldConfig['config']['wizards'])
-                        ) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'script'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_rte'
-                                    && !isset($fieldConfig['config']['fieldControl']['fullScreenRichtext'])
-                                    && isset($fieldConfig['config']['enableRichtext'])
-                                    && (bool)$fieldConfig['config']['enableRichtext'] === true
-                                ) {
-                                    // Field is configured for richtext, so enable the full screen wizard
-                                    $fieldConfig['config']['fieldControl']['fullScreenRichtext']['disabled'] = false;
-                                    if (isset($wizardConfig['title'])) {
-                                        $fieldConfig['config']['fieldControl']['fullScreenRichtext']['options']['title'] = $wizardConfig['title'];
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                    $this->messages[] = 'The RTE fullscreen wizard in TCA has been migrated to a \'fieldControl\' = \'fullScreenRichtext\'.'
-                                        . ' It has been migrated from TCA "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                        . '" to "'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldControl\']=\'fullScreenRichtext\'".';
-                                } elseif (isset($wizardConfig['type'])
-                                    && $wizardConfig['type'] === 'script'
-                                    && isset($wizardConfig['module']['name'])
-                                    && $wizardConfig['module']['name'] === 'wizard_rte'
-                                    && !isset($fieldConfig['config']['fieldControl']['fullScreenRichtext'])
-                                    && (
-                                        !isset($fieldConfig['config']['enableRichtext'])
-                                        || isset($fieldConfig['config']['enableRichtext']) && (bool)$fieldConfig['config']['enableRichtext'] === false
-                                    )
-                                ) {
-                                    // Wizard is given, but field is not configured for richtext
-                                    // Find types that enableRichtext and enable full screen for those types
-                                    if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                                        foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                            if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                                if (isset($typeArray['columnsOverrides'][$fieldName]['config']['enableRichtext'])
-                                                    && (bool)$typeArray['columnsOverrides'][$fieldName]['config']['enableRichtext'] === true
-                                                ) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['fullScreenRichtext']['disabled'] = false;
-                                                    if (isset($wizardConfig['title'])) {
-                                                        $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['fullScreenRichtext']['options']['title']
-                                                            = $wizardConfig['title'];
-                                                    }
-                                                    $this->messages[] = 'The RTE fullscreen wizard in TCA has been migrated to a \'fieldControl\' = \'fullScreenRichtext\'.'
-                                                        . ' It has been migrated from TCA "'
-                                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                                        . '" to "'
-                                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'fieldControl\']=\'fullScreenRichtext\'';
-                                                }
-                                            }
-                                        }
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type'])
-                                                && $wizard['type'] === 'script'
-                                                && isset($wizard['module']['name'])
-                                                && $wizard['module']['name'] === 'wizard_rte'
-                                                && !isset($typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['fullScreenRichtext'])
-                                            ) {
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['fullScreenRichtext']['disabled'] = false;
-                                                if (isset($wizard['title'])) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['fieldControl']['fullScreenRichtext']['options']['title']
-                                                        = $wizard['title'];
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                                $this->messages[] = 'The RTE fullscreen wizard in columnsOverrides using \'type\' = \'script\' has been migrated to a \'fieldControl\' = \'fullScreenRichtext\'.'
-                                                    . ' It has been migrated from TCA "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                    . '[\'wizards\'][\'' . $wizardName . '\']" to "'
-                                                    . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'fieldControl\']=\'fullScreenRichtext\'".';
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate the "suggest" wizard in type=group to "hideSuggest" and "suggestOptions"
-     *
-     * @param array $tca Given TCA
-     * @return array Modified TCA
-     */
-    protected function migrateSuggestWizardTypeGroup(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'group'
-                        && isset($fieldConfig['config']['internal_type'])
-                        && $fieldConfig['config']['internal_type'] === 'db')
-                    ) {
-                        if (isset($fieldConfig['config']['hideSuggest'])) {
-                            continue;
-                        }
-                        if (isset($fieldConfig['config']['wizards']) && is_array($fieldConfig['config']['wizards'])) {
-                            foreach ($fieldConfig['config']['wizards'] as $wizardName => $wizardConfig) {
-                                if (isset($wizardConfig['type']) && $wizardConfig['type'] === 'suggest') {
-                                    unset($wizardConfig['type']);
-                                    if (!empty($wizardConfig)) {
-                                        $fieldConfig['config']['suggestOptions'] = $wizardConfig;
-                                        $this->messages[] = 'The suggest wizard options in TCA '
-                                            . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                            . ' have been migrated to '
-                                            . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'suggestOptions\'].';
-                                    } else {
-                                        $this->messages[] = 'The suggest wizard in TCA '
-                                            . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'wizards\'][\'' . $wizardName . '\']'
-                                            . ' is enabled by default and has been removed.';
-                                    }
-                                    unset($fieldConfig['config']['wizards'][$wizardName]);
-                                }
-                            }
-                        }
-                        if (empty($fieldConfig['config']['wizards'])) {
-                            unset($fieldConfig['config']['wizards']);
-                        }
-                        if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                            foreach ($tableDefinition['types'] as $typeName => &$typeArray) {
-                                if (isset($typeArray['columnsOverrides']) && is_array($typeArray['columnsOverrides'])) {
-                                    if (isset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                        && is_array($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])
-                                    ) {
-                                        foreach ($typeArray['columnsOverrides'][$fieldName]['config']['wizards'] as $wizardName => $wizard) {
-                                            if (isset($wizard['type']) && $wizard['type'] === 'suggest'
-                                            ) {
-                                                unset($wizard['type']);
-                                                $fieldConfig['config']['hideSuggest'] = true;
-                                                $typeArray['columnsOverrides'][$fieldName]['config']['hideSuggest'] = false;
-                                                if (!empty($wizard)) {
-                                                    $typeArray['columnsOverrides'][$fieldName]['config']['suggestOptions'] = $wizard;
-                                                    $this->messages[] = 'The suggest wizard options in columnsOverrides have been migrated'
-                                                        . ' from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                        . '[\'wizards\'][\'' . $wizardName . '\'] to \'suggestOptions\' in '
-                                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']';
-                                                } else {
-                                                    $this->messages[] = 'The suggest wizard in columnsOverrides has been migrated'
-                                                        . ' from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\']'
-                                                        . '[\'wizards\'][\'' . $wizardName . '\'] to \'hideSuggest\' => false in '
-                                                        . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'config\'][\'hideSuggest\']';
-                                                }
-                                                unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards'][$wizardName]);
-                                            }
-                                        }
-                                        if (empty($typeArray['columnsOverrides'][$fieldName]['config']['wizards'])) {
-                                            unset($typeArray['columnsOverrides'][$fieldName]['config']['wizards']);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate some detail options of type=group config
-     *
-     * @param array $tca Given TCA
-     * @return array Modified TCA
-     */
-    protected function migrateOptionsOfTypeGroup(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'group') {
-                        if (isset($fieldConfig['config']['selectedListStyle'])) {
-                            unset($fieldConfig['config']['selectedListStyle']);
-                            $this->messages[] = 'The \'type\' = \'group\' option \'selectedListStyle\' is obsolete and has been dropped'
-                                . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                        }
-                        if (isset($fieldConfig['config']['show_thumbs'])) {
-                            if ((bool)$fieldConfig['config']['show_thumbs'] === false && $fieldConfig['config']['internal_type'] === 'db') {
-                                $fieldConfig['config']['fieldWizard']['recordsOverview']['disabled'] = true;
-                                $this->messages[] = 'The \'type\' = \'group\' option \'show_thumbs\' = false is obsolete'
-                                    . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . ' and has been migrated to'
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldWizard\'][\'recordsOverview\'][\'disabled\'] = true';
-                            } elseif ((bool)$fieldConfig['config']['show_thumbs'] === false && $fieldConfig['config']['internal_type'] === 'file') {
-                                $fieldConfig['config']['fieldWizard']['fileThumbnails']['disabled'] = true;
-                                $this->messages[] = 'The \'type\' = \'group\' option \'show_thumbs\' = false is obsolete'
-                                    . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . ' and has been migrated to'
-                                    . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldWizard\'][\'fileThumbnails\'][\'disabled\'] = true';
-                            } else {
-                                $this->messages[] = 'The \'type\' = \'group\' option \'show_thumbs\' is obsolete and has been dropped'
-                                    . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']';
-                            }
-                            unset($fieldConfig['config']['show_thumbs']);
-                        }
-                        if (isset($fieldConfig['config']['disable_controls']) && is_string($fieldConfig['config']['disable_controls'])) {
-                            $controls = GeneralUtility::trimExplode(',', $fieldConfig['config']['disable_controls'], true);
-                            foreach ($controls as $control) {
-                                if ($control === 'browser') {
-                                    $fieldConfig['config']['fieldControl']['elementBrowser']['disabled'] = true;
-                                    $this->messages[] = 'The \'type\' = \'group\' option \'disable_controls\' = \'browser\''
-                                        . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                        . ' and has been migrated to'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldControl\'][\'elementBrowser\'][\'disabled\'] = true';
-                                } elseif ($control === 'delete') {
-                                    $this->messages[] = 'The \'type\' = \'group\' option \'disable_controls\' = \'delete\''
-                                        . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                        . ' and has been migrated to'
-                                        . $table . '[\'columns\'][\' . $fieldName . \'][\'config\'][\'hideDeleteIcon\'] = true';
-                                    $fieldConfig['config']['hideDeleteIcon'] = true;
-                                } elseif ($control === 'allowedTables') {
-                                    $fieldConfig['config']['fieldWizard']['tableList']['disabled'] = true;
-                                    $this->messages[] = 'The \'type\' = \'group\' option \'disable_controls\' = \'allowedTables\''
-                                        . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                        . ' and has been migrated to'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldWizard\'][\'tableList\'][\'disabled\'] = true';
-                                } elseif ($control === 'upload') {
-                                    $fieldConfig['config']['fieldWizard']['fileUpload']['disabled'] = true;
-                                    $this->messages[] = 'The \'type\' = \'group\' option \'disable_controls\' = \'upload\''
-                                        . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                        . ' and has been migrated to'
-                                        . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'fieldWizard\'][\'fileUpload\'][\'disabled\'] = true';
-                                }
-                            }
-                            unset($fieldConfig['config']['disable_controls']);
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate "showIconTable" to a field wizard, drop selicon_cols
-     *
-     * @param array $tca Given TCA
-     * @return array Modified TCA
-     */
-    protected function migrateSelectShowIconTable(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && ($fieldConfig['config']['type'] === 'select'
-                        && isset($fieldConfig['config']['renderType'])
-                        && $fieldConfig['config']['renderType'] === 'selectSingle')
-                    ) {
-                        if (isset($fieldConfig['config']['showIconTable'])) {
-                            if ((bool)$fieldConfig['config']['showIconTable'] === true) {
-                                $fieldConfig['config']['fieldWizard']['selectIcons']['disabled'] = false;
-                                $this->messages[] = 'The \'type\' = \'select\' option \'showIconTable\' = true is obsolete'
-                                    . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . ' and has been migrated to'
-                                    . ' [\'config\'][\'fieldWizard\'][\'selectIcons\'][\'disabled\'] = false';
-                            } else {
-                                $this->messages[] = 'The \'type\' = \'group\' option \'showIconTable\' = false is obsolete'
-                                    . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                    . ' and has been removed.';
-                            }
-                            unset($fieldConfig['config']['showIconTable']);
-                        }
-                        if (isset($fieldConfig['config']['selicon_cols'])) {
-                            unset($fieldConfig['config']['selicon_cols']);
-                            $this->messages[] = 'The \'type\' = \'group\' option \'selicon_cols\' = false is obsolete'
-                                . ' from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']'
-                                . ' and has been removed.';
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate imageManipulation "ratio" config to new "cropVariant" config
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateImageManipulationConfig(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'imageManipulation') {
-                        if (isset($fieldConfig['config']['enableZoom'])) {
-                            unset($fieldConfig['config']['enableZoom']);
-                            $this->messages[] = sprintf(
-                                'The config option "enableZoom" has been removed from TCA type "imageManipulation" in table "%s" and field "%s"',
-                                $table,
-                                $fieldName
-                            );
-                        }
-                        if (isset($fieldConfig['config']['ratios'])) {
-                            $legacyRatios = $fieldConfig['config']['ratios'];
-                            unset($fieldConfig['config']['ratios']);
-                            if (isset($fieldConfig['config']['cropVariants'])) {
-                                $this->messages[] = sprintf(
-                                    'The config option "ratios" has been deprecated and cannot be used together with the option "cropVariants" in table "%s" and field "%s"',
-                                    $table,
-                                    $fieldName
-                                );
-                                continue;
-                            }
-                            $fieldConfig['config']['cropVariants']['default'] = [
-                                'title' => 'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.crop_variant.default',
-                                'allowedAspectRatios' => [],
-                                'cropArea' => [
-                                    'x' => 0.0,
-                                    'y' => 0.0,
-                                    'width' => 1.0,
-                                    'height' => 1.0,
-                                ],
-                            ];
-                            foreach ($legacyRatios as $ratio => $ratioLabel) {
-                                $ratio = (float)$ratio;
-                                $ratioId = number_format($ratio, 2);
-                                $fieldConfig['config']['cropVariants']['default']['allowedAspectRatios'][$ratioId] = [
-                                    'title' => $ratioLabel,
-                                    'value' => $ratio,
-                                ];
-                            }
-                            $this->messages[] = sprintf(
-                                'Migrated config option "ratios" of type "imageManipulation" to option "cropVariants" in table "%s" and field "%s"',
-                                $table,
-                                $fieldName
-                            );
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate 'max' for renderType='inputDateTime'
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateInputDateTimeMax(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['renderType']) && $fieldConfig['config']['renderType'] === 'inputDateTime') {
-                        if (isset($fieldConfig['config']['max'])) {
-                            unset($fieldConfig['config']['max']);
-                            $this->messages[] = 'The config option \'max\' has been removed from the TCA for renderType=\'inputDateTime\' in ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'max\']';
-                        }
-                    }
-                }
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
-     * Migrate type='inline' properties 'foreign_types', 'foreign_selector_fieldTcaOverride'
-     * and 'foreign_record_defaults' to 'overrideChildTca'
-     *
-     * @param array $tca
-     * @return array
-     */
-    protected function migrateInlineOverrideChildTca(array $tca): array
-    {
-        foreach ($tca as $table => &$tableDefinition) {
-            if (isset($tableDefinition['types']) && is_array($tableDefinition['types'])) {
-                foreach ($tableDefinition['types'] as $typeName => &$typeConfig) {
-                    if (!isset($typeConfig['columnsOverrides']) || !is_array($typeConfig['columnsOverrides'])) {
-                        continue;
-                    }
-                    foreach ($typeConfig['columnsOverrides'] as $fieldName => &$fieldConfig) {
-                        if (isset($fieldConfig['config']['overrideChildTca'])
-                            || (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] !== 'inline')
-                            || (!isset($fieldConfig['config']['type']) && (empty($tca[$table]['columns'][$fieldName]['config']['type']) || $tca[$table]['columns'][$fieldName]['config']['type'] !== 'inline'))
-                        ) {
-                            // The new config is either set intentionally for compatibility
-                            // or accidentally. In any case we keep the new config and skip the migration.
-                            continue;
-                        }
-                        if (isset($fieldConfig['config']['foreign_types']) && is_array($fieldConfig['config']['foreign_types'])) {
-                            $fieldConfig['config']['overrideChildTca']['types'] = $fieldConfig['config']['foreign_types'];
-                            unset($fieldConfig['config']['foreign_types']);
-                            $this->messages[] = 'The \'foreign_types\' property from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\']  has been migrated to ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'types\']';
-                        }
-                        if (isset($fieldConfig['config']['foreign_selector_fieldTcaOverride']) && is_array($fieldConfig['config']['foreign_selector_fieldTcaOverride'])) {
-                            $foreignSelectorFieldName = '';
-                            if (isset($fieldConfig['config']['foreign_selector']) && is_string($fieldConfig['config']['foreign_selector'])) {
-                                $foreignSelectorFieldName = $fieldConfig['config']['foreign_selector'];
-                            } elseif (isset($tca[$table]['columns'][$fieldName]['config']['foreign_selector']) && is_string($tca[$table]['columns'][$fieldName]['config']['foreign_selector'])) {
-                                $foreignSelectorFieldName = $tca[$table]['columns'][$fieldName]['config']['foreign_selector'];
-                            }
-                            if ($foreignSelectorFieldName) {
-                                $fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName] = $fieldConfig['config']['foreign_selector_fieldTcaOverride'];
-                                unset($fieldConfig['config']['foreign_selector_fieldTcaOverride']);
-                                $this->messages[] = 'The \'foreign_selector_fieldTcaOverride\' property from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\']  and has been migrated to ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'columns\'][\'' . $foreignSelectorFieldName . '\']';
-                            }
-                        }
-                        if (isset($fieldConfig['config']['foreign_record_defaults']) && is_array($fieldConfig['config']['foreign_record_defaults'])) {
-                            foreach ($fieldConfig['config']['foreign_record_defaults'] as $childFieldName => $defaultValue) {
-                                $fieldConfig['config']['overrideChildTca']['columns'][$childFieldName]['config']['default'] = $defaultValue;
-                                $this->messages[] = 'The \'foreign_record_defaults\' property from TCA ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'' . $childFieldName . '\']  and has been migrated to ' . $table . '[\'types\'][\'' . $typeName . '\'][\'columnsOverrides\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'columns\'][\'' . $childFieldName . '\'][\'config\'][\'default\']';
-                            }
-                            unset($fieldConfig['config']['foreign_record_defaults']);
-                        }
-                    }
-                    unset($fieldConfig);
-                }
-                unset($typeConfig);
-            }
-            if (isset($tableDefinition['columns']) && is_array($tableDefinition['columns'])) {
-                foreach ($tableDefinition['columns'] as $fieldName => &$fieldConfig) {
-                    if (isset($fieldConfig['config']['type']) && $fieldConfig['config']['type'] !== 'inline') {
-                        continue;
-                    }
-                    if (isset($fieldConfig['config']['foreign_types']) && is_array($fieldConfig['config']['foreign_types'])) {
-                        if (isset($fieldConfig['config']['overrideChildTca']['types'])
-                            && is_array($fieldConfig['config']['overrideChildTca']['types'])
-                        ) {
-                            $fieldConfig['config']['overrideChildTca']['types'] = array_replace_recursive(
-                                $fieldConfig['config']['foreign_types'],
-                                $fieldConfig['config']['overrideChildTca']['types']
-                            );
-                        } else {
-                            $fieldConfig['config']['overrideChildTca']['types'] = $fieldConfig['config']['foreign_types'];
-                        }
-                        unset($fieldConfig['config']['foreign_types']);
-                        $this->messages[] = 'The \'foreign_types\' property from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']  and has been migrated to ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'types\']';
-                    }
-                    if (isset($fieldConfig['config']['foreign_selector'], $fieldConfig['config']['foreign_selector_fieldTcaOverride']) && is_string($fieldConfig['config']['foreign_selector']) && is_array($fieldConfig['config']['foreign_selector_fieldTcaOverride'])) {
-                        $foreignSelectorFieldName = $fieldConfig['config']['foreign_selector'];
-                        if (isset($fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName])
-                            && is_array($fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName])
-                        ) {
-                            $fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName] = array_replace_recursive(
-                                $fieldConfig['config']['foreign_selector_fieldTcaOverride'],
-                                $fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName]
-                            );
-                        } else {
-                            $fieldConfig['config']['overrideChildTca']['columns'][$foreignSelectorFieldName] = $fieldConfig['config']['foreign_selector_fieldTcaOverride'];
-                        }
-                        unset($fieldConfig['config']['foreign_selector_fieldTcaOverride']);
-                        $this->messages[] = 'The \'foreign_selector_fieldTcaOverride\' property from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\']  and has been migrated to ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'columns\'][\'' . $foreignSelectorFieldName . '\']';
-                    }
-                    if (isset($fieldConfig['config']['foreign_record_defaults']) && is_array($fieldConfig['config']['foreign_record_defaults'])) {
-                        foreach ($fieldConfig['config']['foreign_record_defaults'] as $childFieldName => $defaultValue) {
-                            if (!isset($fieldConfig['config']['overrideChildTca']['columns'][$childFieldName]['config']['default'])) {
-                                $fieldConfig['config']['overrideChildTca']['columns'][$childFieldName]['config']['default'] = $defaultValue;
-                                $this->messages[] = 'The \'foreign_record_defaults\' property from TCA ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'' . $childFieldName . '\']  and has been migrated to ' . $table . '[\'columns\'][\'' . $fieldName . '\'][\'config\'][\'overrideChildTca\'][\'columns\'][\'' . $childFieldName . '\'][\'config\'][\'default\']';
-                            }
-                        }
-                        unset($fieldConfig['config']['foreign_record_defaults']);
-                    }
-                }
-                unset($fieldConfig);
-            }
-        }
-
-        return $tca;
-    }
-
-    /**
      * Option $TCA[$table]['columns'][$columnName]['config']['behaviour']['localizeChildrenAtParentLocalization']
      * is always on, so this option can be removed.
      *
index d0d6bf7..f46cb40 100644 (file)
@@ -1292,6 +1292,7 @@ The following features have been removed:
   `$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['my_eID'] = 'EXT:benni/Scripts/download.php'` will not work anymore.
   Instead, they must contain a target (callable, class/method, function).
 * TCA auto migration from core v6 to core v7 compatible TCA
+* TCA auto migration from core v7 to core v8 compatible TCA
 * TCA :php:`type='group'` with :php:`internal_type='file'` and :php:`internal_type='file_reference`
 * Cache creation using :php:`\TYPO3\CMS\Cache\CacheManger` during :php:`ext_localconf.php` loading
 * All install tool upgrade wizards upgrading from v7 to v8 have been removed
index 1541a22..d961204 100644 (file)
@@ -137,5556 +137,4 @@ class TcaMigrationTest extends UnitTestCase
         $subject = new TcaMigration();
         $this->assertEquals($expected, $subject->migrate($input));
     }
-
-    /**
-     * @test
-     */
-    public function migrateRemovesAnUnusedT3edtiorDefinitionIfEnabledByTypeConfig(): void
-    {
-        $input = [
-            'aTable' => [
-                'columns' => [
-                    'bodytext' => [
-                        'exclude' => true,
-                        'label' => 'aLabel',
-                        'config' => [
-                            'type' => 'text',
-                            'rows' => 42,
-                            'wizards' => [
-                                't3editorHtml' => [
-                                    'type' => 'userFunc',
-                                    'userFunc' => 'TYPO3\CMS\T3editor\FormWizard->main',
-                                    'enableByTypeConfig' => 1,
-                                    'title' => 't3editor',
-                                    'icon' => 'content-table',
-                                    'module' => [
-                                        'name' => 'wizard_table'
-                                    ],
-                                    'params' => [
-                                        'format' => 'html',
-                                        'style' => 'width:98%; height: 60%;'
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-        ];
-        $expected = [
-            'aTable' => [
-                'columns' => [
-                    'bodytext' => [
-                        'exclude' => true,
-                        'label' => 'aLabel',
-                        'config' => [
-                            'type' => 'text',
-                            'rows' => 42,
-                        ],
-                    ],
-                ],
-            ],
-        ];
-        $subject = new TcaMigration();
-        $this->assertEquals($expected, $subject->migrate($input));
-    }
-
-    /**
-     * @test
-     */
-    public function migrateSpecialConfigurationAndRemoveShowItemStylePointerConfigDoesNotAddMessageIfOnlySyntaxChanged(): void
-    {
-        $input = [
-            'aTable' => [
-                'columns' => [
-                    'anotherField' => [
-                        'config' => [
-                            'type' => 'text',
-                        ],
-                    ],
-                ],
-                'types' => [
-                    0 => [
-                        'showitem' => 'aField;;;',
-                    ],
-                    1 => []
-                ],
-            ],
-        ];
-        $subject = new TcaMigration();
-        $subject->migrate($input);
-        $this->assertEmpty($subject->getMessages());
-    }
-
-    /**
-     * @test
-     */
-    public function migrateKeepsGivenExtensionReference(): void
-    {
-        $input = [
-                'aTable' => [
-                        'ctrl' => [
-                                'iconfile' => 'EXT:myExt/iconfile.gif',
-                        ],
-                ],
-        ];
-        $expected = [
-                'aTable' => [
-                        'ctrl' => [
-                                'iconfile' => 'EXT:myExt/iconfile.gif',
-                        ],
-                ],
-        ];
-        $subject = new TcaMigration();
-        $this->assertEquals($expected, $subject->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateRemovesRteTransformOptionsDataProvider(): array
-    {
-        return [
-            'columns richtext configuration' => [
-                [
-                    // Given config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext:rte_transform[]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    // Expected config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext configuration without bracket' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext:rte_transform'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext with mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext:rte_transform[mode=ts_css]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext:rte_transform[flag=rte_enabled|mode=ts_css]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext with array with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext[]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext * with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext[*]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columns richtext cut-copy-paste with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                                'defaultExtras' => 'richtext[cut|copy|paste]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'enableRichtext' => true,
-                                    'richtextConfiguration' => 'default',
-                                ],
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext with brackets' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext:rte_transform[]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext:rte_transform'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext with defalut mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext:rte_transform[mode=ts_css]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext:rte_transform[flag=rte_enabled|mode=ts_css]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext brackets mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext[]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext star with mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext[*]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-            'columnsOverrides richtext cut-copy-paste ith mode and others' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'richtext[copy|cut|paste]:rte_transform[flag=rte_enabled|mode=ts_css]'
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'enableRichtext' => true,
-                                            'richtextConfiguration' => 'default',
-                                        ],
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-            ],
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider migrateRemovesRteTransformOptionsDataProvider
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     */
-    public function migrateRemovesRteTransformOptions(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateSelectTreeOptionsDataProvider(): array
-    {
-        return [
-            'remove width' => [
-                [
-                    // Given config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                            'width' => 200
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    // Expected config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ]
-            ],
-            'remove allowRecursiveMode' => [
-                [
-                    // Given config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                            'someKey' => 'value',
-                                            'allowRecursiveMode' => true
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    // Expected config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                            'someKey' => 'value'
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ]
-            ],
-            'move autoSizeMax to size' => [
-                [
-                    // Given config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'autoSizeMax' => 20,
-                                    'size' => 10
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    // Expected config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'selectTree',
-                                    'size' => 20
-                                ]
-                            ]
-                        ]
-                    ]
-                ]
-            ],
-            'keep settings for non selectTree' => [
-                [
-                    // Given config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'not a select tree',
-                                    'autoSizeMax' => 20,
-                                    'size' => 10,
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                            'someKey' => 'value',
-                                            'allowRecursiveMode' => true,
-                                            'width' => 200
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ],
-                [
-                    // Expected config section
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'select',
-                                    'renderType' => 'not a select tree',
-                                    'autoSizeMax' => 20,
-                                    'size' => 10,
-                                    'treeConfig' => [
-                                        'appearance' => [
-                                            'someKey' => 'value',
-                                            'allowRecursiveMode' => true,
-                                            'width' => 200
-                                        ]
-                                    ]
-                                ]
-                            ]
-                        ]
-                    ]
-                ]
-            ]
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider migrateSelectTreeOptionsDataProvider
-     * @param array $input
-     * @param array $expected
-     */
-    public function migrateSelectTreeOptions(array $input, array $expected): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expected, $subject->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateTsTemplateSoftReferencesDataProvider(): array
-    {
-        return [
-            'nothing removed' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'email,somethingelse'
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'email,somethingelse',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'TStemplate only' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'TStemplate,somethingelse'
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'somethingelse',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'TStemplate and TSconfig' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'TStemplate,somethingelse,TSconfig'
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'softref' => 'somethingelse',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider migrateTsTemplateSoftReferencesDataProvider
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     */
-    public function migrateTsTemplateSoftReferences(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateShowIfRTESettingDataProvider(): array
-    {
-        return [
-            'nothing removed' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'check'
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'check'
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'Option removed' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'check',
-                                    'showIfRTE' => false
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'check'
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-
-            ],
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider migrateShowIfRTESettingDataProvider
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     */
-    public function migrateShowIfRTESetting(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateWorkspaceSettingsDataProvider(): array
-    {
-        return [
-            'no workspaces enabled' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => false
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => false
-                        ],
-                    ],
-                ]
-            ],
-            'nothing activated' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'label' => 'blabla'
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'label' => 'blabla'
-                        ],
-                    ],
-                ]
-            ],
-            'nothing changed, workspaces enabled' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => true
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => true
-                        ],
-                    ],
-                ]
-            ],
-            'cast workspaces to bool' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => 1
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => true
-                        ],
-                    ],
-                ]
-            ],
-            'cast workspaces v2 to bool' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => 2
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => true
-                        ],
-                    ],
-                ]
-            ],
-            'cast workspaces v2 to bool and remove followpages' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => 2,
-                            'versioning_followPages' => true
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'versioningWS' => true
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @test
-     * @dataProvider migrateWorkspaceSettingsDataProvider
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     */
-    public function migrateWorkspaceSettings(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateTranslationTableDataProvider(): array
-    {
-        return [
-            'remove transForeignTable' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'transForeignTable' => 'pages_language_overlay',
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [],
-                    ],
-                ]
-            ],
-            'remove transOrigPointerTable' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'transOrigPointerTable' => 'pages',
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [],
-                    ],
-                ]
-            ]
-        ];
-    }
-
-    /**
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     * @test
-     * @dataProvider migrateTranslationTableDataProvider
-     */
-    public function migrateTranslationTable(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateL10nModeDefinitionsDataProvider(): array
-    {
-        return [
-            'remove l10n_mode noCopy' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'l10n_mode' => 'noCopy',
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'remove l10n_mode mergeIfNotBlank' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'l10n_mode' => 'mergeIfNotBlank',
-                                'config' => [
-                                    'type' => 'text',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'text',
-                                    'behaviour' => [
-                                        'allowLanguageSynchronization' => true,
-                                    ]
-                                ]
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     * @test
-     * @dataProvider migrateL10nModeDefinitionsDataProvider
-     */
-    public function migrateL10nModeDefinitions(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migratePageLocalizationDefinitionsDataProvider(): array
-    {
-        return [
-            'missing l10n_mode' => [
-                [
-                    'pages' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                            ],
-                        ],
-                    ],
-                    'pages_language_overlay' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                                'l10n_mode' => 'any-possible-value',
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'pages' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                                'l10n_mode' => 'any-possible-value',
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'missing allowLanguageSynchronization' => [
-                [
-                    'pages' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                            ],
-                        ],
-                    ],
-                    'pages_language_overlay' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'behaviour' => [
-                                        'allowLanguageSynchronization' => true,
-                                    ]
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'pages' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'behaviour' => [
-                                        'allowLanguageSynchronization' => true,
-                                    ]
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     * @test
-     * @dataProvider migratePageLocalizationDefinitionsDataProvider
-     */
-    public function migratePageLocalizationDefinitions(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateInlineLocalizationModeDataProvider(): array
-    {
-        return [
-            'remove counter-productive localizationMode=keep' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'localizationMode' => 'keep',
-                                        'allowLanguageSynchronization' => true,
-                                    ],
-                                ]
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'allowLanguageSynchronization' => true,
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'keep deprecated localizationMode=keep' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'localizationMode' => 'keep',
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'localizationMode' => 'keep',
-                                    ],
-                                ]
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'keep deprecated localizationMode=select' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'localizationMode' => 'select',
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aColumn' => [
-                                'config' => [
-                                    'type' => 'inline',
-                                    'behaviour' => [
-                                        'localizationMode' => 'select',
-                                    ],
-                                ]
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @param array $givenConfig
-     * @param array $expectedConfig
-     * @test
-     * @dataProvider migrateInlineLocalizationModeDataProvider
-     */
-    public function migrateInlineLocalizationMode(array $givenConfig, array $expectedConfig): void
-    {
-        $subject = new TcaMigration();
-        $this->assertEquals($expectedConfig, $subject->migrate($givenConfig));
-        $this->assertNotEmpty($subject->getMessages());
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesRequestUpdateCtrlFieldToColumnsDataProvider(): array
-    {
-        return [
-            'move single field name' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'requestUpdate' => 'aField',
-                        ],
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [],
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                                'onChange' => 'reload',
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'ignore missing field but migrate others' => [
-                [
-                    'aTable' => [
-                        'ctrl' => [
-                            'requestUpdate' => 'aField, bField, cField, ',
-                        ],
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'none',
-                                ],
-                            ],
-                            'cField' => [
-                                'config' => [
-                                    'type' => 'none',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'ctrl' => [],
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'none',
-                                ],
-                                'onChange' => 'reload',
-                            ],
-                            'cField' => [
-                                'config' => [
-                                    'type' => 'none',
-                                ],
-                                'onChange' => 'reload',
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateMovesRequestUpdateCtrlFieldToColumnsDataProvider
-     */
-    public function migrateMovesRequestUpdateCtrlFieldToColumns(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesTypeInputDateTimeToRenderTypeDataProvider(): array
-    {
-        return [
-            'simple input with eval date' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'date',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'date',
-                                    'renderType' => 'inputDateTime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'simple input with eval datetime' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'datetime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'datetime',
-                                    'renderType' => 'inputDateTime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'simple input with eval time' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'time',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'time',
-                                    'renderType' => 'inputDateTime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'simple input with eval timesec' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'timesec',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'timesec',
-                                    'renderType' => 'inputDateTime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'input with multiple evals' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'null,date, required',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'eval' => 'null,date, required',
-                                    'renderType' => 'inputDateTime',
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateMovesTypeInputDateTimeToRenderTypeDataProvider
-     */
-    public function migrateMovesTypeInputDateTimeToRenderType(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesWizardsWithEnableByTypeConfigToColumnsOverridesDataProvider(): array
-    {
-        return [
-            'enableByTypeConfig on multiple wizards' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'exclude' => true,
-                                'label' => 'aLabel',
-                                'config' => [
-                                    'type' => 'text',
-                                    'wizards' => [
-                                        'aWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'aTitle',
-                                            'enableByTypeConfig' => '1',
-                                        ],
-                                        'anotherWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'anotherTitle',
-                                            'enableByTypeConfig' => 1,
-                                        ],
-                                        'yetAnotherWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'yetAnotherTitle',
-                                        ],
-                                        'andYetAnotherWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'yetAnotherTitle',
-                                            'enableByTypeConfig' => 0,
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'firstType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'nowrap:wizards[aWizard|anotherWizard|aNotExistingWizard]:enable-tab',
-                                    ],
-                                ],
-                            ],
-                            'secondType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'wizards[aWizard]',
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'exclude' => true,
-                                'label' => 'aLabel',
-                                'config' => [
-                                    'type' => 'text',
-                                    'wizards' => [
-                                        'yetAnotherWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'yetAnotherTitle',
-                                        ],
-                                        'andYetAnotherWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'yetAnotherTitle',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'firstType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wrap' => 'off',
-                                            'enableTabulator' => true,
-                                            'wizards' => [
-                                                'aWizard' => [
-                                                    'type' => 'aType',
-                                                    'title' => 'aTitle',
-                                                ],
-                                                'anotherWizard' => [
-                                                    'type' => 'aType',
-                                                    'title' => 'anotherTitle',
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                            'secondType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'aWizard' => [
-                                                    'type' => 'aType',
-                                                    'title' => 'aTitle',
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'empty wizard array is removed' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'exclude' => true,
-                                'label' => 'aLabel',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'aWizard' => [
-                                            'type' => 'aType',
-                                            'title' => 'aTitle',
-                                            'enableByTypeConfig' => 1,
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'firstType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'defaultExtras' => 'wizards[aWizard]',
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'exclude' => true,
-                                'label' => 'aLabel',
-                                'config' => [
-                                    'type' => 'input',
-                                ],
-                            ],
-                        ],
-                        'types' => [
-                            'firstType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'aWizard' => [
-                                                    'type' => 'aType',
-                                                    'title' => 'aTitle',
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateMovesWizardsWithEnableByTypeConfigToColumnsOverridesDataProvider
-     */
-    public function migrateMovesWizardsWithEnableByTypeConfigToColumnsOverrides(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateRewritesColorpickerWizardDataProvider(): array
-    {
-        return [
-            'colorpicker in columns field' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'colorpicker' => [
-                                            'type' => 'colorbox',
-                                            'title' => 'Color picker',
-                                            'module' => [
-                                                'name' => 'wizard_colorpicker',
-                                            ],
-                                            'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'colorpicker',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'colorpicker is not migrated if custom renderType is already given' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'myPersonalRenderType',
-                                    'wizards' => [
-                                        'colorpicker' => [
-                                            'type' => 'colorbox',
-                                            'title' => 'Color picker',
-                                            'module' => [
-                                                'name' => 'wizard_colorpicker',
-                                            ],
-                                            'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aCol' => [
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'myPersonalRenderType',
-                                    'wizards' => [
-                                        'colorpicker' => [
-                                            'type' => 'colorbox',
-                                            'title' => 'Color picker',
-                                            'module' => [
-                                                'name' => 'wizard_colorpicker',
-                                            ],
-                                            'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'colorpicker in a type columnsOverrides field' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                          'aField' => [
-                              'config' => [
-                                  'type' => 'input',
-                              ]
-                          ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'colorpicker' => [
-                                                    'type' => 'colorbox',
-                                                    'title' => 'Color picker',
-                                                    'module' => [
-                                                        'name' => 'wizard_colorpicker',
-                                                    ],
-                                                    'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1',
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'type' => 'input',
-                                            'renderType' => 'colorpicker',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ]
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateRewritesColorpickerWizardDataProvider
-     */
-    public function migrateRewritesColorpickerWizard(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesSelectWizardToValuePickerDataProvider(): array
-    {
-        return [
-            'select wizard without mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'text',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'text',
-                                    'valuePicker' => [
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard with empty mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'valuePicker' => [
-                                        'mode' => '',
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard with prepend mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => 'prepend',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'valuePicker' => [
-                                        'mode' => 'prepend',
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard with append mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => 'append',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'valuePicker' => [
-                                        'mode' => 'append',
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard with broken mode' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => 'foo',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'valuePicker' => [
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard without items is not migrated' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select wizard with broken items is not migrated' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                            'items' => 'foo',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                            'items' => 'foo',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'two wizards' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'target_picker' => [
-                                            'type' => 'select',
-                                            'mode' => '',
-                                            'items' => [
-                                                [ 'aLabel', 'aValue' ],
-                                                [ 'anotherLabel', 'anotherValue' ],
-                                            ],
-                                        ],
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ]
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'valuePicker' => [
-                                        'mode' => '',
-                                        'items' => [
-                                            [ 'aLabel', 'aValue' ],
-                                            [ 'anotherLabel', 'anotherValue' ],
-                                        ],
-                                    ],
-                                    'wizards' => [
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ],
-                                    ]
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'select value wizard to value Picker columnsOverrides field' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'target_picker' => [
-                                                    'type' => 'select',
-                                                    'items' => [
-                                                        [ 'aLabel', 'aValue' ],
-                                                        [ 'anotherLabel', 'anotherValue' ],
-                                                    ],
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'text',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'valuePicker' => [
-                                                'items' => [
-                                                    [ 'aLabel', 'aValue' ],
-                                                    [ 'anotherLabel', 'anotherValue' ],
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ]
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateMovesSelectWizardToValuePickerDataProvider
-     */
-    public function migrateMovesSelectWizardToValuePicker(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesSliderWizardToSliderConfigurationDataProvider(): array
-    {
-        return [
-            'slider wizard with no options' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'slider' => [
-                                            'type' => 'slider',
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'slider' => [],
-                                ],
-                            ],
-                        ],
-                    ],
-                ]
-            ],
-            'slider wizard with options' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'slider' => [
-                                            'type' => 'slider',
-                                            'width' => 200,
-                                            'step' => 10,
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'slider' => [
-                                        'width' => 200,
-                                        'step' => 10,
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'two wizards' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'slider' => [
-                                            'type' => 'slider',
-                                            'width' => 200,
-                                        ],
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ]
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'slider' => [
-                                        'width' => 200,
-                                    ],
-                                    'wizards' => [
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ],
-                                    ]
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'slider wizard to columnsOverrides field' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'slider' => [
-                                                    'type' => 'slider',
-                                                    'width' => 200,
-                                                ],
-                                                'differentWizard' => [
-                                                    'type' => 'foo',
-                                                ],
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'slider' => [
-                                                'width' => 200,
-                                            ],
-                                            'wizards' => [
-                                                'differentWizard' => [
-                                                    'type' => 'foo',
-                                                ],
-                                            ]
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-        ];
-    }
-
-    /**
-     * @param array $input
-     * @param array $expected
-     * @test
-     * @dataProvider migrateMovesSliderWizardToSliderConfigurationDataProvider
-     */
-    public function migrateMovesSliderWizardToSliderConfiguration(array $input, array $expected): void
-    {
-        $this->assertEquals($expected, (new TcaMigration())->migrate($input));
-    }
-
-    /**
-     * @return array
-     */
-    public function migrateMovesLinkWizardToRenderTypeWithFieldControlDataProvider(): array
-    {
-        return [
-            'simple link wizard without options' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'link' => [
-                                            'type' => 'popup',
-                                            'module' => [
-                                                'name' => 'wizard_link',
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'inputLink',
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'link wizard with options' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'link' => [
-                                            'type' => 'popup',
-                                            'title' => 'aLinkTitle',
-                                            'module' => [
-                                                'name' => 'wizard_link',
-                                            ],
-                                            'JSopenParams' => 'height=800,width=600,status=0,menubar=0,scrollbars=1',
-                                            'params' => [
-                                                'blindLinkOptions' => 'folder',
-                                                'blindLinkFields' => 'class, target',
-                                                'allowedExtensions' => 'jpg',
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'inputLink',
-                                    'fieldControl' => [
-                                        'linkPopup' => [
-                                            'options' => [
-                                                'title' => 'aLinkTitle',
-                                                'windowOpenParameters' => 'height=800,width=600,status=0,menubar=0,scrollbars=1',
-                                                'blindLinkOptions' => 'folder',
-                                                'blindLinkFields' => 'class, target',
-                                                'allowedExtensions' => 'jpg',
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'link wizard does not migrate if renderType is already set' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'aRenderType',
-                                    'wizards' => [
-                                        'link' => [
-                                            'type' => 'popup',
-                                            'module' => [
-                                                'name' => 'wizard_link',
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'aRenderType',
-                                    'wizards' => [
-                                        'link' => [
-                                            'type' => 'popup',
-                                            'module' => [
-                                                'name' => 'wizard_link',
-                                            ],
-                                        ],
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'two wizards' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'wizards' => [
-                                        'link' => [
-                                            'type' => 'popup',
-                                            'module' => [
-                                                'name' => 'wizard_link',
-                                            ],
-                                        ],
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ]
-                                    ],
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'label' => 'foo',
-                                'config' => [
-                                    'type' => 'input',
-                                    'renderType' => 'inputLink',
-                                    'wizards' => [
-                                        'differentWizard' => [
-                                            'type' => 'foo',
-                                        ],
-                                    ]
-                                ],
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-            'link wizard columnsOverrides field' => [
-                [
-                    'aTable' => [
-                        'columns' => [
-                            'aField' => [
-                                'config' => [
-                                    'type' => 'input',
-                                ]
-                            ]
-                        ],
-                        'types' => [
-                            'aType' => [
-                                'columnsOverrides' => [
-                                    'aField' => [
-                                        'config' => [
-                                            'wizards' => [
-                                                'link' => [
-                                                    'type' => 'popup',
-                                                    'title' => 'aLinkTitle',
-                                                    'module' => [
-                                        &nbs