var JSONStream = require('JSONStream'); var defined = require('defined'); var through = require('through2'); var umd = require('umd'); var Buffer = require('safe-buffer').Buffer; var fs = require('fs'); var path = require('path'); var combineSourceMap = require('combine-source-map'); var defaultPreludePath = path.join(__dirname, '_prelude.js'); var defaultPrelude = fs.readFileSync(defaultPreludePath, 'utf8'); function newlinesIn(src) { if (!src) return 0; var newlines = src.match(/\n/g); return newlines ? newlines.length : 0; } module.exports = function (opts) { if (!opts) opts = {}; var parser = opts.raw ? through.obj() : JSONStream.parse([ true ]); var stream = through.obj( function (buf, enc, next) { parser.write(buf); next() }, function () { parser.end() } ); parser.pipe(through.obj(write, end)); stream.standaloneModule = opts.standaloneModule; stream.hasExports = opts.hasExports; var first = true; var entries = []; var basedir = defined(opts.basedir, process.cwd()); var prelude = opts.prelude || defaultPrelude; var preludePath = opts.preludePath || path.relative(basedir, defaultPreludePath).replace(/\\/g, '/'); var lineno = 1 + newlinesIn(prelude); var sourcemap; return stream; function write (row, enc, next) { if (first && opts.standalone) { var pre = umd.prelude(opts.standalone).trim(); stream.push(Buffer.from(pre + 'return ', 'utf8')); } else if (first && stream.hasExports) { var pre = opts.externalRequireName || 'require'; stream.push(Buffer.from(pre + '=', 'utf8')); } if (first) stream.push(Buffer.from(prelude + '({', 'utf8')); if (row.sourceFile && !row.nomap) { if (!sourcemap) { sourcemap = combineSourceMap.create(null, opts.sourceRoot); sourcemap.addFile( { sourceFile: preludePath, source: prelude }, { line: 0 } ); } sourcemap.addFile( { sourceFile: row.sourceFile, source: row.source }, { line: lineno } ); } var wrappedSource = [ (first ? '' : ','), JSON.stringify(row.id), ':[', 'function(require,module,exports){\n', combineSourceMap.removeComments(row.source), '\n},', '{' + Object.keys(row.deps || {}).sort().map(function (key) { return JSON.stringify(key) + ':' + JSON.stringify(row.deps[key]) ; }).join(',') + '}', ']' ].join(''); stream.push(Buffer.from(wrappedSource, 'utf8')); lineno += newlinesIn(wrappedSource); first = false; if (row.entry && row.order !== undefined) { entries[row.order] = row.id; } else if (row.entry) entries.push(row.id); next(); } function end () { if (first) stream.push(Buffer.from(prelude + '({', 'utf8')); entries = entries.filter(function (x) { return x !== undefined }); stream.push( Buffer.from('},{},' + JSON.stringify(entries) + ')', 'utf8') ); if (opts.standalone && !first) { stream.push(Buffer.from( '(' + JSON.stringify(stream.standaloneModule) + ')' + umd.postlude(opts.standalone), 'utf8' )); } if (sourcemap) { var comment = sourcemap.comment(); if (opts.sourceMapPrefix) { comment = comment.replace( /^\/\/#/, function () { return opts.sourceMapPrefix } ) } stream.push(Buffer.from('\n' + comment + '\n', 'utf8')); } if (!sourcemap && !opts.standalone) { stream.push(Buffer.from(';\n', 'utf8')); } stream.push(null); } };