1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | var fs = require('fs');
|
7 | var path = require('path');
|
8 | var exec = require('child_process').execSync;
|
9 | var bella = require('bellajs');
|
10 |
|
11 | var parser = require('shift-parser');
|
12 | var codegen = require('shift-codegen').default;
|
13 | var babel = require('babel-core');
|
14 |
|
15 | const 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 |
|
35 | var 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 |
|
59 | var jsminify = (code) => {
|
60 | let ast = parser.parseScript(code);
|
61 | return codegen(ast);
|
62 | };
|
63 |
|
64 | var 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 |
|
152 | module.exports = {
|
153 | compile
|
154 | };
|