Skip to content

Commit

Permalink
fix(compat): handle and warn config.optionMergeStrategies
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed May 8, 2021
1 parent ed6c5fe commit 94e69fd
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 9 deletions.
7 changes: 7 additions & 0 deletions packages/runtime-core/src/compat/compatConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export const enum DeprecationTypes {
CONFIG_PRODUCTION_TIP = 'CONFIG_PRODUCTION_TIP',
CONFIG_IGNORED_ELEMENTS = 'CONFIG_IGNORED_ELEMENTS',
CONFIG_WHITESPACE = 'CONFIG_WHITESPACE',
CONFIG_OPTION_MERGE_STRATS = 'CONFIG_OPTION_MERGE_STRATS',

INSTANCE_SET = 'INSTANCE_SET',
INSTANCE_DELETE = 'INSTANCE_DELETE',
Expand Down Expand Up @@ -174,6 +175,12 @@ export const deprecationData: Record<DeprecationTypes, DeprecationData> = {
`\`config.compilerOptions.whitespace\`.`
},

[DeprecationTypes.CONFIG_OPTION_MERGE_STRATS]: {
message:
`config.optionMergeStrategies no longer exposes internal strategies. ` +
`Use custom merge functions instead.`
},

[DeprecationTypes.INSTANCE_SET]: {
message:
`vm.$set() has been removed as it is no longer needed in Vue 3. ` +
Expand Down
6 changes: 4 additions & 2 deletions packages/runtime-core/src/compat/global.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ import { Directive } from '../directives'
import { nextTick } from '../scheduler'
import { version } from '..'
import {
installLegacyConfigProperties,
installLegacyConfigWarnings,
installLegacyOptionMergeStrats,
LegacyConfig,
legacyOptionMergeStrats
} from './globalConfig'
Expand Down Expand Up @@ -327,6 +328,7 @@ export function installAppCompatProperties(
render: RootRenderFunction
) {
installFilterMethod(app, context)
installLegacyOptionMergeStrats(app.config)

if (!singletonApp) {
// this is the call of creating the singleton itself so the rest is
Expand All @@ -337,7 +339,7 @@ export function installAppCompatProperties(
installCompatMount(app, context, render)
installLegacyAPIs(app)
applySingletonAppMutations(app)
if (__DEV__) installLegacyConfigProperties(app.config)
if (__DEV__) installLegacyConfigWarnings(app.config)
}

function installFilterMethod(app: App, context: AppContext) {
Expand Down
32 changes: 26 additions & 6 deletions packages/runtime-core/src/compat/globalConfig.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { extend, isArray } from '@vue/shared'
import { AppConfig } from '../apiCreateApp'
import { mergeDataOption } from './data'
import { DeprecationTypes, warnDeprecation } from './compatConfig'
import {
DeprecationTypes,
softAssertCompatEnabled,
warnDeprecation
} from './compatConfig'
import { isCopyingConfig } from './global'

// legacy config warnings
Expand Down Expand Up @@ -33,7 +37,7 @@ export type LegacyConfig = {
}

// dev only
export function installLegacyConfigProperties(config: AppConfig) {
export function installLegacyConfigWarnings(config: AppConfig) {
const legacyConfigOptions: Record<string, DeprecationTypes> = {
silent: DeprecationTypes.CONFIG_SILENT,
devtools: DeprecationTypes.CONFIG_DEVTOOLS,
Expand All @@ -57,11 +61,27 @@ export function installLegacyConfigProperties(config: AppConfig) {
}
})
})
}

// Internal merge strats which are no longer needed in v3, but we need to
// expose them because some v2 plugins will reuse these internal strats to
// merge their custom options.
extend(config.optionMergeStrategies, legacyOptionMergeStrats)
export function installLegacyOptionMergeStrats(config: AppConfig) {
config.optionMergeStrategies = new Proxy({} as any, {
get(target, key) {
if (key in target) {
return target[key]
}
if (
key in legacyOptionMergeStrats &&
softAssertCompatEnabled(
DeprecationTypes.CONFIG_OPTION_MERGE_STRATS,
null
)
) {
return legacyOptionMergeStrats[
key as keyof typeof legacyOptionMergeStrats
]
}
}
})
}

export const legacyOptionMergeStrats = {
Expand Down
1 change: 1 addition & 0 deletions packages/vue-compat/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ Features that start with `COMPILER_` are compiler-specific: if you are using the
| GLOBAL_OBSERVABLE || `Vue.observable` removed (use `reactive`) | [link](https://v3.vuejs.org/api/basic-reactivity.html) |
| CONFIG_KEY_CODES || config.keyCodes rmeoved | [link](https://v3.vuejs.org/guide/migration/keycode-modifiers.html) |
| CONFIG_WHITESPACE || In Vue 3 whitespace defaults to `"condense"` | |
| CONFIG_OPTION_MERGE_STRATS || Vue 3 no longer exposes internal option merge strats | |
| INSTANCE_SET || `vm.$set` removed (no longer needed) | |
| INSTANCE_DELETE || `vm.$delete` removed (no longer needed) | |
| INSTANCE_EVENT_EMITTER || `vm.$on`, `vm.$off`, `vm.$once` removed | [link](https://v3.vuejs.org/guide/migration/events-api.html) |
Expand Down
11 changes: 10 additions & 1 deletion packages/vue-compat/__tests__/globalConfig.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import Vue from '@vue/compat'
import { toggleDeprecationWarning } from '../../runtime-core/src/compat/compatConfig'
import {
DeprecationTypes,
toggleDeprecationWarning
} from '../../runtime-core/src/compat/compatConfig'
import { createApp } from '../src/esm-index'
import { triggerEvent } from './utils'

Expand Down Expand Up @@ -74,3 +77,9 @@ test('singleton config should affect apps created with createApp()', () => {
}).mount(el)
expect(el.innerHTML).toBe(`<v-foo></v-foo><foo></foo>`)
})

test('config.optionMergeStrategies', () => {
toggleDeprecationWarning(true)
expect(typeof Vue.config.optionMergeStrategies.created).toBe('function')
expect(DeprecationTypes.CONFIG_OPTION_MERGE_STRATS).toHaveBeenWarned()
})

0 comments on commit 94e69fd

Please sign in to comment.