import loaderUtils from 'loader-utils'

module.exports = function (content, sourceMap) {
  this.cacheable()
  const callback = this.async()
  const resourcePath = this.resourcePath

  const query = loaderUtils.getOptions(this)

  // Allows you to do checks on the file name. For example it's used to check if there's both a .js and .jsx file.
  if (query.validateFileName) {
    try {
      query.validateFileName(resourcePath)
    } catch (err) {
      callback(err)
      return
    }
  }

  const name = query.name || '[hash].[ext]'
  const context = query.context || this.options.context
  const regExp = query.regExp
  const opts = { context, content, regExp }
  const interpolateName = query.interpolateName || ((name) => name)
  const interpolatedName = interpolateName(loaderUtils.interpolateName(this, name, opts), {name, opts})
  const emit = (code, map) => {
    this.emitFile(interpolatedName, code, map)
    callback(null, code, map)
  }

  if (query.transform) {
    const transformed = query.transform({ content, sourceMap, interpolatedName })
    return emit(transformed.content, transformed.sourceMap)
  }

  return emit(content, sourceMap)
}

import loaderUtils from 'loader-utils'

module.exports = function (content, sourceMap) {
  this.cacheable()
  const callback = this.async()
  const resourcePath = this.resourcePath

  const query = loaderUtils.getOptions(this)

  // Allows you to do checks on the file name. For example it's used to check if there's both a .js and .jsx file.
  if (query.validateFileName) {
    try {
      query.validateFileName(resourcePath)
    } catch (err) {
      callback(err)
      return
    }
  }

  const name = query.name || '[hash].[ext]'
  const context = query.context || this.rootContext || this.options.context
  const regExp = query.regExp
  const opts = { context, content, regExp }
  const interpolateName = query.interpolateName || ((name) => name)
  const interpolatedName = interpolateName(loaderUtils.interpolateName(this, name, opts), {name, opts})
  const emit = (code, map) => {
    this.emitFile(interpolatedName, code, map)
    callback(null, code, map)
  }

  if (query.transform) {
    const transformed = query.transform({ content, sourceMap, interpolatedName })
    return emit(transformed.content, transformed.sourceMap)
  }

  return emit(content, sourceMap)
}

Fix emit-file-loader compatibility with Webpack 4 (#4918)