/
getExportBlock.ts
115 lines (109 loc) · 3.37 KB
/
getExportBlock.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { ChunkDependencies, ChunkExports } from '../../Chunk';
export default function getExportBlock(
exports: ChunkExports,
dependencies: ChunkDependencies,
namedExportsMode: boolean,
interop: boolean,
compact: boolean,
t: string,
mechanism = 'return '
) {
const _ = compact ? '' : ' ';
const n = compact ? '' : '\n';
if (!namedExportsMode) {
let local;
if (exports.length > 0) {
local = exports[0].local;
} else {
for (const dep of dependencies) {
if (dep.reexports) {
const expt = dep.reexports[0];
local =
dep.namedExportsMode && expt.imported !== '*' && expt.imported !== 'default'
? `${dep.name}.${expt.imported}`
: dep.name;
}
}
}
return `${mechanism}${local};`;
}
let exportBlock = '';
// star exports must always output first for precedence
dependencies.forEach(({ name, reexports }) => {
if (reexports && namedExportsMode) {
reexports.forEach(specifier => {
if (specifier.reexported === '*') {
if (exportBlock) exportBlock += n;
if (specifier.needsLiveBinding) {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default')${_}Object.defineProperty(exports,${_}k,${_}{${n}` +
`${t}${t}enumerable:${_}true,${n}` +
`${t}${t}get:${_}function${_}()${_}{${n}` +
`${t}${t}${t}return ${name}[k];${n}` +
`${t}${t}}${n}${t}});${n}});`;
} else {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default')${_}exports[k]${_}=${_}${name}[k];${n}});`;
}
}
});
}
});
for (const {
name,
imports,
reexports,
isChunk,
namedExportsMode: depNamedExportsMode,
exportsNames
} of dependencies) {
if (reexports && namedExportsMode) {
for (const specifier of reexports) {
if (specifier.imported === 'default' && !isChunk) {
if (exportBlock) exportBlock += n;
if (
exportsNames &&
(reexports.some(specifier =>
specifier.imported === 'default'
? specifier.reexported === 'default'
: specifier.imported !== '*'
) ||
(imports && imports.some(specifier => specifier.imported !== 'default')))
) {
exportBlock += `exports.${specifier.reexported}${_}=${_}${name}${
interop !== false ? '__default' : '.default'
};`;
} else {
exportBlock += `exports.${specifier.reexported}${_}=${_}${name};`;
}
} else if (specifier.imported !== '*') {
if (exportBlock) exportBlock += n;
const importName =
specifier.imported === 'default' && !depNamedExportsMode
? name
: `${name}.${specifier.imported}`;
exportBlock += specifier.needsLiveBinding
? `Object.defineProperty(exports,${_}'${specifier.reexported}',${_}{${n}` +
`${t}enumerable:${_}true,${n}` +
`${t}get:${_}function${_}()${_}{${n}` +
`${t}${t}return ${importName};${n}${t}}${n}});`
: `exports.${specifier.reexported}${_}=${_}${importName};`;
} else if (specifier.reexported !== '*') {
if (exportBlock) exportBlock += n;
exportBlock += `exports.${specifier.reexported}${_}=${_}${name};`;
}
}
}
}
for (const expt of exports) {
const lhs = `exports.${expt.exported}`;
const rhs = expt.local;
if (lhs !== rhs) {
if (exportBlock) exportBlock += n;
exportBlock += `${lhs}${_}=${_}${rhs};`;
}
}
return exportBlock;
}