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
 | |
| }
 |