import { config } from '@skava/di'
import {
Matchable,
MatchableTestArg,
ReplacementHandler,
Result,
ModuleReplacementOverridePlugin,
} from '../ModuleReplacementOverridePlugin'
import { overridable } from '../paths'
import { resolveToRoot, oneUp, exists } from './deps'
import { find } from './find'
import { createManifest } from './createManifest'
// process.env.LOG_COMPOSER = 'true'
function aliasNodeModules(result: Result, original: string[]) {
const resolved = resolveToRoot('node_modules') + '/' + original.slice(0).pop()
// @todo enhanced resolve?
// if (exists(resolved)) {}
result.request = resolved
result.resource = result.request
}
export class OverridePlugin {
overrideConfig: typeof overridable
constructor(overrideConfig = overridable) {
this.overrideConfig = overrideConfig
createManifest()
}
get plugin() {
return new ModuleReplacementOverridePlugin(
this.matchable,
this.replacementHandler
)
}
matchable: Matchable = {
test(match: MatchableTestArg) {
const isMatch =
typeof match === 'string' && match.includes('./') === false
return isMatch
},
}
replacementHandler: ReplacementHandler = (result?: Result) => {
// ignore relative paths
if (typeof result.request !== 'string') {
return
}
if (result.request.includes('./')) {
return
}
const appRootDir = config.get('appRootDir')
const appRootOneUp = oneUp(appRootDir)
const appRootTwoUp = oneUp(appRootOneUp)
const request = result.request
.replace(appRootDir, '')
.replace(appRootOneUp, '^')
.replace(appRootTwoUp, '^^')
// @todo resolve aliases here
const original = result.request.split('node_modules')
// +
if (request.includes('@si')) {
result.request = find(result.request)
}
// @todo resolve others this same way
else if (
request.includes('xmobx') ||
request.includes('react') ||
request.includes('uxui-modules')
) {
// console.log({ original })
// console.log(result.request)
// aliasNodeModules(result, original)
}
// else if (request.includes('@skava/modules')) {
// // aliasNodeModules(result, original)
// }
// composer logs
else if (process.env.LOG_COMPOSER) {
console.log(request)
}
}
}