UNPKG

2.87 kBJavaScriptView Raw
1/**
2 * Smart builder JS code
3 * @ndaidong
4**/
5
6var fs = require('fs');
7var path = require('path');
8var exec = require('child_process').execSync;
9var bella = require('bellajs');
10
11var parser = require('shift-parser');
12var codegen = require('shift-codegen').default;
13var babel = require('babel-core');
14
15const TEMPLATE = `
16;((name, factory) => {
17 if (typeof module !== 'undefined' && module.exports) {
18 module.exports = factory();
19 } else {
20 let root = window || {};
21 if (root.define && root.define.amd) {
22 root.define([], factory);
23 } else if (root.exports) {
24 root.exports = factory();
25 } else {
26 root[name] = factory();
27 }
28 }
29})('{{globalVar}}', () => {
30 {{code}}
31});
32`;
33
34
35var transpile = (code) => {
36 return babel.transform(code, {
37 presets: [
38 [
39 'env', {
40 targets: {
41 browsers: [
42 'safari 9',
43 'ie 11',
44 'Android 4',
45 'iOS 7'
46 ]
47 }
48 }
49 ]
50 ],
51 plugins: [
52 'transform-remove-strict-mode'
53 ],
54 comments: false,
55 sourceMaps: true
56 });
57};
58
59var jsminify = (code) => {
60 let ast = parser.parseScript(code);
61 return codegen(ast);
62};
63
64var compile = (opt) => {
65
66 let {
67 source,
68 target,
69 filename,
70 globalVar,
71 repository: repo,
72 author,
73 license,
74 name,
75 description,
76 version,
77 code
78 } = opt;
79
80 let date = bella.date;
81 let sd = date.utc();
82
83 let output = filename || name;
84 let devOutput = `${target}/${output}.js`;
85 let proOutput = `${target}/${output}.min.js`;
86
87 if (fs.existsSync(target)) {
88 exec('rm -rf ' + target);
89 }
90 exec('mkdir ' + target);
91
92 let devFile = path.normalize(devOutput);
93 let proFile = path.normalize(proOutput);
94
95
96 let template = TEMPLATE;
97
98 let glovar = globalVar || name;
99 let s = template.replace('{{code}}', code.replace('module.exports =', 'return')).replace('{{globalVar}}', glovar);
100 let r = transpile(s);
101 let content = r.code;
102
103 let sdev = [
104 `/**`,
105 ` * ${name}`,
106 ` * v${version}`,
107 ` * built: ${sd}`,
108 ` * ${repo.type}: ${repo.url}`,
109 ` * author: ${author}`,
110 ` * License: ${license}`,
111 `**/\n`,
112 content
113 ].join('\n');
114
115 fs.writeFileSync(devFile, sdev, 'utf8');
116
117 let min = jsminify(sdev);
118 if (!min.startsWith(';')) {
119 min = ';' + min;
120 }
121 if (!min.endsWith(';')) {
122 min += ';';
123 }
124
125 let spro = [
126 `// ${name}@${version}, by ${author} - built on ${sd} - published under ${license} license`,
127 min
128 ].join('\n');
129
130 fs.writeFileSync(proFile, spro, 'utf8');
131
132 return {
133 input: {
134 source,
135 target,
136 filename,
137 globalVar,
138 repository: repo,
139 author,
140 license,
141 name,
142 description,
143 version
144 },
145 output: {
146 development: devFile,
147 production: proFile
148 }
149 };
150};
151
152module.exports = {
153 compile
154};