1 | 'use strict';
|
2 |
|
3 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
4 |
|
5 | var fs = _interopDefault(require('fs'));
|
6 | var path = _interopDefault(require('path'));
|
7 | var MagicString = _interopDefault(require('magic-string'));
|
8 |
|
9 | const pify = fn => (...args) =>
|
10 | new Promise((resolve, reject) =>
|
11 | fn(...args, (err, result) => {
|
12 | return err ? reject(err) : resolve(result)
|
13 | })
|
14 | );
|
15 |
|
16 | var index = () => {
|
17 | const chmod = pify(fs.chmod);
|
18 | const shebangs = new Map();
|
19 | const shebangRe = /^\s*(#!.*)/;
|
20 | const outputFiles = new Set();
|
21 |
|
22 | return {
|
23 | name: 'hashbang',
|
24 |
|
25 | transform(code, id) {
|
26 | let match;
|
27 |
|
28 |
|
29 | if ((match = shebangRe.exec(code))) {
|
30 | shebangs.set(id, match[1]);
|
31 | const str = new MagicString(code);
|
32 | str.remove(match.index, match[1].length);
|
33 | return {
|
34 | code: str.toString(),
|
35 | map: str.generateMap({ hires: true })
|
36 | }
|
37 | }
|
38 |
|
39 | return null
|
40 | },
|
41 |
|
42 | renderChunk(code, { isEntry, facadeModuleId, fileName }, { file, dir }) {
|
43 | if (!isEntry || !shebangs.has(facadeModuleId)) return
|
44 |
|
45 | outputFiles.add(file || path.resolve(dir, fileName));
|
46 |
|
47 | const res = {};
|
48 | const str = new MagicString(code);
|
49 | str.prepend(shebangs.get(facadeModuleId) + '\n');
|
50 | res.code = str.toString();
|
51 | res.map = str.generateMap({ hires: true });
|
52 | return res
|
53 | },
|
54 |
|
55 | async writeBundle() {
|
56 | await Promise.all(
|
57 | [...outputFiles].map(async file => {
|
58 | await chmod(file, 0o755 & ~process.umask());
|
59 | })
|
60 | );
|
61 | }
|
62 | }
|
63 | };
|
64 |
|
65 | module.exports = index;
|