70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {IdentifierRole, isTopLevelDeclaration} from "../parser/tokenizer";
 | 
						|
 | 
						|
import Transformer from "./Transformer";
 | 
						|
 | 
						|
export default class ReactHotLoaderTransformer extends Transformer {
 | 
						|
   __init() {this.extractedDefaultExportName = null}
 | 
						|
 | 
						|
  constructor( tokens,  filePath) {
 | 
						|
    super();this.tokens = tokens;this.filePath = filePath;ReactHotLoaderTransformer.prototype.__init.call(this);;
 | 
						|
  }
 | 
						|
 | 
						|
  setExtractedDefaultExportName(extractedDefaultExportName) {
 | 
						|
    this.extractedDefaultExportName = extractedDefaultExportName;
 | 
						|
  }
 | 
						|
 | 
						|
  getPrefixCode() {
 | 
						|
    return `
 | 
						|
      (function () {
 | 
						|
        var enterModule = require('react-hot-loader').enterModule;
 | 
						|
        enterModule && enterModule(module);
 | 
						|
      })();`
 | 
						|
      .replace(/\s+/g, " ")
 | 
						|
      .trim();
 | 
						|
  }
 | 
						|
 | 
						|
  getSuffixCode() {
 | 
						|
    const topLevelNames = new Set();
 | 
						|
    for (const token of this.tokens.tokens) {
 | 
						|
      if (
 | 
						|
        !token.isType &&
 | 
						|
        isTopLevelDeclaration(token) &&
 | 
						|
        token.identifierRole !== IdentifierRole.ImportDeclaration
 | 
						|
      ) {
 | 
						|
        topLevelNames.add(this.tokens.identifierNameForToken(token));
 | 
						|
      }
 | 
						|
    }
 | 
						|
    const namesToRegister = Array.from(topLevelNames).map((name) => ({
 | 
						|
      variableName: name,
 | 
						|
      uniqueLocalName: name,
 | 
						|
    }));
 | 
						|
    if (this.extractedDefaultExportName) {
 | 
						|
      namesToRegister.push({
 | 
						|
        variableName: this.extractedDefaultExportName,
 | 
						|
        uniqueLocalName: "default",
 | 
						|
      });
 | 
						|
    }
 | 
						|
    return `
 | 
						|
;(function () {
 | 
						|
  var reactHotLoader = require('react-hot-loader').default;
 | 
						|
  var leaveModule = require('react-hot-loader').leaveModule;
 | 
						|
  if (!reactHotLoader) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
${namesToRegister
 | 
						|
  .map(
 | 
						|
    ({variableName, uniqueLocalName}) =>
 | 
						|
      `  reactHotLoader.register(${variableName}, "${uniqueLocalName}", ${JSON.stringify(
 | 
						|
        this.filePath || "",
 | 
						|
      )});`,
 | 
						|
  )
 | 
						|
  .join("\n")}
 | 
						|
  leaveModule(module);
 | 
						|
})();`;
 | 
						|
  }
 | 
						|
 | 
						|
  process() {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
}
 |