├── .npmrc ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── appveyor.yml ├── bench ├── .gitattributes ├── .npmignore ├── index.js └── jquery-3.3.1.js ├── bin └── cmd.js ├── example ├── files │ ├── foo │ │ └── index.js │ └── main.js └── insert.js ├── index.js ├── package.json ├── readme.markdown └── test ├── always.js ├── always ├── collision.js ├── custom_globals_without_defaults.js ├── hidden_from_quick_test.js └── main.js ├── global.js ├── global ├── filename.js └── main.js ├── immediate.js ├── immediate └── main.js ├── insert.js ├── insert ├── buffer.js ├── foo │ ├── buf.js │ └── index.js └── main.js ├── isbuffer.js ├── isbuffer ├── both.js ├── main.js └── new.js ├── return.js ├── return ├── foo │ └── index.js └── main.js ├── roots.js ├── roots └── main.js ├── sourcemap.js ├── sourcemap ├── main.js └── main_es6.js ├── subdir.js ├── subdir └── main.js ├── unprefix.js └── unprefix ├── hello.js └── main.js /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.10" 4 | - "0.12" 5 | - node 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # insert-module-globals Change Log 2 | All notable changes to this project will be documented in this file. 3 | This project adheres to [Semantic Versioning](http://semver.org/). 4 | 5 | ## 7.2.1 6 | * Fix incorrect output when source contains a top-level `const` declaration with the same name as an inserted global. ([d86999f](https://github.com/browserify/insert-module-globals/commit/d86999f0180e09dd272666f5aff8db04183b3ea2)) 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This software is released under the MIT license: 2 | 3 | Copyright (c) 2013 James Halliday 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: "{build}" 2 | 3 | environment: 4 | matrix: 5 | - nodejs_version: "" # lastest 6 | - nodejs_version: "0.12" 7 | - nodejs_version: "0.10" 8 | 9 | install: 10 | - ps: Install-Product node $env:nodejs_version 11 | - npm install 12 | 13 | build: off 14 | 15 | test_script: 16 | - node --version 17 | - npm --version 18 | - npm test 19 | -------------------------------------------------------------------------------- /bench/.gitattributes: -------------------------------------------------------------------------------- 1 | jquery-3.3.1.js -diff 2 | -------------------------------------------------------------------------------- /bench/.npmignore: -------------------------------------------------------------------------------- 1 | jquery-3.3.1.js 2 | -------------------------------------------------------------------------------- /bench/index.js: -------------------------------------------------------------------------------- 1 | var bench = require('nanobench'); 2 | var path = require('path'); 3 | var fs = require('fs'); 4 | var insert = require('../'); 5 | 6 | bench('jquery', function (b) { 7 | var source = fs.readFileSync(path.join(__dirname, 'jquery-3.3.1.js')); 8 | b.start(); 9 | var stream = insert(); 10 | stream.on('data', function() {}); 11 | stream.on('end', function () { 12 | b.end(); 13 | }); 14 | stream.end(source); 15 | }); 16 | -------------------------------------------------------------------------------- /bin/cmd.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var insert = require('../'); 4 | var through = require('through2'); 5 | var concat = require('concat-stream'); 6 | var JSONStream = require('JSONStream'); 7 | 8 | var basedir = process.argv[2] || process.cwd(); 9 | 10 | process.stdin 11 | .pipe(JSONStream.parse([ true ])) 12 | .pipe(through.obj(write)) 13 | .pipe(JSONStream.stringify()) 14 | .pipe(process.stdout) 15 | ; 16 | 17 | function write (row, enc, next) { 18 | var self = this; 19 | var s = insert(row.id, { basedir: basedir }); 20 | s.pipe(concat(function (src) { 21 | row.source = src.toString('utf8'); 22 | self.push(row); 23 | next(); 24 | })); 25 | s.end(row.source); 26 | } 27 | -------------------------------------------------------------------------------- /example/files/foo/index.js: -------------------------------------------------------------------------------- 1 | process.nextTick(function () { 2 | console.log('in foo/index.js: ' + JSON.stringify({ 3 | __filename: __filename, 4 | __dirname: __dirname 5 | })); 6 | }); 7 | -------------------------------------------------------------------------------- /example/files/main.js: -------------------------------------------------------------------------------- 1 | console.log('in main.js: ' + JSON.stringify({ 2 | __filename: __filename, 3 | __dirname: __dirname 4 | })); 5 | 6 | require('./foo'); 7 | -------------------------------------------------------------------------------- /example/insert.js: -------------------------------------------------------------------------------- 1 | var mdeps = require('module-deps'); 2 | var bpack = require('browser-pack'); 3 | var insert = require('../'); 4 | function inserter (file) { 5 | return insert(file, { basedir: __dirname + '/files' }); 6 | } 7 | 8 | var files = [ __dirname + '/files/main.js' ]; 9 | mdeps(files, { transform: inserter }) 10 | .pipe(bpack({ raw: true })) 11 | .pipe(process.stdout) 12 | ; 13 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var undeclaredIdentifiers = require('undeclared-identifiers'); 2 | var through = require('through2'); 3 | var merge = require('xtend'); 4 | var parse = require('acorn-node').parse; 5 | 6 | var path = require('path'); 7 | var isAbsolute = path.isAbsolute || require('path-is-absolute'); 8 | var processPath = require.resolve('process/browser.js'); 9 | var isbufferPath = require.resolve('is-buffer') 10 | var combineSourceMap = require('combine-source-map'); 11 | 12 | function getRelativeRequirePath(fullPath, fromPath) { 13 | var relpath = path.relative(path.dirname(fromPath), fullPath); 14 | // If fullPath is in the same directory or a subdirectory of fromPath, 15 | // relpath will result in something like "index.js", "src/abc.js". 16 | // require() needs "./" prepended to these paths. 17 | if (!/^\./.test(relpath) && !isAbsolute(relpath)) { 18 | relpath = "./" + relpath; 19 | } 20 | // On Windows: Convert path separators to what require() expects 21 | if (path.sep === '\\') { 22 | relpath = relpath.replace(/\\/g, '/'); 23 | } 24 | return relpath; 25 | } 26 | 27 | var defaultVars = { 28 | process: function (file) { 29 | var relpath = getRelativeRequirePath(processPath, file); 30 | return 'require(' + JSON.stringify(relpath) + ')'; 31 | }, 32 | global: function () { 33 | return 'typeof global !== "undefined" ? global : ' 34 | + 'typeof self !== "undefined" ? self : ' 35 | + 'typeof window !== "undefined" ? window : {}' 36 | ; 37 | }, 38 | 'Buffer.isBuffer': function (file) { 39 | var relpath = getRelativeRequirePath(isbufferPath, file); 40 | return 'require(' + JSON.stringify(relpath) + ')'; 41 | }, 42 | Buffer: function () { 43 | return 'require("buffer").Buffer'; 44 | }, 45 | setImmediate: function () { 46 | return 'require("timers").setImmediate'; 47 | }, 48 | clearImmediate: function () { 49 | return 'require("timers").clearImmediate'; 50 | }, 51 | __filename: function (file, basedir) { 52 | var relpath = path.relative(basedir, file); 53 | // standardize path separators, use slash in Windows too 54 | if ( path.sep === '\\' ) { 55 | relpath = relpath.replace(/\\/g, '/'); 56 | } 57 | var filename = '/' + relpath; 58 | return JSON.stringify(filename); 59 | }, 60 | __dirname: function (file, basedir) { 61 | var relpath = path.relative(basedir, file); 62 | // standardize path separators, use slash in Windows too 63 | if ( path.sep === '\\' ) { 64 | relpath = relpath.replace(/\\/g, '/'); 65 | } 66 | var dir = path.dirname('/' + relpath ); 67 | return JSON.stringify(dir); 68 | } 69 | }; 70 | 71 | module.exports = function (file, opts) { 72 | if (/\.json$/i.test(file)) return through(); 73 | if (!opts) opts = {}; 74 | 75 | var basedir = opts.basedir || '/'; 76 | var vars = merge(defaultVars, opts.vars); 77 | var varNames = Object.keys(vars).filter(function(name) { 78 | return typeof vars[name] === 'function'; 79 | }); 80 | 81 | var quick = RegExp(varNames.map(function (name) { 82 | return '\\b' + name + '\\b'; 83 | }).join('|')); 84 | 85 | var chunks = []; 86 | 87 | return through(write, end); 88 | 89 | function write (chunk, enc, next) { chunks.push(chunk); next() } 90 | 91 | function end () { 92 | var self = this; 93 | var source = Buffer.isBuffer(chunks[0]) 94 | ? Buffer.concat(chunks).toString('utf8') 95 | : chunks.join('') 96 | ; 97 | source = source 98 | .replace(/^\ufeff/, '') 99 | .replace(/^#![^\n]*\n/, '\n'); 100 | 101 | if (opts.always !== true && !quick.test(source)) { 102 | this.push(source); 103 | this.push(null); 104 | return; 105 | } 106 | 107 | try { 108 | var undeclared = opts.always 109 | ? { identifiers: varNames, properties: [] } 110 | : undeclaredIdentifiers(parse(source), { wildcard: true }) 111 | ; 112 | } 113 | catch (err) { 114 | var e = new SyntaxError( 115 | (err.message || err) + ' while parsing ' + file 116 | ); 117 | e.type = 'syntax'; 118 | e.filename = file; 119 | return this.emit('error', e); 120 | } 121 | 122 | var globals = {}; 123 | 124 | varNames.forEach(function (name) { 125 | if (!/\./.test(name)) return; 126 | var parts = name.split('.') 127 | var prop = undeclared.properties.indexOf(name) 128 | if (prop === -1 || countprops(undeclared.properties, parts[0]) > 1) return; 129 | var value = vars[name](file, basedir); 130 | if (!value) return; 131 | globals[parts[0]] = '{' 132 | + JSON.stringify(parts[1]) + ':' + value + '}'; 133 | self.emit('global', name); 134 | }); 135 | varNames.forEach(function (name) { 136 | if (/\./.test(name)) return; 137 | if (globals[name]) return; 138 | if (undeclared.identifiers.indexOf(name) < 0) return; 139 | var value = vars[name](file, basedir); 140 | if (!value) return; 141 | globals[name] = value; 142 | self.emit('global', name); 143 | }); 144 | 145 | this.push(closeOver(globals, source, file, opts)); 146 | this.push(null); 147 | } 148 | }; 149 | 150 | module.exports.vars = defaultVars; 151 | 152 | function closeOver (globals, src, file, opts) { 153 | var keys = Object.keys(globals); 154 | if (keys.length === 0) return src; 155 | var values = keys.map(function (key) { return globals[key] }); 156 | 157 | // we double-wrap the source in IIFEs to prevent code like 158 | // (function(Buffer){ const Buffer = null }()) 159 | // which causes a parse error. 160 | var wrappedSource = '(function (){\n' + src + '\n}).call(this)'; 161 | if (keys.length <= 3) { 162 | wrappedSource = '(function (' + keys.join(',') + '){' 163 | + wrappedSource + '}).call(this,' + values.join(',') + ')' 164 | ; 165 | } 166 | else { 167 | // necessary to make arguments[3..6] still work for workerify etc 168 | // a,b,c,arguments[3..6],d,e,f... 169 | var extra = [ '__argument0', '__argument1', '__argument2', '__argument3' ]; 170 | var names = keys.slice(0,3).concat(extra).concat(keys.slice(3)); 171 | values.splice(3, 0, 172 | 'arguments[3]','arguments[4]', 173 | 'arguments[5]','arguments[6]' 174 | ); 175 | wrappedSource = '(function (' + names.join(',') + '){' 176 | + wrappedSource + '}).call(this,' + values.join(',') + ')'; 177 | } 178 | 179 | // Generate source maps if wanted. Including the right offset for 180 | // the wrapped source. 181 | if (!opts.debug) { 182 | return wrappedSource; 183 | } 184 | var sourceFile = path.relative(opts.basedir, file) 185 | .replace(/\\/g, '/'); 186 | var sourceMap = combineSourceMap.create().addFile( 187 | { sourceFile: sourceFile, source: src}, 188 | { line: 1 }); 189 | return combineSourceMap.removeComments(wrappedSource) + "\n" 190 | + sourceMap.comment(); 191 | } 192 | 193 | function countprops (props, name) { 194 | return props.filter(function (prop) { 195 | return prop.slice(0, name.length + 1) === name + '.'; 196 | }).length; 197 | } 198 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "insert-module-globals", 3 | "version": "7.2.1", 4 | "description": "insert implicit module globals into a module-deps stream", 5 | "main": "index.js", 6 | "bin": { 7 | "insert-module-globals": "bin/cmd.js" 8 | }, 9 | "dependencies": { 10 | "JSONStream": "^1.0.3", 11 | "acorn-node": "^1.5.2", 12 | "combine-source-map": "^0.8.0", 13 | "concat-stream": "^1.6.1", 14 | "is-buffer": "^1.1.0", 15 | "path-is-absolute": "^1.0.1", 16 | "process": "~0.11.0", 17 | "through2": "^2.0.0", 18 | "undeclared-identifiers": "^1.1.2", 19 | "xtend": "^4.0.0" 20 | }, 21 | "devDependencies": { 22 | "browser-pack": "^6.0.0", 23 | "buffer": "^4.9.1", 24 | "convert-source-map": "~1.1.0", 25 | "module-deps": "^4.0.2", 26 | "nanobench": "^2.1.1", 27 | "tape": "^4.2.0", 28 | "timers-browserify": "^1.4.2" 29 | }, 30 | "scripts": { 31 | "test": "tape test/*.js" 32 | }, 33 | "repository": { 34 | "type": "git", 35 | "url": "git://github.com/browserify/insert-module-globals.git" 36 | }, 37 | "homepage": "https://github.com/browserify/insert-module-globals", 38 | "keywords": [ 39 | "__filename", 40 | "__dirname", 41 | "global", 42 | "process", 43 | "module-deps", 44 | "browser-pack", 45 | "browserify" 46 | ], 47 | "author": { 48 | "name": "James Halliday", 49 | "email": "mail@substack.net", 50 | "url": "http://substack.net" 51 | }, 52 | "license": "MIT" 53 | } 54 | -------------------------------------------------------------------------------- /readme.markdown: -------------------------------------------------------------------------------- 1 | # insert-module-globals 2 | 3 | insert implicit module globals 4 | (`__filename`, `__dirname`, `process`, `global`, `setImmediate`, `clearImmediate` and `Buffer`) 5 | as a browserify-style transform 6 | 7 | [![build status](https://secure.travis-ci.org/browserify/insert-module-globals.png)](http://travis-ci.org/browserify/insert-module-globals) 8 | 9 | # example 10 | 11 | ``` js 12 | var mdeps = require('module-deps'); 13 | var bpack = require('browser-pack'); 14 | var insert = require('insert-module-globals'); 15 | function inserter (file) { 16 | return insert(file, { basedir: __dirname + '/files' }); 17 | } 18 | 19 | var files = [ __dirname + '/files/main.js' ]; 20 | mdeps(files, { transform: inserter }) 21 | .pipe(bpack({ raw: true })) 22 | .pipe(process.stdout) 23 | ; 24 | ``` 25 | 26 | ``` 27 | $ node example/insert.js | node 28 | in main.js: {"__filename":"/main.js","__dirname":"/"} 29 | in foo/index.js: {"__filename":"/foo/index.js","__dirname":"/foo"} 30 | ``` 31 | 32 | or use the command-line scripts: 33 | 34 | ``` 35 | $ module-deps main.js | insert-module-globals | browser-pack | node 36 | in main.js: {"__filename":"/main.js","__dirname":"/"} 37 | in foo/index.js: {"__filename":"/foo/index.js","__dirname":"/foo"} 38 | ``` 39 | 40 | or use insert-module-globals as a transform: 41 | 42 | ``` 43 | $ module-deps main.js --transform insert-module-globals | browser-pack | node 44 | in main.js: {"__filename":"/main.js","__dirname":"/"} 45 | in foo/index.js: {"__filename":"/foo/index.js","__dirname":"/foo"} 46 | ``` 47 | 48 | # methods 49 | 50 | ``` js 51 | var insertGlobals = require('insert-module-globals') 52 | ``` 53 | 54 | ## var inserter = insertGlobals(file, opts) 55 | 56 | Return a transform stream `inserter` for the filename `file` that will accept a 57 | javascript file as input and will output the file with a closure around the 58 | contents as necessary to define extra builtins. 59 | 60 | When `opts.always` is true, wrap every file with all the global variables 61 | without parsing. This is handy because parsing the scope can take a long time, 62 | so you can prioritize fast builds over saving bytes in the final output. When 63 | `opts.always` is truthy but not true, avoid parsing but perform a quick test to 64 | determine if wrapping should be skipped. 65 | 66 | Use `opts.vars` to override the default inserted variables, or set 67 | `opts.vars[name]` to `undefined` to not insert a variable which would otherwise 68 | be inserted. 69 | 70 | `opts.vars` properties with a `.` in their name will be executed instead of the 71 | parent object if ONLY that property is used. For example, `"Buffer.isBuffer"` 72 | will mask `"Buffer"` only when there is a `Buffer.isBuffer()` call in a file and 73 | no other references to `Buffer`. 74 | 75 | If `opts.debug` is true, an inline source map will be generated to compensate 76 | for the extra lines. 77 | 78 | # events 79 | 80 | ## inserter.on('global', function (name) {}) 81 | 82 | When a global is detected, the inserter stream emits a `'global'` event. 83 | 84 | # usage 85 | 86 | ``` 87 | usage: insert-module-globals {basedir} 88 | ``` 89 | 90 | # install 91 | 92 | With [npm](https://npmjs.org), to get the library do: 93 | 94 | ``` 95 | npm install insert-module-globals 96 | ``` 97 | 98 | and to get the bin script do: 99 | 100 | ``` 101 | npm install -g insert-module-globals 102 | ``` 103 | 104 | # insert custom globals. 105 | 106 | `insert-module-globals` can also insert arbitary globals into files. 107 | Pass in an object of functions as the `vars` option. 108 | 109 | ``` js 110 | var vars = { 111 | process: function (file, basedir) { 112 | return { 113 | id: "path/to/custom_process.js", 114 | source: customProcessContent 115 | } 116 | }, 117 | Buffer: function (file, basedir) { 118 | return { 119 | id: 'path/to/custom_buffer.js', 120 | source: customProcessContent, 121 | //suffix is optional 122 | //it's used to extract the value from the module. 123 | //it becomes: require(...).Buffer in this case. 124 | suffix: '.Buffer' 125 | } 126 | }, 127 | Math: function () { 128 | //if you return a string, 129 | //it's simply set as the value. 130 | return '{}' 131 | //^ any attempt to use Math[x] will throw! 132 | } 133 | } 134 | 135 | function inserter (file) { 136 | return insert(file, { vars: vars }); 137 | } 138 | mdeps(files, { transform: inserter }) 139 | .pipe(bpack({ raw: true })) 140 | .pipe(process.stdout) 141 | ``` 142 | 143 | 144 | # license 145 | 146 | MIT 147 | -------------------------------------------------------------------------------- /test/always.js: -------------------------------------------------------------------------------- 1 | var test = require('tape') 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var vm = require('vm'); 7 | 8 | test('always true insert', function (t) { 9 | t.plan(10); 10 | var s = mdeps({ 11 | modules: { 12 | buffer: require.resolve('buffer/'), 13 | timers: require.resolve('timers-browserify') 14 | } 15 | }); 16 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 17 | var c = { 18 | t: t, 19 | process: 'sandbox process', 20 | Buffer: 'sandbox Buffer', 21 | __filename: 'sandbox __filename', 22 | __dirname: 'sandbox __dirname', 23 | custom: 'sandbox custom', 24 | self: { xyz: 555 } 25 | }; 26 | vm.runInNewContext(src, c); 27 | })); 28 | s.write({ transform: inserter({ always: true }), global: true }); 29 | s.end(__dirname + '/always/main.js'); 30 | }); 31 | 32 | test('always true insert custom globals without defaults', function (t) { 33 | t.plan(7); 34 | var s = mdeps({ 35 | modules: { 36 | buffer: require.resolve('buffer/'), 37 | timers: require.resolve('timers-browserify') 38 | } 39 | }); 40 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 41 | var c = { 42 | t: t, 43 | process: 'sandbox process', 44 | Buffer: 'sandbox Buffer', 45 | __filename: 'sandbox __filename', 46 | __dirname: 'sandbox __dirname', 47 | custom: 'sandbox custom', 48 | self: { xyz: 555 } 49 | }; 50 | vm.runInNewContext(src, c); 51 | })); 52 | s.write({ 53 | transform: inserter({ always: true, vars: { 54 | global: {}, 55 | process: undefined, 56 | Buffer: undefined, 57 | __filename: undefined, 58 | __dirname: undefined, 59 | custom: function() { return '"inserted custom"' } 60 | }}), 61 | global: true 62 | }); 63 | s.end(__dirname + '/always/custom_globals_without_defaults.js'); 64 | }); 65 | 66 | test('always truthy-but-not-true insert hidden from quick test is not really inserted; true is', function (t) { 67 | t.plan(2); 68 | var testit = function(always, expected) { 69 | var s = mdeps({ 70 | modules: { 71 | buffer: require.resolve('buffer/'), 72 | timers: require.resolve('timers-browserify') 73 | } 74 | }); 75 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 76 | var c = { 77 | t: t, 78 | process: 'sandbox process', 79 | Buffer: 'sandbox Buffer', 80 | __filename: 'sandbox __filename', 81 | __dirname: 'sandbox __dirname', 82 | custom: 'sandbox custom', 83 | expected: expected, 84 | self: { xyz: 555 } 85 | }; 86 | vm.runInNewContext(src, c); 87 | })); 88 | s.write({ 89 | transform: inserter({ always: always, vars: { 90 | custom: function() { return '"inserted custom"' } 91 | }}), 92 | global: true 93 | }) 94 | s.end(__dirname + '/always/hidden_from_quick_test.js'); 95 | }; 96 | 97 | var always = 'truthy', expected = 'sandbox custom'; 98 | testit(always, expected); 99 | 100 | always = true; expected = 'inserted custom'; 101 | testit(always, expected); 102 | }); 103 | 104 | test('inserted names do not cause const name collisions', function (t) { 105 | t.plan(1); 106 | var s = mdeps({ 107 | modules: { 108 | buffer: require.resolve('buffer/'), 109 | timers: require.resolve('timers-browserify') 110 | } 111 | }); 112 | s.on('error', t.fail); 113 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 114 | var c = { 115 | t: t, 116 | Buffer: 'sandbox Buffer' 117 | }; 118 | vm.runInNewContext(src, c); 119 | })); 120 | s.write({ 121 | transform: inserter({ 122 | always: true, 123 | vars: { 124 | Buffer: function() { return '"sandbox Buffer"' } 125 | } 126 | }), 127 | global: true 128 | }); 129 | s.end(__dirname + '/always/collision.js'); 130 | }); 131 | 132 | function inserter (opts) { 133 | return function (file) { 134 | return insert(file, opts); 135 | }; 136 | } 137 | -------------------------------------------------------------------------------- /test/always/collision.js: -------------------------------------------------------------------------------- 1 | const Buffer = null; 2 | t.equal(Buffer, null); 3 | -------------------------------------------------------------------------------- /test/always/custom_globals_without_defaults.js: -------------------------------------------------------------------------------- 1 | t.equal(eval('process'), 'sandbox process'); 2 | t.equal(eval('typeof global'), 'undefined'); 3 | t.equal(eval('self.xyz'), 555); 4 | t.equal(eval('Buffer'), 'sandbox Buffer'); 5 | t.equal(eval('__filename'), 'sandbox __filename'); 6 | t.equal(eval('__dirname'), 'sandbox __dirname'); 7 | t.equal(eval('custom'), 'inserted custom'); 8 | -------------------------------------------------------------------------------- /test/always/hidden_from_quick_test.js: -------------------------------------------------------------------------------- 1 | t.equal(eval('cust' + 'om'), eval('expected')); 2 | -------------------------------------------------------------------------------- /test/always/main.js: -------------------------------------------------------------------------------- 1 | t.equal(eval('typeof process'), 'object'); 2 | t.equal(eval('typeof process.nextTick'), 'function'); 3 | t.equal(eval('typeof global'), 'object'); 4 | t.equal(eval('global.xyz'), 555); 5 | t.equal(eval('typeof Buffer'), 'function'); 6 | t.equal(eval('typeof __filename'), 'string'); 7 | t.notEqual(eval('__filename'), 'sandbox __filename'); 8 | t.equal(eval('typeof __dirname'), 'string'); 9 | t.notEqual(eval('__dirname'), 'sandbox __dirname'); 10 | t.equal(eval('custom'), 'sandbox custom'); 11 | -------------------------------------------------------------------------------- /test/global.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var vm = require('vm'); 3 | var concat = require('concat-stream'); 4 | 5 | var path = require('path'); 6 | var insert = require('../'); 7 | var bpack = require('browser-pack'); 8 | var mdeps = require('module-deps'); 9 | 10 | test('insert globals', function (t) { 11 | var expected = [ 'global' ]; 12 | t.plan(2 + expected.length); 13 | 14 | var deps = mdeps() 15 | var pack = bpack({ raw: true }); 16 | 17 | deps.pipe(pack); 18 | 19 | pack.pipe(concat(function (src) { 20 | var c = { 21 | t : t, 22 | a : 555, 23 | }; 24 | c.self = c; 25 | vm.runInNewContext(src, c); 26 | })); 27 | 28 | deps.write({ 29 | transform: function (file) { 30 | var tr = inserter(file) 31 | tr.on('global', function (name) { 32 | t.equal(name, expected.shift()); 33 | }); 34 | return tr; 35 | }, 36 | global: true 37 | }); 38 | deps.end(__dirname + '/global/main.js'); 39 | }); 40 | 41 | test('__filename and __dirname', function (t) { 42 | t.plan(2); 43 | 44 | var file = path.join(__dirname, 'global', 'filename.js'); 45 | var deps = mdeps() 46 | var pack = bpack({ raw: true }); 47 | 48 | deps.pipe(pack); 49 | 50 | pack.pipe(concat(function (src) { 51 | var c = {}; 52 | vm.runInNewContext('require=' + src, c); 53 | var x = c.require(file); 54 | t.equal(x.filename, '/filename.js'); 55 | t.equal(x.dirname, '/'); 56 | })); 57 | 58 | deps.write({ transform: inserter, global: true }); 59 | deps.end(file); 60 | }); 61 | 62 | function inserter (file) { 63 | return insert(file, { basedir: __dirname + '/global' }); 64 | } 65 | -------------------------------------------------------------------------------- /test/global/filename.js: -------------------------------------------------------------------------------- 1 | exports.filename = __filename; 2 | exports.dirname = __dirname; 3 | -------------------------------------------------------------------------------- /test/global/main.js: -------------------------------------------------------------------------------- 1 | t.equal(a, 555); 2 | t.equal(a, global.a); 3 | -------------------------------------------------------------------------------- /test/immediate.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var vm = require('vm'); 7 | 8 | test('immediate', function (t) { 9 | t.plan(3); 10 | var deps = mdeps({ 11 | modules: { timers: require.resolve('timers-browserify') } 12 | }); 13 | var pack = bpack({ raw: true, hasExports: true }); 14 | deps.pipe(pack).pipe(concat(function (src) { 15 | var c = { 16 | setTimeout: setTimeout, 17 | clearTimeout: clearTimeout, 18 | T: t 19 | }; 20 | t.ok(/require\("timers"\)/.test(src), 'timers required in source'); 21 | t.notOk(/require\("\//.test(src), 'absolute path not required in source'); 22 | vm.runInNewContext(src, c); 23 | })); 24 | deps.write({ transform: inserter, global: true }); 25 | deps.end({ id: 'main', file: __dirname + '/immediate/main.js' }); 26 | }); 27 | 28 | function inserter (file) { 29 | return insert(file, { basedir: __dirname + '/immediate' }); 30 | } 31 | -------------------------------------------------------------------------------- /test/immediate/main.js: -------------------------------------------------------------------------------- 1 | var immediate = setImmediate(function () { 2 | T.fail('should have been cleared') 3 | }) 4 | setImmediate(function () { 5 | T.pass('should call setImmediate') 6 | }) 7 | 8 | clearImmediate(immediate) 9 | -------------------------------------------------------------------------------- /test/insert.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var vm = require('vm'); 7 | 8 | test('process.nextTick inserts', function (t) { 9 | t.plan(4); 10 | var s = mdeps() 11 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 12 | var c = { 13 | t: t, 14 | setTimeout: setTimeout, 15 | clearTimeout: clearTimeout 16 | }; 17 | vm.runInNewContext(src, c); 18 | })); 19 | s.write({ transform: inserter, global: true }) 20 | s.end(__dirname + '/insert/main.js'); 21 | }); 22 | 23 | test('buffer inserts', function (t) { 24 | t.plan(2); 25 | var s = mdeps({ 26 | modules: { buffer: require.resolve('buffer/') } 27 | }); 28 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 29 | var c = { 30 | t: t, 31 | setTimeout: setTimeout, 32 | clearTimeout: clearTimeout, 33 | Uint8Array: Uint8Array, 34 | DataView: DataView 35 | }; 36 | vm.runInNewContext(src, c); 37 | })); 38 | s.write({ transform: inserter, global: true }) 39 | s.end(__dirname + '/insert/buffer.js'); 40 | }); 41 | 42 | function inserter (file) { 43 | return insert(file, { 44 | basedir: __dirname + '/insert' 45 | }); 46 | } 47 | -------------------------------------------------------------------------------- /test/insert/buffer.js: -------------------------------------------------------------------------------- 1 | require('./foo/buf'); 2 | -------------------------------------------------------------------------------- /test/insert/foo/buf.js: -------------------------------------------------------------------------------- 1 | process.nextTick(function () { 2 | t.equal(Buffer('abc').toString('base64'), 'YWJj'); 3 | t.equal(Buffer([98,99,100]).toString(), 'bcd'); 4 | }); 5 | -------------------------------------------------------------------------------- /test/insert/foo/index.js: -------------------------------------------------------------------------------- 1 | process.nextTick(function () { 2 | t.equal(__filename, '/foo/index.js'); 3 | t.equal(__dirname, '/foo'); 4 | }); 5 | -------------------------------------------------------------------------------- /test/insert/main.js: -------------------------------------------------------------------------------- 1 | t.equal(__filename, '/main.js'); 2 | t.equal(__dirname, '/'); 3 | 4 | require('./foo'); 5 | -------------------------------------------------------------------------------- /test/isbuffer.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var vm = require('vm'); 7 | // use is-buffer instead of builtin Buffer.isBuffer. The builtin 8 | // does `instanceof` which does not work on the browserified version 9 | var isBuffer = require('is-buffer'); 10 | 11 | test('isbuffer', function (t) { 12 | t.plan(5); 13 | var deps = mdeps() 14 | var pack = bpack({ raw: true, hasExports: true }); 15 | deps.pipe(pack).pipe(concat(function (src) { 16 | var c = { global: {} }; 17 | vm.runInNewContext(src, c); 18 | t.equal(c.require('main')(Buffer('wow')), true, 'is a buffer'); 19 | t.equal(c.require('main')('wow'), false, 'not a buffer (string)'); 20 | t.equal(c.require('main')({}), false, 'not a buffer (object)'); 21 | t.notOk(/require\("buffer"\)/.test(src), 'buffer not required in source') 22 | t.notOk(/require\("\//.test(src), 'absolute path not required in source') 23 | })); 24 | deps.write({ transform: inserter, global: true }); 25 | deps.end({ id: 'main', file: __dirname + '/isbuffer/main.js' }); 26 | }); 27 | 28 | test('isbuffer (and Buffer.from)', function (t) { 29 | t.plan(5); 30 | var deps = mdeps() 31 | var pack = bpack({ raw: true, hasExports: true }); 32 | deps.pipe(pack).pipe(concat(function (src) { 33 | var c = { global: {} }; 34 | vm.runInNewContext(src, c); 35 | t.equal(c.require('main')(c.require('main').a()), true, 'is a buffer'); 36 | t.equal(c.require('main')('wow'), false, 'is not a buffer'); 37 | t.equal(isBuffer(c.require('main').a()), true, 'is a buffer'); 38 | t.ok(/require\("buffer"\)/.test(src), 'buffer required in source') 39 | t.equal(c.require('main').a().toString('hex'), 'abcd', 'is a buffer'); 40 | })); 41 | deps.write({ transform: inserter, global: true }); 42 | deps.end({ id: 'main', file: __dirname + '/isbuffer/both.js' }); 43 | }); 44 | 45 | test('isbuffer (and new Buffer)', function (t) { 46 | t.plan(5); 47 | var deps = mdeps() 48 | var pack = bpack({ raw: true, hasExports: true }); 49 | deps.pipe(pack).pipe(concat(function (src) { 50 | var c = { global: {} }; 51 | vm.runInNewContext(src, c); 52 | t.equal(c.require('main')(c.require('main').a()), true, 'is a buffer'); 53 | t.equal(c.require('main')('wow'), false, 'is not a buffer'); 54 | t.equal(isBuffer(c.require('main').a()), true, 'is a buffer'); 55 | t.ok(/require\("buffer"\)/.test(src), 'buffer required in source') 56 | t.equal(c.require('main').a().toString('utf8'), 'abcd', 'is a buffer'); 57 | })); 58 | deps.write({ transform: inserter, global: true }); 59 | deps.end({ id: 'main', file: __dirname + '/isbuffer/new.js' }); 60 | }); 61 | 62 | function inserter (file) { 63 | return insert(file, { basedir: __dirname + '/isbuffer' }); 64 | } 65 | -------------------------------------------------------------------------------- /test/isbuffer/both.js: -------------------------------------------------------------------------------- 1 | module.exports = function (buf) { 2 | return Buffer.isBuffer(buf); 3 | }; 4 | module.exports.a = function () { 5 | return Buffer.from('abcd', 'hex'); 6 | }; 7 | -------------------------------------------------------------------------------- /test/isbuffer/main.js: -------------------------------------------------------------------------------- 1 | module.exports = function (buf) { 2 | return Buffer.isBuffer(buf); 3 | }; 4 | -------------------------------------------------------------------------------- /test/isbuffer/new.js: -------------------------------------------------------------------------------- 1 | module.exports = function (buf) { 2 | return Buffer.isBuffer(buf); 3 | }; 4 | module.exports.a = function () { 5 | return new Buffer('abcd'); 6 | }; 7 | -------------------------------------------------------------------------------- /test/return.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var vm = require('vm'); 7 | 8 | test('early return', function (t) { 9 | t.plan(4); 10 | var s = mdeps() 11 | s.pipe(bpack({ raw: true })).pipe(concat(function (src) { 12 | var c = { 13 | t: t, 14 | setTimeout: setTimeout, 15 | clearTimeout: clearTimeout 16 | }; 17 | vm.runInNewContext(src, c); 18 | })); 19 | s.write({ transform: inserter, global: true }); 20 | s.end(__dirname + '/return/main.js'); 21 | }); 22 | 23 | function inserter (file) { 24 | return insert(file, { 25 | basedir: __dirname + '/return' 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /test/return/foo/index.js: -------------------------------------------------------------------------------- 1 | process.nextTick(function () { 2 | t.equal(__filename, '/foo/index.js'); 3 | t.equal(__dirname, '/foo'); 4 | }); 5 | -------------------------------------------------------------------------------- /test/return/main.js: -------------------------------------------------------------------------------- 1 | t.equal(__filename, '/main.js'); 2 | t.equal(__dirname, '/'); 3 | 4 | require('./foo'); 5 | 6 | return; 7 | -------------------------------------------------------------------------------- /test/roots.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var path = require('path'); 7 | var fs = require('fs'); 8 | var vm = require('vm'); 9 | 10 | test('windows partitions', { skip: process.platform !== 'win32' }, function (t) { 11 | t.plan(1); 12 | var deps = mdeps() 13 | var pack = bpack({ raw: true, hasExports: true }); 14 | deps.pipe(pack).pipe(concat(function (src) { 15 | var c = { 16 | console: { log: log } 17 | }; 18 | vm.runInNewContext(src, c); 19 | function log (value) { 20 | t.equal(typeof value, 'function'); 21 | } 22 | })); 23 | deps.write({ transform: inserter, global: true }); 24 | deps.end({ 25 | id: 'main', 26 | file: 'D:\\test.js', 27 | source: fs.readFileSync(__dirname + '/roots/main.js') 28 | }); 29 | }); 30 | 31 | function inserter (file) { 32 | return insert(file, { 33 | basedir: path.join(__dirname, '..') 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /test/roots/main.js: -------------------------------------------------------------------------------- 1 | console.log(Buffer.isBuffer) 2 | -------------------------------------------------------------------------------- /test/sourcemap.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var convert = require('convert-source-map'); 3 | var insert = require('../'); 4 | var mdeps = require('module-deps'); 5 | var vm = require('vm'); 6 | var path = require('path'); 7 | 8 | test('sourcemap', function (t) { 9 | t.plan(6); 10 | 11 | var file = __dirname + '/sourcemap/main.js'; 12 | var deps = mdeps() 13 | 14 | deps.on('data', function(row) { 15 | var src = row.source; 16 | 17 | var sm = convert.fromSource(src).toObject(); 18 | t.deepEqual(sm.sources, [ 'test/sourcemap/main_es6.js' ]); 19 | t.deepEqual(sm.sourcesContent, [ 'console.log(`${__dirname}`, `${__filename}`);\n' ]); 20 | t.deepEqual(sm.mappings, ';AAAA,OAAO,CAAC,GAAG,MAAI,SAAS,OAAO,UAAU,CAAG,CAAC'); 21 | 22 | t.equal(src.match(convert.commentRegex).length, 1); 23 | 24 | var c = { 25 | console: { 26 | log: function(dirname, filename) { 27 | t.equal(dirname, '/'); 28 | t.equal(filename, '/main.js'); 29 | } 30 | }, 31 | }; 32 | vm.runInNewContext(src, c); 33 | }); 34 | 35 | deps.write({ transform: inserter, global: true }); 36 | deps.end(file); 37 | }); 38 | 39 | function inserter (file) { 40 | return insert(file, { debug: true, basedir: __dirname + '/sourcemap' }); 41 | } 42 | -------------------------------------------------------------------------------- /test/sourcemap/main.js: -------------------------------------------------------------------------------- 1 | console.log("" + __dirname, "" + __filename); 2 | 3 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvc291cmNlbWFwL21haW5fZXM2LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sQ0FBQyxHQUFHLE1BQUksU0FBUyxPQUFPLFVBQVUsQ0FBRyxDQUFDIiwiZmlsZSI6InVuZGVmaW5lZCIsInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKGAke19fZGlybmFtZX1gLCBgJHtfX2ZpbGVuYW1lfWApO1xuIl19 4 | -------------------------------------------------------------------------------- /test/sourcemap/main_es6.js: -------------------------------------------------------------------------------- 1 | console.log(`${__dirname}`, `${__filename}`); 2 | -------------------------------------------------------------------------------- /test/subdir.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var mdeps = require('module-deps'); 3 | var bpack = require('browser-pack'); 4 | var insert = require('../'); 5 | var concat = require('concat-stream'); 6 | var path = require('path'); 7 | var fs = require('fs'); 8 | var vm = require('vm'); 9 | 10 | test('subdir', function (t) { 11 | t.plan(1); 12 | var deps = mdeps() 13 | var pack = bpack({ raw: true, hasExports: true }); 14 | deps.pipe(pack).pipe(concat(function (src) { 15 | var c = { 16 | console: { log: log } 17 | }; 18 | vm.runInNewContext(src, c); 19 | function log (value) { 20 | t.equal(value, false); 21 | } 22 | })); 23 | deps.write({ transform: inserter, global: true }); 24 | deps.end({ 25 | id: 'main', 26 | // Fake the file path so that the relative path to is-buffer becomes 27 | // "node_modules/is-buffer/index.js" 28 | file: path.join(__dirname, '../subdir_test.js'), 29 | source: fs.readFileSync(__dirname + '/subdir/main.js') 30 | }); 31 | }); 32 | 33 | function inserter (file) { 34 | return insert(file, { 35 | basedir: path.join(__dirname, '..') 36 | }); 37 | } 38 | -------------------------------------------------------------------------------- /test/subdir/main.js: -------------------------------------------------------------------------------- 1 | console.log(Buffer.isBuffer("test")) 2 | -------------------------------------------------------------------------------- /test/unprefix.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var vm = require('vm'); 3 | var concat = require('concat-stream'); 4 | 5 | var path = require('path'); 6 | var insert = require('../'); 7 | var bpack = require('browser-pack'); 8 | var mdeps = require('module-deps'); 9 | 10 | test('unprefix - remove shebang and bom', function (t) { 11 | t.plan(3); 12 | 13 | var file = path.join(__dirname, 'unprefix', 'main.js'); 14 | var deps = mdeps(); 15 | var pack = bpack({ raw: true }); 16 | 17 | deps.pipe(pack); 18 | 19 | pack.pipe(concat(function (src) { 20 | var c = {}; 21 | vm.runInNewContext('require=' + src, c); 22 | var x = c.require(file); 23 | t.equal(x.filename, '/hello.js'); 24 | t.equal(x.dirname, '/'); 25 | t.notOk(/\ufeff/.test(src.toString())); 26 | })); 27 | 28 | deps.write({ transform: inserter, global: true }); 29 | deps.end(file); 30 | }); 31 | 32 | function inserter (file) { 33 | return insert(file, { basedir: __dirname + '/unprefix' }); 34 | } 35 | -------------------------------------------------------------------------------- /test/unprefix/hello.js: -------------------------------------------------------------------------------- 1 | exports.filename = __filename; 2 | exports.dirname = __dirname; 3 | -------------------------------------------------------------------------------- /test/unprefix/main.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | module.exports = require('./hello'); 4 | --------------------------------------------------------------------------------