UNPKG

5.81 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5
6"use strict";
7
8const InnerGraph = require("../optimize/InnerGraph");
9const ConstDependency = require("./ConstDependency");
10const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
11const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
12const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
13const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
14const { ExportPresenceModes } = require("./HarmonyImportDependency");
15const {
16 harmonySpecifierTag,
17 getAssertions
18} = require("./HarmonyImportDependencyParserPlugin");
19const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
20
21const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency;
22
23module.exports = class HarmonyExportDependencyParserPlugin {
24 constructor(options) {
25 this.exportPresenceMode =
26 options.reexportExportsPresence !== undefined
27 ? ExportPresenceModes.fromUserOption(options.reexportExportsPresence)
28 : options.exportsPresence !== undefined
29 ? ExportPresenceModes.fromUserOption(options.exportsPresence)
30 : options.strictExportPresence
31 ? ExportPresenceModes.ERROR
32 : ExportPresenceModes.AUTO;
33 }
34
35 apply(parser) {
36 const { exportPresenceMode } = this;
37 parser.hooks.export.tap(
38 "HarmonyExportDependencyParserPlugin",
39 statement => {
40 const dep = new HarmonyExportHeaderDependency(
41 statement.declaration && statement.declaration.range,
42 statement.range
43 );
44 dep.loc = Object.create(statement.loc);
45 dep.loc.index = -1;
46 parser.state.module.addPresentationalDependency(dep);
47 return true;
48 }
49 );
50 parser.hooks.exportImport.tap(
51 "HarmonyExportDependencyParserPlugin",
52 (statement, source) => {
53 parser.state.lastHarmonyImportOrder =
54 (parser.state.lastHarmonyImportOrder || 0) + 1;
55 const clearDep = new ConstDependency("", statement.range);
56 clearDep.loc = Object.create(statement.loc);
57 clearDep.loc.index = -1;
58 parser.state.module.addPresentationalDependency(clearDep);
59 const sideEffectDep = new HarmonyImportSideEffectDependency(
60 source,
61 parser.state.lastHarmonyImportOrder,
62 getAssertions(statement)
63 );
64 sideEffectDep.loc = Object.create(statement.loc);
65 sideEffectDep.loc.index = -1;
66 parser.state.current.addDependency(sideEffectDep);
67 return true;
68 }
69 );
70 parser.hooks.exportExpression.tap(
71 "HarmonyExportDependencyParserPlugin",
72 (statement, expr) => {
73 const isFunctionDeclaration = expr.type === "FunctionDeclaration";
74 const comments = parser.getComments([
75 statement.range[0],
76 expr.range[0]
77 ]);
78 const dep = new HarmonyExportExpressionDependency(
79 expr.range,
80 statement.range,
81 comments
82 .map(c => {
83 switch (c.type) {
84 case "Block":
85 return `/*${c.value}*/`;
86 case "Line":
87 return `//${c.value}\n`;
88 }
89 return "";
90 })
91 .join(""),
92 expr.type.endsWith("Declaration") && expr.id
93 ? expr.id.name
94 : isFunctionDeclaration
95 ? {
96 id: expr.id ? expr.id.name : undefined,
97 range: [
98 expr.range[0],
99 expr.params.length > 0
100 ? expr.params[0].range[0]
101 : expr.body.range[0]
102 ],
103 prefix: `${expr.async ? "async " : ""}function${
104 expr.generator ? "*" : ""
105 } `,
106 suffix: `(${expr.params.length > 0 ? "" : ") "}`
107 }
108 : undefined
109 );
110 dep.loc = Object.create(statement.loc);
111 dep.loc.index = -1;
112 parser.state.current.addDependency(dep);
113 InnerGraph.addVariableUsage(
114 parser,
115 expr.type.endsWith("Declaration") && expr.id
116 ? expr.id.name
117 : "*default*",
118 "default"
119 );
120 return true;
121 }
122 );
123 parser.hooks.exportSpecifier.tap(
124 "HarmonyExportDependencyParserPlugin",
125 (statement, id, name, idx) => {
126 const settings = parser.getTagData(id, harmonySpecifierTag);
127 let dep;
128 const harmonyNamedExports = (parser.state.harmonyNamedExports =
129 parser.state.harmonyNamedExports || new Set());
130 harmonyNamedExports.add(name);
131 InnerGraph.addVariableUsage(parser, id, name);
132 if (settings) {
133 dep = new HarmonyExportImportedSpecifierDependency(
134 settings.source,
135 settings.sourceOrder,
136 settings.ids,
137 name,
138 harmonyNamedExports,
139 null,
140 exportPresenceMode,
141 null,
142 settings.assertions
143 );
144 } else {
145 dep = new HarmonyExportSpecifierDependency(id, name);
146 }
147 dep.loc = Object.create(statement.loc);
148 dep.loc.index = idx;
149 parser.state.current.addDependency(dep);
150 return true;
151 }
152 );
153 parser.hooks.exportImportSpecifier.tap(
154 "HarmonyExportDependencyParserPlugin",
155 (statement, source, id, name, idx) => {
156 const harmonyNamedExports = (parser.state.harmonyNamedExports =
157 parser.state.harmonyNamedExports || new Set());
158 let harmonyStarExports = null;
159 if (name) {
160 harmonyNamedExports.add(name);
161 } else {
162 harmonyStarExports = parser.state.harmonyStarExports =
163 parser.state.harmonyStarExports || new HarmonyStarExportsList();
164 }
165 const dep = new HarmonyExportImportedSpecifierDependency(
166 source,
167 parser.state.lastHarmonyImportOrder,
168 id ? [id] : [],
169 name,
170 harmonyNamedExports,
171 harmonyStarExports && harmonyStarExports.slice(),
172 exportPresenceMode,
173 harmonyStarExports
174 );
175 if (harmonyStarExports) {
176 harmonyStarExports.push(dep);
177 }
178 dep.loc = Object.create(statement.loc);
179 dep.loc.index = idx;
180 parser.state.current.addDependency(dep);
181 return true;
182 }
183 );
184 }
185};