diff --git a/packages/compat/src/v1-addon.ts b/packages/compat/src/v1-addon.ts index 75eae5ef8..d5bd59c10 100644 --- a/packages/compat/src/v1-addon.ts +++ b/packages/compat/src/v1-addon.ts @@ -1009,6 +1009,8 @@ export interface V1AddonConstructor { packageCache: PackageCache, orderIdx: number ): V1Addon; + + shouldApplyAdapter?(addonInstance: any): boolean; } class IntermediateBuild { diff --git a/packages/compat/src/v1-instance-cache.ts b/packages/compat/src/v1-instance-cache.ts index 244417867..170cd7a1c 100644 --- a/packages/compat/src/v1-instance-cache.ts +++ b/packages/compat/src/v1-instance-cache.ts @@ -43,23 +43,38 @@ export default class V1InstanceCache { }); } - private adapterClass(packageName: string): V1AddonConstructor { + private adapterClass(addonInstance: any): V1AddonConstructor { + let packageName = addonInstance.pkg.name; // if the user registered something (including "null", which allows // disabling the built-in adapters), that takes precedence. - if (this.options.compatAdapters.has(packageName)) { - return this.options.compatAdapters.get(packageName) || V1Addon; + let AdapterClass = this.options.compatAdapters.get(packageName); + + if (AdapterClass === null) { + return V1Addon; + } + + if (!AdapterClass) { + let path = `${__dirname}/compat-adapters/${packageName}.js`; + if (pathExistsSync(path)) { + // eslint-disable-next-line @typescript-eslint/no-require-imports + AdapterClass = require(path).default; + } } - let path = `${__dirname}/compat-adapters/${packageName}.js`; - if (pathExistsSync(path)) { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require(path).default; + + if (!AdapterClass) { + return V1Addon; } - return V1Addon; + + if (AdapterClass.shouldApplyAdapter) { + return AdapterClass.shouldApplyAdapter(addonInstance) ? AdapterClass : V1Addon; + } + + return AdapterClass; } private addAddon(addonInstance: any) { this.orderIdx += 1; - let Klass = this.adapterClass(addonInstance.pkg.name); + let Klass = this.adapterClass(addonInstance); let v1Addon = new Klass(addonInstance, this.options, this.app, this.packageCache, this.orderIdx); let pkgs = getOrCreate(this.addons, v1Addon.root, () => []); pkgs.push(v1Addon);