48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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
 | 
						|
}
 |