UNPKG

4.33 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = _default;
7
8function helpers() {
9 const data = require("@babel/helpers");
10
11 helpers = function () {
12 return data;
13 };
14
15 return data;
16}
17
18function _generator() {
19 const data = require("@babel/generator");
20
21 _generator = function () {
22 return data;
23 };
24
25 return data;
26}
27
28function _template() {
29 const data = require("@babel/template");
30
31 _template = function () {
32 return data;
33 };
34
35 return data;
36}
37
38function _t() {
39 const data = require("@babel/types");
40
41 _t = function () {
42 return data;
43 };
44
45 return data;
46}
47
48var _file = require("../transformation/file/file");
49
50const {
51 arrayExpression,
52 assignmentExpression,
53 binaryExpression,
54 blockStatement,
55 callExpression,
56 cloneNode,
57 conditionalExpression,
58 exportNamedDeclaration,
59 exportSpecifier,
60 expressionStatement,
61 functionExpression,
62 identifier,
63 memberExpression,
64 objectExpression,
65 program,
66 stringLiteral,
67 unaryExpression,
68 variableDeclaration,
69 variableDeclarator
70} = _t();
71
72const buildUmdWrapper = replacements => _template().default.statement`
73 (function (root, factory) {
74 if (typeof define === "function" && define.amd) {
75 define(AMD_ARGUMENTS, factory);
76 } else if (typeof exports === "object") {
77 factory(COMMON_ARGUMENTS);
78 } else {
79 factory(BROWSER_ARGUMENTS);
80 }
81 })(UMD_ROOT, function (FACTORY_PARAMETERS) {
82 FACTORY_BODY
83 });
84 `(replacements);
85
86function buildGlobal(allowlist) {
87 const namespace = identifier("babelHelpers");
88 const body = [];
89 const container = functionExpression(null, [identifier("global")], blockStatement(body));
90 const tree = program([expressionStatement(callExpression(container, [conditionalExpression(binaryExpression("===", unaryExpression("typeof", identifier("global")), stringLiteral("undefined")), identifier("self"), identifier("global"))]))]);
91 body.push(variableDeclaration("var", [variableDeclarator(namespace, assignmentExpression("=", memberExpression(identifier("global"), namespace), objectExpression([])))]));
92 buildHelpers(body, namespace, allowlist);
93 return tree;
94}
95
96function buildModule(allowlist) {
97 const body = [];
98 const refs = buildHelpers(body, null, allowlist);
99 body.unshift(exportNamedDeclaration(null, Object.keys(refs).map(name => {
100 return exportSpecifier(cloneNode(refs[name]), identifier(name));
101 })));
102 return program(body, [], "module");
103}
104
105function buildUmd(allowlist) {
106 const namespace = identifier("babelHelpers");
107 const body = [];
108 body.push(variableDeclaration("var", [variableDeclarator(namespace, identifier("global"))]));
109 buildHelpers(body, namespace, allowlist);
110 return program([buildUmdWrapper({
111 FACTORY_PARAMETERS: identifier("global"),
112 BROWSER_ARGUMENTS: assignmentExpression("=", memberExpression(identifier("root"), namespace), objectExpression([])),
113 COMMON_ARGUMENTS: identifier("exports"),
114 AMD_ARGUMENTS: arrayExpression([stringLiteral("exports")]),
115 FACTORY_BODY: body,
116 UMD_ROOT: identifier("this")
117 })]);
118}
119
120function buildVar(allowlist) {
121 const namespace = identifier("babelHelpers");
122 const body = [];
123 body.push(variableDeclaration("var", [variableDeclarator(namespace, objectExpression([]))]));
124 const tree = program(body);
125 buildHelpers(body, namespace, allowlist);
126 body.push(expressionStatement(namespace));
127 return tree;
128}
129
130function buildHelpers(body, namespace, allowlist) {
131 const getHelperReference = name => {
132 return namespace ? memberExpression(namespace, identifier(name)) : identifier(`_${name}`);
133 };
134
135 const refs = {};
136 helpers().list.forEach(function (name) {
137 if (allowlist && allowlist.indexOf(name) < 0) return;
138 const ref = refs[name] = getHelperReference(name);
139 helpers().ensure(name, _file.default);
140 const {
141 nodes
142 } = helpers().get(name, getHelperReference, ref);
143 body.push(...nodes);
144 });
145 return refs;
146}
147
148function _default(allowlist, outputType = "global") {
149 let tree;
150 const build = {
151 global: buildGlobal,
152 module: buildModule,
153 umd: buildUmd,
154 var: buildVar
155 }[outputType];
156
157 if (build) {
158 tree = build(allowlist);
159 } else {
160 throw new Error(`Unsupported output type ${outputType}`);
161 }
162
163 return (0, _generator().default)(tree).code;
164}
\No newline at end of file