1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | "use strict";
|
7 |
|
8 | const InnerGraph = require("../optimize/InnerGraph");
|
9 | const ConstDependency = require("./ConstDependency");
|
10 | const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
|
11 | const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
|
12 | const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
|
13 | const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
|
14 | const { ExportPresenceModes } = require("./HarmonyImportDependency");
|
15 | const {
|
16 | harmonySpecifierTag,
|
17 | getAssertions
|
18 | } = require("./HarmonyImportDependencyParserPlugin");
|
19 | const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
|
20 |
|
21 | const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency;
|
22 |
|
23 | module.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 | };
|