UNPKG

1.67 kBJavaScriptView Raw
1'use strict';
2
3function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
4
5var fs = _interopDefault(require('fs'));
6var path = _interopDefault(require('path'));
7var MagicString = _interopDefault(require('magic-string'));
8
9const pify = fn => (...args) =>
10 new Promise((resolve, reject) =>
11 fn(...args, (err, result) => {
12 return err ? reject(err) : resolve(result)
13 })
14 );
15
16var 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 // eslint-disable-next-line no-cond-assign
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
65module.exports = index;