UNPKG

1.89 kBJavaScriptView Raw
1import {IdentifierRole, isTopLevelDeclaration} from "../parser/tokenizer";
2
3import Transformer from "./Transformer";
4
5export default class ReactHotLoaderTransformer extends Transformer {
6 __init() {this.extractedDefaultExportName = null}
7
8 constructor( tokens, filePath) {
9 super();this.tokens = tokens;this.filePath = filePath;ReactHotLoaderTransformer.prototype.__init.call(this);;
10 }
11
12 setExtractedDefaultExportName(extractedDefaultExportName) {
13 this.extractedDefaultExportName = extractedDefaultExportName;
14 }
15
16 getPrefixCode() {
17 return `
18 (function () {
19 var enterModule = require('react-hot-loader').enterModule;
20 enterModule && enterModule(module);
21 })();`
22 .replace(/\s+/g, " ")
23 .trim();
24 }
25
26 getSuffixCode() {
27 const topLevelNames = new Set();
28 for (const token of this.tokens.tokens) {
29 if (
30 !token.isType &&
31 isTopLevelDeclaration(token) &&
32 token.identifierRole !== IdentifierRole.ImportDeclaration
33 ) {
34 topLevelNames.add(this.tokens.identifierNameForToken(token));
35 }
36 }
37 const namesToRegister = Array.from(topLevelNames).map((name) => ({
38 variableName: name,
39 uniqueLocalName: name,
40 }));
41 if (this.extractedDefaultExportName) {
42 namesToRegister.push({
43 variableName: this.extractedDefaultExportName,
44 uniqueLocalName: "default",
45 });
46 }
47 return `
48;(function () {
49 var reactHotLoader = require('react-hot-loader').default;
50 var leaveModule = require('react-hot-loader').leaveModule;
51 if (!reactHotLoader) {
52 return;
53 }
54${namesToRegister
55 .map(
56 ({variableName, uniqueLocalName}) =>
57 ` reactHotLoader.register(${variableName}, "${uniqueLocalName}", ${JSON.stringify(
58 this.filePath || "",
59 )});`,
60 )
61 .join("\n")}
62 leaveModule(module);
63})();`;
64 }
65
66 process() {
67 return false;
68 }
69}