1 | 1 | 'use strict'; |
2 | | |
3 | 1 | var atob = require('atob'); |
4 | | |
5 | 1 | var babel = require('babel-core'); |
6 | 1 | var browserify = require('browserify'); |
7 | | |
8 | 1 | var babelify = require('babelify'); |
9 | 1 | var es2015 = require('babel-preset-es2015'); |
10 | 1 | var react = require('babel-preset-react'); |
11 | | |
12 | 1 | var sourceMapPattern = /\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,(.*)/; |
13 | 1 | var sourceMapPatternMatchIndex = 1; |
14 | | |
15 | 1 | var OPTION_DEFAULTS = { |
16 | | 'bundle': false, |
17 | | 'output': null, |
18 | | 'sourcemap': false |
19 | | }; |
20 | | |
21 | | /** |
22 | | * Transforms a file with babel. |
23 | | * |
24 | | * @example spire.transformFileWithBabel(file).then(function (result) { console.log(result); }); |
25 | | * @param {String} file File path. |
26 | | * @param {Object} [options] Options object. |
27 | | * @param {Boolean} [options.sourcemap] Generate sourcemap. |
28 | | * @return {Object} Promise |
29 | | * @public |
30 | | */ |
31 | | |
32 | 1 | var transformFileWithBabel = function transformFileWithBabel(file, options) { |
33 | 13 | return new Promise(function (resolve, reject) { |
34 | | |
35 | 13 | var settings = Object.assign({}, OPTION_DEFAULTS, options); |
36 | | |
37 | 13 | var sourceMaps = true; |
38 | | |
39 | 13 | if (settings.sourcemap && !settings.output) { |
40 | | |
41 | 1 | sourceMaps = 'inline'; |
42 | | } |
43 | | |
44 | 13 | babel.transformFile(file, { |
45 | | 'presets': [es2015, react], |
46 | | sourceMaps: sourceMaps |
47 | | }, function (err, result) { |
48 | | |
49 | 13 | if (err) { |
50 | | |
51 | 1 | return reject(new Error(err)); |
52 | | } |
53 | | |
54 | 12 | var code = result.code.trim() + '\n'; |
55 | 12 | var map = null; |
56 | | |
57 | 12 | if (settings.sourcemap) { |
58 | | |
59 | 3 | map = JSON.stringify(result.map) + '\n'; |
60 | | |
61 | 3 | if (settings.output) { |
62 | | |
63 | 2 | code = code + '//# sourceMappingURL=' + settings.output + '.map\n'; |
64 | | } |
65 | | } |
66 | | |
67 | 12 | return resolve({ |
68 | | code: code, |
69 | | map: map |
70 | | }); |
71 | | }); |
72 | | }); |
73 | | }; |
74 | | |
75 | | /** |
76 | | * Transforms a file with browserify. |
77 | | * |
78 | | * @example spire.transformFileWithBrowserify(file).then(function (result) { console.log(result); }); |
79 | | * @param {String} file File path. |
80 | | * @param {Object} [options] Options object. |
81 | | * @param {Boolean} [options.sourcemap] Generate sourcemap. |
82 | | * @return {Object} Promise |
83 | | * @public |
84 | | */ |
85 | | |
86 | 1 | var transformFileWithBrowserify = function transformFileWithBrowserify(file, options) { |
87 | 5 | return new Promise(function (resolve, reject) { |
88 | | |
89 | 5 | var settings = Object.assign({}, OPTION_DEFAULTS, options); |
90 | | |
91 | 5 | var debug = false; |
92 | | |
93 | 5 | if (settings.sourcemap) { |
94 | | |
95 | 3 | debug = true; |
96 | | } |
97 | | |
98 | | browserify(file, { debug: debug }).transform(babelify, { |
99 | | 'presets': [es2015, react] |
100 | 5 | }).bundle(function (err, buffer) { |
101 | | |
102 | 5 | if (err) { |
103 | | |
104 | 1 | return reject(new Error(err)); |
105 | | } |
106 | | |
107 | 4 | var code = buffer.toString().trim() + '\n'; |
108 | 4 | var map = null; |
109 | | |
110 | 4 | if (settings.sourcemap) { |
111 | | |
112 | 3 | map = atob(sourceMapPattern.exec(code)[sourceMapPatternMatchIndex]); |
113 | | |
114 | 3 | if (settings.output) { |
115 | | |
116 | 2 | code = code.replace(sourceMapPattern, '//# sourceMappingURL=' + settings.output + '.map\n'); |
117 | | } |
118 | | } |
119 | | |
120 | 4 | return resolve({ |
121 | | code: code, |
122 | | map: map |
123 | | }); |
124 | | }); |
125 | | }); |
126 | | }; |
127 | | |
128 | | /** |
129 | | * Transforms a file. |
130 | | * |
131 | | * @example spire.transformFile(file, options).then(function (result) { console.log(result); }); |
132 | | * @param {String} file File path. |
133 | | * @param {Object} [options] Options object. |
134 | | * @param {Boolean} [options.bundle] Use browserify bundler. |
135 | | * @param {Boolean} [options.sourcemap] Generate sourcemap. |
136 | | * @return {Object} Promise |
137 | | * @public |
138 | | */ |
139 | | |
140 | 1 | var transformFile = function transformFile(file, options) { |
141 | | |
142 | 18 | var settings = Object.assign({}, OPTION_DEFAULTS, options); |
143 | | |
144 | 18 | if (settings.bundle) { |
145 | | |
146 | 5 | return transformFileWithBrowserify(file, options); |
147 | | } |
148 | | |
149 | 13 | return transformFileWithBabel(file, options); |
150 | | }; |
151 | | |
152 | 1 | module.exports = { |
153 | | transformFileWithBabel: transformFileWithBabel, |
154 | | transformFileWithBrowserify: transformFileWithBrowserify, |
155 | | transformFile: transformFile |
156 | | }; |