155 lines
4.9 KiB
TypeScript
155 lines
4.9 KiB
TypeScript
import { isRuntimeOnly } from '../component'
|
|
import { warn } from '../warning'
|
|
|
|
export const enum DeprecationTypes {
|
|
CONFIG_SILENT,
|
|
CONFIG_DEVTOOLS,
|
|
CONFIG_KEY_CODES,
|
|
CONFIG_PRODUCTION_TIP,
|
|
CONFIG_IGNORED_ELEMENTS,
|
|
|
|
GLOBAL_PROTOTYPE,
|
|
GLOBAL_SET,
|
|
GLOBAL_DELETE,
|
|
GLOBAL_OBSERVABLE,
|
|
GLOBAL_DOM_TEMPLATE_MOUNT,
|
|
|
|
INSTANCE_SET,
|
|
INSTANCE_DELETE,
|
|
INSTANCE_MOUNT,
|
|
INSTANCE_DESTROY,
|
|
|
|
OPTIONS_DATA_FN,
|
|
OPTIONS_DATA_MERGE
|
|
}
|
|
|
|
type DeprecationData = {
|
|
message: string | ((...args: any[]) => string)
|
|
link?: string
|
|
}
|
|
|
|
const deprecations: Record<DeprecationTypes, DeprecationData> = {
|
|
[DeprecationTypes.CONFIG_SILENT]: {
|
|
message:
|
|
`config.silent has been removed because it is not good practice to ` +
|
|
`intentionally suppress warnings. You can use your browser console's ` +
|
|
`filter features to focus on relevant messages.`
|
|
},
|
|
|
|
[DeprecationTypes.CONFIG_DEVTOOLS]: {
|
|
message:
|
|
`config.devtools has been removed. To enable devtools for ` +
|
|
`production, configure the __VUE_PROD_DEVTOOLS__ compile-time flag.`,
|
|
link: `https://github.com/vuejs/vue-next/tree/master/packages/vue#bundler-build-feature-flags`
|
|
},
|
|
|
|
[DeprecationTypes.CONFIG_KEY_CODES]: {
|
|
message:
|
|
`config.keyCodes has been removed. ` +
|
|
`In Vue 3, you can directly use the kebab-case key names as v-on modifiers.`,
|
|
link: `https://v3.vuejs.org/guide/migration/keycode-modifiers.html`
|
|
},
|
|
|
|
[DeprecationTypes.CONFIG_PRODUCTION_TIP]: {
|
|
message: `config.productionTip has been removed.`,
|
|
link: `https://v3.vuejs.org/guide/migration/global-api.html#config-productiontip-removed`
|
|
},
|
|
|
|
[DeprecationTypes.CONFIG_IGNORED_ELEMENTS]: {
|
|
message: () => {
|
|
let msg = `config.ignoredElements has been removed.`
|
|
if (isRuntimeOnly()) {
|
|
msg += ` Pass the "isCustomElement" option to @vue/compiler-dom instead.`
|
|
} else {
|
|
msg += ` Use config.isCustomElement instead.`
|
|
}
|
|
return msg
|
|
},
|
|
link: `https://v3.vuejs.org/guide/migration/global-api.html#config-ignoredelements-is-now-config-iscustomelement`
|
|
},
|
|
|
|
[DeprecationTypes.GLOBAL_PROTOTYPE]: {
|
|
message:
|
|
`Vue.prototype is no longer available in Vue 3. ` +
|
|
`Use config.globalProperties instead.`,
|
|
link: `https://v3.vuejs.org/guide/migration/global-api.html#vue-prototype-replaced-by-config-globalproperties`
|
|
},
|
|
|
|
[DeprecationTypes.GLOBAL_SET]: {
|
|
message:
|
|
`Vue.set() has been removed as it is no longer needed in Vue 3. ` +
|
|
`Simply use native JavaScript mutations.`
|
|
},
|
|
|
|
[DeprecationTypes.GLOBAL_DELETE]: {
|
|
message:
|
|
`Vue.delete() has been removed as it is no longer needed in Vue 3. ` +
|
|
`Simply use native JavaScript mutations.`
|
|
},
|
|
|
|
[DeprecationTypes.GLOBAL_OBSERVABLE]: {
|
|
message:
|
|
`Vue.observable() has been removed. ` +
|
|
`Use \`import { reactive } from "vue"\` from Composition API instead.`,
|
|
link: `https://v3.vuejs.org/api/basic-reactivity.html`
|
|
},
|
|
|
|
[DeprecationTypes.GLOBAL_DOM_TEMPLATE_MOUNT]: {
|
|
message:
|
|
`Vue detected directives on the mount container. ` +
|
|
`In Vue 3, the container is no longer considered part of the template ` +
|
|
`and will not be processed/replaced.`,
|
|
link: `https://v3.vuejs.org/guide/migration/mount-changes.html`
|
|
},
|
|
|
|
[DeprecationTypes.INSTANCE_SET]: {
|
|
message:
|
|
`vm.$set() has been removed as it is no longer needed in Vue 3. ` +
|
|
`Simply use native JavaScript mutations.`
|
|
},
|
|
|
|
[DeprecationTypes.INSTANCE_DELETE]: {
|
|
message:
|
|
`vm.$delete() has been removed as it is no longer needed in Vue 3. ` +
|
|
`Simply use native JavaScript mutations.`
|
|
},
|
|
|
|
[DeprecationTypes.INSTANCE_MOUNT]: {
|
|
message:
|
|
`The global app boostrapping API has changed: vm.$mount() and the "el" ` +
|
|
`option have been removed. Use createApp(RootComponent).mount() instead.`,
|
|
link: `https://v3.vuejs.org/guide/migration/global-api.html#mounting-app-instance`
|
|
},
|
|
|
|
[DeprecationTypes.INSTANCE_DESTROY]: {
|
|
message: `vm.$destroy() has been removed. Use app.unmount() instead.`,
|
|
link: `https://v3.vuejs.org/api/application-api.html#unmount`
|
|
},
|
|
|
|
[DeprecationTypes.OPTIONS_DATA_FN]: {
|
|
message:
|
|
`The "data" option can no longer be a plain object. ` +
|
|
`Always use a function.`,
|
|
link: `https://v3.vuejs.org/guide/migration/data-option.html`
|
|
},
|
|
|
|
[DeprecationTypes.OPTIONS_DATA_MERGE]: {
|
|
message: (key: string) =>
|
|
`Detected conflicting key "${key}" when merging "data" option values. ` +
|
|
`In Vue 3, data keys are merged shallowly and will override one another.`,
|
|
link: `https://v3.vuejs.org/guide/migration/data-option.html#mixin-merge-behavior-change`
|
|
}
|
|
}
|
|
|
|
export function warnDeprecation(key: DeprecationTypes, ...args: any[]) {
|
|
if (!__COMPAT__ || !__DEV__) {
|
|
return
|
|
}
|
|
const { message, link } = deprecations[key]
|
|
warn(
|
|
`[DEPRECATION] ${
|
|
typeof message === 'function' ? message(...args) : message
|
|
}${link ? `\nFor more details, see ${link}` : ``}`
|
|
)
|
|
}
|