Learn more  » Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

skava / @skava/composer   js

Repository URL to install this package:

Version: 1.4.0 

/ src / OverridePlugin / OverridePlugin.ts

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)
    }
  }
}