apply()

in src/index.js [44:129]


  apply(compiler) {
    const directory = this.options.directory || process.cwd()
    const additionalModules = this.options.modules || []
    const filename = this.options.filename || 'third-party-libs.xml'
    const pkg = require(join(directory, 'package.json'))
    const title = this.options.title || `${pkg.description} Front-End Libraries`

    const production = !this.options.devDependencies
    const formatModules = this.options.format || format
    const filterModules = this.filterModules.bind(this)
    const filterReasons = this.filterReasons.bind(this)
    const forceAddPackages = this.forceAddPackages
    const customLicenses = this.customLicenses
    const surviveLicenseErrors = this.options.surviveLicenseErrors
    const ignoreTeamcity = Boolean(this.options.ignoreTeamcity)
    const teamcityMessageStatus = this.options.teamcityMessageStatus

    const emit = (curCompiler, callback) => {
      // FS aliases from webpack.
      const mkdir = compiler.outputFileSystem.mkdir
      const writeFile = compiler.outputFileSystem.writeFile

      const stats = curCompiler.getStats().toJson({
        assets: false,
        chunks: false,
        source: false
      })

      const processModules = modules =>
        modules.filter(filterModules).reduce(
          (collected, module) =>
            (module.modules ? collected.concat(processModules(module.modules)) : collected).concat(
              module.reasons.filter(filterReasons).map(
                reason =>
                  (reason.userRequest[0] === '@'
                    ? reason.userRequest.
                      split('/').
                      splice(0, 2).
                      join('/')
                    : reason.userRequest.split('/')[0]),
              ),
            ),
          [],
        )

      const foundModules = processModules(stats.modules).concat(additionalModules)

      const modules = foundModules.concat(forceAddPackages)

      const uniqueModules = [...new Set(modules)]

      getLicences(
        uniqueModules,
        {directory, production, surviveLicenseErrors, ignoreTeamcity, teamcityMessageStatus},
        (getLicencesError, _modules) => {
          if (getLicencesError) {
            return callback(getLicencesError)
          }

          const allModules = _modules.concat(customLicenses)
          const filePath = join(compiler.options.output.path, filename)

          mkdir(dirname(filePath), {recursive: true}, mkdirError => {
            if (mkdirError && mkdirError.code !== 'EEXIST') {
              return callback(mkdirError);
            }

            writeFile(
              filePath,
              formatModules({title, modules: allModules}),
              {flags: 'w+'},
              callback,
            )
            return undefined
          })
          return undefined
        },
      )
    }

    if (compiler.hooks) {
      compiler.hooks.emit.tapAsync('RingUiLicenseCheckerPlugin', emit)
    } else {
      compiler.plugin('emit', emit)
    }
  }