-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathcjs.ts
101 lines (95 loc) · 2.48 KB
/
cjs.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
import type { Bundle as MagicStringBundle } from 'magic-string';
import type { ChunkDependency } from '../Chunk';
import type { NormalizedOutputOptions } from '../rollup/types';
import type { GenerateCodeSnippets } from '../utils/generateCodeSnippets';
import type { FinaliserOptions } from './index';
import { getExportBlock, getNamespaceMarkers } from './shared/getExportBlock';
import getInteropBlock from './shared/getInteropBlock';
export default function cjs(
magicString: MagicStringBundle,
{
accessedGlobals,
dependencies,
exports,
hasDefaultExport,
hasExports,
indent: t,
intro,
isEntryFacade,
isModuleFacade,
namedExportsMode,
outro,
snippets
}: FinaliserOptions,
{
compact,
esModule,
externalLiveBindings,
freeze,
interop,
generatedCode: { symbols },
reexportProtoFromExternal,
strict
}: NormalizedOutputOptions
): void {
const { _, n } = snippets;
const useStrict = strict ? `'use strict';${n}${n}` : '';
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
isEntryFacade && (esModule === true || (esModule === 'if-default-prop' && hasDefaultExport)),
isModuleFacade && symbols,
snippets
);
if (namespaceMarkers) {
namespaceMarkers += n + n;
}
const importBlock = getImportBlock(dependencies, snippets, compact);
const interopBlock = getInteropBlock(
dependencies,
interop,
externalLiveBindings,
freeze,
symbols,
accessedGlobals,
t,
snippets
);
magicString.prepend(`${useStrict}${intro}${namespaceMarkers}${importBlock}${interopBlock}`);
const exportBlock = getExportBlock(
exports,
dependencies,
namedExportsMode,
interop,
snippets,
t,
externalLiveBindings,
reexportProtoFromExternal,
`module.exports${_}=${_}`
);
magicString.append(`${exportBlock}${outro}`);
}
function getImportBlock(
dependencies: readonly ChunkDependency[],
{ _, cnst, n }: GenerateCodeSnippets,
compact: boolean
): string {
let importBlock = '';
let definingVariable = false;
for (const { importPath, name, reexports, imports } of dependencies) {
if (!reexports && !imports) {
if (importBlock) {
importBlock += compact && !definingVariable ? ',' : `;${n}`;
}
definingVariable = false;
importBlock += `require('${importPath}')`;
} else {
importBlock += compact && definingVariable ? ',' : `${importBlock ? `;${n}` : ''}${cnst} `;
definingVariable = true;
importBlock += `${name}${_}=${_}require('${importPath}')`;
}
}
if (importBlock) {
return `${importBlock};${n}${n}`;
}
return '';
}