const { resolveCompiler } = require('./compiler')

const clientCache = new WeakMap()
const serverCache = new WeakMap()

exports.resolveScript = function resolveScript(
  descriptor,
  scopeId,
  options,
  loaderContext
) {
  if (!descriptor.script && !descriptor.scriptSetup) {
    return null
  }

  const { compiler } = resolveCompiler(loaderContext.rootContext, loaderContext)
  if (!compiler.compileScript) {
    if (descriptor.scriptSetup) {
      loaderContext.emitError(
        'The version of Vue you are using does not support <script setup>. ' +
          'Please upgrade to 2.7 or above.'
      )
    }
    return descriptor.script
  }

  const isProd =
    loaderContext.mode === 'production' || process.env.NODE_ENV === 'production'
  const isServer = options.optimizeSSR || loaderContext.target === 'node'

  const cacheToUse = isServer ? serverCache : clientCache
  const cached = cacheToUse.get(descriptor)
  if (cached) {
    return cached
  }

  let resolved = null

  try {
    resolved = compiler.compileScript(descriptor, {
      id: scopeId,
      isProd,
      babelParserPlugins: options.babelParserPlugins
    })
  } catch (e) {
    loaderContext.emitError(e)
  }

  cacheToUse.set(descriptor, resolved)
  return resolved
}