Files
Alexander Vakrilov 9fcc1ddf94 feat(bundle): support for file qualifiers + builder refactor (#7386)
* feat(bundle): support for file qualifiers in builder

* chore: add qualifiers test app

* chore: add @Deprecated for file-name-resolver

* fix(hmr): hmr not working for scss files

* chore: globals clean-up

* shore: fix tslint

* tests: uncomment test fixed by ns-dev-webpack

* chore: move qualifiers app to e2e

* chore: update webpack config

* chore: tslint errors

* test: fix wrong css import
2019-06-26 18:40:18 +03:00

71 lines
2.1 KiB
TypeScript

import { ModuleNameResolver as ModuleNameResolverDefinition, ModuleListProvider } from "./";
import { screen, device } from "../platform/platform";
import * as appCommonModule from "../application/application-common";
import { PlatformContext, findMatch } from "./qualifier-matcher";
export class ModuleNameResolver implements ModuleNameResolverDefinition {
private _cache = {};
constructor(private context: PlatformContext, private moduleListProvider: ModuleListProvider = global.getRegisteredModules) {
}
public resolveModuleName(path: string, ext: string): string {
const key = path + ext;
let result: string = this._cache[key];
if (result === undefined) {
result = this.resolveModuleNameImpl(path, ext);
this._cache[key] = result;
}
return result;
}
public clearCache(): void {
this._cache = {};
}
private resolveModuleNameImpl(path: string, ext: string): string {
let result: string = null;
ext = ext ? "." + ext : "";
const candidates = this.getCandidates(path, ext);
result = findMatch(path, ext, candidates, this.context);
return result;
}
private getCandidates(path: string, ext: string): Array<string> {
const candidates = this.moduleListProvider()
.filter((moduleName) => moduleName.startsWith(path) && (!ext || moduleName.endsWith(ext)));
return candidates;
}
}
let resolverInstance: ModuleNameResolver;
export function resolveModuleName(path: string, ext: string): string {
if (!resolverInstance) {
resolverInstance = new ModuleNameResolver({
width: screen.mainScreen.widthDIPs,
height: screen.mainScreen.heightDIPs,
os: device.os,
deviceType: device.deviceType
});
}
return resolverInstance.resolveModuleName(path, ext);
}
export function clearCache() {
if (resolverInstance) {
resolverInstance.clearCache();
}
}
export function _setResolver(resolver: ModuleNameResolver) {
resolverInstance = resolver;
}
appCommonModule.on("livesync", args => clearCache());