| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | const fs = require('fs')const path = require('path')const { resolveCompiler } = require('./compiler')const cache = new Map()exports.setDescriptor = function setDescriptor(filename, entry) {  cache.set(cleanQuery(filename), entry)}exports.getDescriptor = function getDescriptor(  filename,  options,  loaderContext) {  filename = cleanQuery(filename)  if (cache.has(filename)) {    return cache.get(filename)  }  // This function should only be called after the descriptor has been  // cached by the main loader.  // If this is somehow called without a cache hit, it's probably due to sub  // loaders being run in separate threads. The only way to deal with this is to  // read from disk directly...  const source = fs.readFileSync(filename, 'utf-8')  const sourceRoot = path.dirname(    path.relative(loaderContext.rootContext, loaderContext.resourcePath)  )  const { compiler, templateCompiler } = resolveCompiler(    loaderContext.rootContext  )  const descriptor = compiler.parse({    source,    compiler: options.compiler || templateCompiler,    filename,    sourceRoot,    needMap: loaderContext.sourceMap  })  cache.set(filename, descriptor)  return descriptor}function cleanQuery(str) {  const i = str.indexOf('?')  return i > 0 ? str.slice(0, i) : str}
 |