2020-08-20 03:41:11 +08:00
import { getOwner as emberGetOwner , setOwner } from "@ember/application" ;
2016-11-04 23:32:12 +08:00
import deprecated from "discourse-common/lib/deprecated" ;
2020-08-20 03:41:11 +08:00
let _default = { } ;
2016-11-04 23:32:12 +08:00
2023-09-26 21:30:52 +08:00
/ * *
* Works similarly to { getOwner } from ` @ember/application ` , but has a fallback
* when the passed object doesn ' t have an owner .
*
* This exists for historical reasons . Ideally , any uses of it should be updated to use
* the official ` @ember/application ` implementation .
* /
export function getOwnerWithFallback ( obj ) {
2020-03-24 03:05:03 +08:00
if ( emberGetOwner ) {
2020-08-20 03:47:49 +08:00
return emberGetOwner ( obj || _default ) || emberGetOwner ( _default ) ;
2016-11-04 23:32:12 +08:00
}
return obj . container ;
}
2023-09-26 21:30:52 +08:00
/ * *
* @ deprecated use ` getOwnerWithFallback ` instead
* /
export function getOwner ( obj ) {
deprecated (
"Importing getOwner from `discourse-common/lib/get-owner` is deprecated. Use `import { getOwner } from '@ember/application'`, or if you still need the fallback shim, use `import { getOwnerWithFallback } from 'discourse-common/lib/get-owner';`." ,
{ since : "3.2" , id : "discourse.get-owner-with-fallback" }
) ;
return getOwnerWithFallback ( obj ) ;
}
2020-08-20 03:41:11 +08:00
export function setDefaultOwner ( container ) {
setOwner ( _default , container ) ;
}
2016-11-04 23:32:12 +08:00
// `this.container` is deprecated, but we can still build a container-like
// object for components to use
export function getRegister ( obj ) {
2023-09-26 21:30:52 +08:00
const owner = getOwnerWithFallback ( obj ) ;
2016-11-04 23:32:12 +08:00
const register = {
lookup : ( ... args ) => owner . lookup ( ... args ) ,
lookupFactory : ( ... args ) => {
2017-06-14 03:52:08 +08:00
if ( owner . factoryFor ) {
return owner . factoryFor ( ... args ) ;
} else if ( owner . _lookupFactory ) {
return owner . _lookupFactory ( ... args ) ;
}
2016-11-04 23:32:12 +08:00
} ,
deprecateContainer ( target ) {
Object . defineProperty ( target , "container" , {
get ( ) {
deprecated (
2022-11-16 18:00:39 +08:00
"Use `this.register` or `getOwner` instead of `this.container`" ,
{ id : "discourse.this-container" }
2016-11-04 23:32:12 +08:00
) ;
return register ;
} ,
} ) ;
} ,
} ;
2023-07-04 00:34:24 +08:00
setOwner ( register , owner ) ;
2016-11-04 23:32:12 +08:00
return register ;
}