).toHaveBeenWarned()
})
})
+
+ test('config.optionMergeStrategies', () => {
+ let merged: string
+ const App = defineComponent({
+ render() {},
+ mixins: [{ foo: 'mixin' }],
+ extends: { foo: 'extends' },
+ foo: 'local',
+ beforeCreate() {
+ merged = this.$options.foo
+ }
+ })
+
+ const app = createApp(App)
+ app.mixin({
+ foo: 'global'
+ })
+ app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
+
+ app.mount(nodeOps.createElement('div'))
+ expect(merged!).toBe('global,extends,mixin,local')
+ })
+
+ test('config.globalProperties', () => {
+ const app = createApp({
+ render() {
+ return this.foo
+ }
+ })
+ app.config.globalProperties.foo = 'hello'
+ const root = nodeOps.createElement('div')
+ app.mount(root)
+ expect(serializeInner(root)).toBe('hello')
+ })
})
expect(serializeInner(root)).toBe(`<div>1,1,3</div>`)
})
- test('optionMergeStrategies', () => {
- let merged: string
- const App = defineComponent({
- render() {},
- mixins: [{ foo: 'mixin' }],
- extends: { foo: 'extends' },
- foo: 'local',
- beforeCreate() {
- merged = this.$options.foo
- }
- })
-
- const app = createApp(App)
- app.mixin({
- foo: 'global'
- })
- app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
-
- app.mount(nodeOps.createElement('div'))
- expect(merged!).toBe('global,extends,mixin,local')
- })
-
describe('warnings', () => {
mockWarn()
devtools: boolean
performance: boolean
optionMergeStrategies: Record<string, OptionMergeFunction>
+ globalProperties: Record<string, any>
isCustomElement: (tag: string) => boolean
errorHandler?: (
err: unknown,
isNativeTag: NO,
devtools: true,
performance: false,
+ globalProperties: {},
optionMergeStrategies: {},
isCustomElement: NO,
errorHandler: undefined,
export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
get(target: ComponentInternalInstance, key: string) {
- const { renderContext, data, propsProxy, accessCache, type, sink } = target
+ const {
+ renderContext,
+ data,
+ propsProxy,
+ accessCache,
+ type,
+ sink,
+ appContext
+ } = target
// data / props / renderContext
// This getter gets called for every property access on the render context
// public $xxx properties & user-attached properties (sink)
const publicGetter = publicPropertiesMap[key]
- let cssModule
+ let cssModule, globalProperties
if (publicGetter) {
if (__DEV__ && key === '$attrs') {
markAttrsAccessed()
}
return publicGetter(target)
+ } else if (hasOwn(sink, key)) {
+ return sink[key]
} else if (
(cssModule = type.__cssModules) &&
(cssModule = cssModule[key])
) {
return cssModule
- } else if (hasOwn(sink, key)) {
- return sink[key]
+ } else if (
+ ((globalProperties = appContext.config.globalProperties),
+ hasOwn(globalProperties, key))
+ ) {
+ return globalProperties[key]
} else if (__DEV__ && currentRenderingInstance) {
warn(
`Property ${JSON.stringify(key)} was accessed during render ` +