├── .github └── workflows │ ├── node-aught.yml │ └── node-tens.yml ├── .npmrc ├── LICENSE ├── bin ├── cmd.js └── usage.txt ├── example ├── foo.js └── main.js ├── index.js ├── package.json ├── readme.markdown └── test ├── assignment.js ├── empty-statements.js ├── files ├── assignment.js ├── bundle.js ├── empty-statements.js ├── empty.js ├── return.js ├── return │ └── main.js ├── standalone.js ├── uglified.js └── utf-8.js ├── multi-byte.js ├── return.js ├── standalone.js ├── uglified.js └── unpack.js /.github/workflows/node-aught.yml: -------------------------------------------------------------------------------- 1 | name: 'Tests: node.js < 10' 2 | 3 | on: [pull_request, push] 4 | 5 | permissions: 6 | contents: read 7 | 8 | jobs: 9 | tests: 10 | uses: ljharb/actions/.github/workflows/node.yml@main 11 | with: 12 | range: '< 10' 13 | type: minors 14 | command: npm run tests-only 15 | 16 | node: 17 | name: 'node < 10' 18 | needs: [tests] 19 | runs-on: ubuntu-latest 20 | steps: 21 | - run: 'echo tests completed' 22 | -------------------------------------------------------------------------------- /.github/workflows/node-tens.yml: -------------------------------------------------------------------------------- 1 | name: 'Tests: node.js >= 10' 2 | 3 | on: [pull_request, push] 4 | 5 | permissions: 6 | contents: read 7 | 8 | jobs: 9 | tests: 10 | uses: ljharb/actions/.github/workflows/node.yml@main 11 | with: 12 | range: '>= 10' 13 | type: minors 14 | command: npm run tests-only 15 | 16 | node: 17 | name: 'node >= 10' 18 | needs: [tests] 19 | runs-on: ubuntu-latest 20 | steps: 21 | - run: 'echo tests completed' 22 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) James Halliday and browserify contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/cmd.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var parse = require('../'); 4 | var concat = require('concat-stream'); 5 | var fs = require('fs'); 6 | 7 | var minimist = require('minimist'); 8 | var argv = minimist(process.argv.slice(2)); 9 | if (argv.help || argv.h) { 10 | return fs.createReadStream(__dirname + '/usage.txt') 11 | .pipe(process.stdout) 12 | ; 13 | } 14 | 15 | process.stdin.pipe(concat(function (body) { 16 | var rows = parse(body); 17 | if (!rows) { 18 | console.error("couldn't parse this bundle"); 19 | process.exit(1); 20 | } 21 | 22 | console.log('['); 23 | rows.forEach(function (row, index) { 24 | if (index > 0) console.log(','); 25 | console.log(JSON.stringify(row)); 26 | }); 27 | console.log(']'); 28 | })); 29 | -------------------------------------------------------------------------------- /bin/usage.txt: -------------------------------------------------------------------------------- 1 | usage: browser-unpack 2 | 3 | Write a browser bundle to STDIN. 4 | Outputs a JSON array in the module-deps format. 5 | 6 | -------------------------------------------------------------------------------- /example/foo.js: -------------------------------------------------------------------------------- 1 | module.exports = function (n) { return n * 111 } 2 | -------------------------------------------------------------------------------- /example/main.js: -------------------------------------------------------------------------------- 1 | var foo = require('./foo.js'); 2 | var gamma = require('gamma'); 3 | 4 | console.log(foo(gamma(2.3))); 5 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var parse = require('acorn-node').parse; 2 | 3 | module.exports = function (src) { 4 | // If src is a Buffer, esprima will just stringify it, so we beat them to 5 | // the punch. This avoids the problem where we're using esprima's range 6 | // indexes -- which are meant for a UTF-16 string -- in a buffer that 7 | // contains UTF-8 encoded text. 8 | if (typeof src !== 'string') { 9 | src = String(src); 10 | } 11 | 12 | var ast = parse(src, { range: true }); 13 | 14 | ast.body = ast.body.filter(function(node) { 15 | return node.type !== 'EmptyStatement'; 16 | }); 17 | 18 | if (ast.body.length !== 1) return; 19 | if (ast.body[0].type !== 'ExpressionStatement') return; 20 | if (ast.body[0].expression.type === 'UnaryExpression') { 21 | var body = ast.body[0].expression.argument; 22 | } else if (ast.body[0].expression.type === 'AssignmentExpression') { 23 | var body = ast.body[0].expression.right; 24 | } else { 25 | var body = ast.body[0].expression; 26 | } 27 | 28 | if (body.type !== 'CallExpression') return; 29 | 30 | var args = body.arguments; 31 | if (args.length === 1) args = extractStandalone(args) || args; 32 | if (args.length !== 3) return; 33 | 34 | if (args[0].type !== 'ObjectExpression') return; 35 | if (args[1].type !== 'ObjectExpression') return; 36 | if (args[2].type !== 'ArrayExpression') return; 37 | 38 | var files = args[0].properties; 39 | var cache = args[1]; 40 | var entries = args[2].elements.map(function (e) { 41 | return e.value 42 | }); 43 | 44 | return files.map(function (file) { 45 | var body = file.value.elements[0].body.body; 46 | var start, end; 47 | if (body.length === 0) { 48 | start = body.start || 0; 49 | end = body.end || 0; 50 | } 51 | else { 52 | start = body[0].start; 53 | end = body[body.length-1].end; 54 | } 55 | 56 | var depProps = file.value.elements[1].properties; 57 | var deps = depProps.reduce(function (acc, dep) { 58 | var key = dep.key.type === 'Literal' 59 | ? dep.key.value 60 | : dep.key.name; 61 | acc[key] = dep.value.value; 62 | return acc; 63 | }, {}); 64 | var row = { 65 | id: file.key.type === 'Literal' 66 | ? file.key.value 67 | : file.key.name, 68 | source: src.slice(start, end), 69 | deps: deps 70 | }; 71 | if (entries.indexOf(row.id) >= 0) row.entry = true; 72 | return row; 73 | }); 74 | }; 75 | 76 | function extractStandalone (args) { 77 | if (args[0].type !== 'FunctionExpression') return; 78 | if (args[0].body.length < 2) return; 79 | if (args[0].body.body.length < 2) return; 80 | 81 | args = args[0].body.body[1].argument; 82 | if (args.type !== 'CallExpression') return; 83 | if (args.callee.type !== 'CallExpression') return; 84 | 85 | return args.callee.arguments; 86 | }; 87 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "browser-unpack", 3 | "version": "1.4.3", 4 | "description": "parse a bundle generated by browser-pack", 5 | "main": "index.js", 6 | "bin": { 7 | "browser-unpack": "bin/cmd.js" 8 | }, 9 | "dependencies": { 10 | "acorn-node": "^1.5.2", 11 | "concat-stream": "^1.5.0", 12 | "minimist": "^1.1.1" 13 | }, 14 | "devDependencies": { 15 | "browser-pack": "^6.1.0", 16 | "tape": "^4.0.1" 17 | }, 18 | "scripts": { 19 | "tests-only": "tape test/*.js", 20 | "test": "npm run tests-only" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git://github.com/browserify/browser-unpack.git" 25 | }, 26 | "homepage": "https://github.com/browserify/browser-unpack", 27 | "keywords": [ 28 | "browserify", 29 | "bundle", 30 | "inverse", 31 | "invert", 32 | "unpack" 33 | ], 34 | "author": { 35 | "email": "mail@substack.net", 36 | "name": "James Halliday", 37 | "url": "http://substack.net" 38 | }, 39 | "license": "MIT" 40 | } 41 | -------------------------------------------------------------------------------- /readme.markdown: -------------------------------------------------------------------------------- 1 | # browser-unpack 2 | 3 | parse a bundle generated by 4 | [browser-pack](https://npmjs.org/package/browser-pack) 5 | 6 | # example 7 | 8 | ``` 9 | $ node main.js 10 | 129.50502147699586 11 | $ browserify main.js > bundle.js 12 | $ browser-unpack < bundle.js 13 | [ 14 | {"id":"/home/substack/projects/browser-unpack/example/foo.js","source":"module.exports = function (n) { return n * 111 }\n\n","deps":{}} 15 | , 16 | {"id":"/home/substack/projects/browser-unpack/example/main.js","source":"var foo = require('./foo.js');\nvar gamma = require('gamma');\n\nconsole.log(foo(gamma(2.3)));","deps":{"./foo.js":"/home/substack/projects/browser-unpack/example/foo.js","gamma":"/home/substack/projects/browser-unpack/node_modules/gamma/index.js"},"entry":true} 17 | , 18 | {"id":"/home/substack/projects/browser-unpack/node_modules/gamma/index.js","source":"var g = 7;\nvar p = [\n 0.99999999999980993,\n 676.5203681218851,\n -1259.1392167224028,\n 771.32342877765313,\n -176.61502916214059,\n 12.507343278686905,\n -0.13857109526572012,\n 9.9843695780195716e-6,\n 1.5056327351493116e-7\n];\n\nvar g_ln = 607/128;\nvar p_ln = [\n 0.99999999999999709182,\n 57.156235665862923517,\n -59.597960355475491248,\n 14.136097974741747174,\n -0.49191381609762019978,\n 0.33994649984811888699e-4,\n 0.46523628927048575665e-4,\n -0.98374475304879564677e-4,\n 0.15808870322491248884e-3,\n -0.21026444172410488319e-3,\n 0.21743961811521264320e-3,\n -0.16431810653676389022e-3,\n 0.84418223983852743293e-4,\n -0.26190838401581408670e-4,\n 0.36899182659531622704e-5\n];\n\n// Spouge approximation (suitable for large arguments)\nfunction lngamma(z) {\n\n if(z < 0) return Number('0/0');\n var x = p_ln[0];\n for(var i = p_ln.length - 1; i > 0; --i) x += p_ln[i] / (z + i);\n var t = z + g_ln + 0.5;\n return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z);\n}\n\nmodule.exports = function gamma (z) {\n if (z < 0.5) {\n return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z));\n }\n else if(z > 100) return Math.exp(lngamma(z));\n else {\n z -= 1;\n var x = p[0];\n for (var i = 1; i < g + 2; i++) {\n x += p[i] / (z + i);\n }\n var t = z + g + 0.5;\n\n return Math.sqrt(2 * Math.PI)\n * Math.pow(t, z + 0.5)\n * Math.exp(-t)\n * x\n ;\n }\n};\n\nmodule.exports.log = lngamma;","deps":{}} 19 | ] 20 | $ browser-unpack < bundle.js | browser-pack | node 21 | 129.50502147699586 22 | ``` 23 | 24 | # usage 25 | 26 | ``` 27 | usage: browser-unpack 28 | 29 | Write a browser bundle to STDIN. 30 | Outputs a JSON array in the module-deps format. 31 | 32 | ``` 33 | 34 | # methods 35 | 36 | ``` js 37 | var unpack = require('browser-unpack') 38 | ``` 39 | 40 | ## var rows = unpack(src) 41 | 42 | Return an array of `rows` from the bundle source string `src`. 43 | 44 | # install 45 | 46 | With [npm](https://npmjs.org) do: 47 | 48 | ``` 49 | npm install browser-unpack 50 | ``` 51 | 52 | # license 53 | 54 | MIT 55 | -------------------------------------------------------------------------------- /test/assignment.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var pack = require('browser-pack'); 4 | var concat = require('concat-stream'); 5 | var vm = require('vm'); 6 | 7 | var fs = require('fs'); 8 | var src = fs.readFileSync(__dirname + '/files/assignment.js', 'utf8'); 9 | 10 | test('expression', function (t) { 11 | t.plan(2); 12 | t.doesNotThrow(function() { 13 | var p = pack({ raw: true }); 14 | var rows = unpack(src); 15 | t.equal(rows.length, 3, 'should unpack 3 rows'); 16 | }, 'should not throw'); 17 | }); 18 | -------------------------------------------------------------------------------- /test/empty-statements.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var pack = require('browser-pack'); 4 | var concat = require('concat-stream'); 5 | var vm = require('vm'); 6 | 7 | var fs = require('fs'); 8 | var src = fs.readFileSync(__dirname + '/files/empty-statements.js', 'utf8'); 9 | 10 | test('uglified', function (t) { 11 | t.plan(2); 12 | t.doesNotThrow(function() { 13 | var p = pack({ raw: true }); 14 | var rows = unpack(src); 15 | t.equal(rows.length, 3, 'should unpack 3 rows'); 16 | }, 'should not throw'); 17 | }); 18 | -------------------------------------------------------------------------------- /test/files/assignment.js: -------------------------------------------------------------------------------- 1 | require = (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 43 | var t = z + g_ln + 0.5; 44 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 45 | } 46 | 47 | module.exports = function gamma (z) { 48 | if (z < 0.5) { 49 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 50 | } 51 | else if(z > 100) return Math.exp(lngamma(z)); 52 | else { 53 | z -= 1; 54 | var x = p[0]; 55 | for (var i = 1; i < g + 2; i++) { 56 | x += p[i] / (z + i); 57 | } 58 | var t = z + g + 0.5; 59 | 60 | return Math.sqrt(2 * Math.PI) 61 | * Math.pow(t, z + 0.5) 62 | * Math.exp(-t) 63 | * x 64 | ; 65 | } 66 | }; 67 | 68 | module.exports.log = lngamma; 69 | 70 | },{}],2:[function(require,module,exports){ 71 | module.exports = function (n) { return n * 111 } 72 | 73 | },{}],3:[function(require,module,exports){ 74 | var foo = require('./foo.js'); 75 | var gamma = require('gamma'); 76 | 77 | console.log(Math.floor(foo(gamma(3.8)))); 78 | 79 | },{"./foo.js":2,"gamma":1}]},{},[3]) 80 | -------------------------------------------------------------------------------- /test/files/bundle.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 43 | var t = z + g_ln + 0.5; 44 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 45 | } 46 | 47 | module.exports = function gamma (z) { 48 | if (z < 0.5) { 49 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 50 | } 51 | else if(z > 100) return Math.exp(lngamma(z)); 52 | else { 53 | z -= 1; 54 | var x = p[0]; 55 | for (var i = 1; i < g + 2; i++) { 56 | x += p[i] / (z + i); 57 | } 58 | var t = z + g + 0.5; 59 | 60 | return Math.sqrt(2 * Math.PI) 61 | * Math.pow(t, z + 0.5) 62 | * Math.exp(-t) 63 | * x 64 | ; 65 | } 66 | }; 67 | 68 | module.exports.log = lngamma; 69 | 70 | },{}],2:[function(require,module,exports){ 71 | module.exports = function (n) { return n * 111 } 72 | 73 | },{}],3:[function(require,module,exports){ 74 | var foo = require('./foo.js'); 75 | var gamma = require('gamma'); 76 | 77 | console.log(Math.floor(foo(gamma(3.8)))); 78 | 79 | },{"./foo.js":2,"gamma":1}]},{},[3]) -------------------------------------------------------------------------------- /test/files/empty-statements.js: -------------------------------------------------------------------------------- 1 | ;;(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 43 | var t = z + g_ln + 0.5; 44 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 45 | } 46 | 47 | module.exports = function gamma (z) { 48 | if (z < 0.5) { 49 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 50 | } 51 | else if(z > 100) return Math.exp(lngamma(z)); 52 | else { 53 | z -= 1; 54 | var x = p[0]; 55 | for (var i = 1; i < g + 2; i++) { 56 | x += p[i] / (z + i); 57 | } 58 | var t = z + g + 0.5; 59 | 60 | return Math.sqrt(2 * Math.PI) 61 | * Math.pow(t, z + 0.5) 62 | * Math.exp(-t) 63 | * x 64 | ; 65 | } 66 | }; 67 | 68 | module.exports.log = lngamma; 69 | 70 | },{}],2:[function(require,module,exports){ 71 | module.exports = function (n) { return n * 111 } 72 | 73 | },{}],3:[function(require,module,exports){ 74 | var foo = require('./foo.js'); 75 | var gamma = require('gamma'); 76 | 77 | console.log(Math.floor(foo(gamma(3.8)))); 78 | 79 | },{"./foo.js":2,"gamma":1}]},{},[3]) 80 | ;; 81 | -------------------------------------------------------------------------------- /test/files/empty.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 43 | var t = z + g_ln + 0.5; 44 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 45 | } 46 | 47 | module.exports = function gamma (z) { 48 | if (z < 0.5) { 49 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 50 | } 51 | else if(z > 100) return Math.exp(lngamma(z)); 52 | else { 53 | z -= 1; 54 | var x = p[0]; 55 | for (var i = 1; i < g + 2; i++) { 56 | x += p[i] / (z + i); 57 | } 58 | var t = z + g + 0.5; 59 | 60 | return Math.sqrt(2 * Math.PI) 61 | * Math.pow(t, z + 0.5) 62 | * Math.exp(-t) 63 | * x 64 | ; 65 | } 66 | }; 67 | 68 | module.exports.log = lngamma; 69 | 70 | },{}],2:[function(require,module,exports){ 71 | },{}],3:[function(require,module,exports){},{"./foo.js":2,"gamma":1}]},{},[3]) 72 | -------------------------------------------------------------------------------- /test/files/return.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 52 | var t = z + g_ln + 0.5; 53 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 54 | } 55 | 56 | module.exports = function gamma (z) { 57 | if (z < 0.5) { 58 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 59 | } 60 | else if(z > 100) return Math.exp(lngamma(z)); 61 | else { 62 | z -= 1; 63 | var x = p[0]; 64 | for (var i = 1; i < g + 2; i++) { 65 | x += p[i] / (z + i); 66 | } 67 | var t = z + g + 0.5; 68 | 69 | return Math.sqrt(2 * Math.PI) 70 | * Math.pow(t, z + 0.5) 71 | * Math.exp(-t) 72 | * x 73 | ; 74 | } 75 | }; 76 | 77 | module.exports.log = lngamma; 78 | 79 | },{}]},{},[2]) 80 | (2) 81 | }); 82 | -------------------------------------------------------------------------------- /test/files/uglified.js: -------------------------------------------------------------------------------- 1 | !function r(t,e,o){function n(u,f){if(!e[u]){if(!t[u]){var i="function"==typeof require&&require;if(!f&&i)return i(u,!0);if(a)return a(u,!0);throw new Error("Cannot find module '"+u+"'")}var h=e[u]={exports:{}};t[u][0].call(h.exports,function(r){var e=t[u][1][r];return n(e?e:r)},h,h.exports,r,t,e,o)}return e[u].exports}for(var a="function"==typeof require&&require,u=0;ur)return Number("0/0");for(var t=u[0],e=u.length-1;e>0;--e)t+=u[e]/(r+e);var o=r+a+.5;return.5*Math.log(2*Math.PI)+(r+.5)*Math.log(o)-o+Math.log(t)-Math.log(r)}var o=7,n=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,1.5056327351493116e-7],a=607/128,u=[.9999999999999971,57.15623566586292,-59.59796035547549,14.136097974741746,-.4919138160976202,3399464998481189e-20,4652362892704858e-20,-9837447530487956e-20,.0001580887032249125,-.00021026444172410488,.00021743961811521265,-.0001643181065367639,8441822398385275e-20,-26190838401581408e-21,36899182659531625e-22];t.exports=function f(r){if(.5>r)return Math.PI/(Math.sin(Math.PI*r)*f(1-r));if(r>100)return Math.exp(e(r));r-=1;for(var t=n[0],a=1;o+2>a;a++)t+=n[a]/(r+a);var u=r+o+.5;return Math.sqrt(2*Math.PI)*Math.pow(u,r+.5)*Math.exp(-u)*t},t.exports.log=e},{}],2:[function(r,t){t.exports=function(r){return 111*r}},{}],main:[function(r){var t=r("./foo.js"),e=r("gamma");console.log(Math.floor(t(e(3.8))))},{"./foo.js":2,gamma:1}]},{},["main"]); -------------------------------------------------------------------------------- /test/files/utf-8.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.StandAlone=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; --i) x += p_ln[i] / (z + i); 52 | var t = z + g_ln + 0.5; 53 | return .5*Math.log(2*Math.PI)+(z+.5)*Math.log(t)-t+Math.log(x)-Math.log(z); 54 | } 55 | 56 | module.exports = function gamma (z) { 57 | if (z < 0.5) { 58 | return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); 59 | } 60 | else if(z > 100) return Math.exp(lngamma(z)); 61 | else { 62 | z -= 1; 63 | var x = p[0]; 64 | for (var i = 1; i < g + 2; i++) { 65 | x += p[i] / (z + i); 66 | } 67 | var t = z + g + 0.5; 68 | 69 | return Math.sqrt(2 * Math.PI) 70 | * Math.pow(t, z + 0.5) 71 | * Math.exp(-t) 72 | * x 73 | ; 74 | } 75 | }; 76 | 77 | module.exports.log = lngamma; 78 | 79 | },{}]},{},[2]) 80 | (2) 81 | }); 82 | -------------------------------------------------------------------------------- /test/multi-byte.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var fs = require('fs'); 4 | 5 | var src = fs.readFileSync(__dirname + '/files/utf-8.js', 'utf8'); 6 | var buf = new Buffer(src); 7 | 8 | test('multi-byte characters', function (t) { 9 | t.plan(6); 10 | t.doesNotThrow(function() { 11 | var srcRows = unpack(src); 12 | var bufRows = unpack(buf); 13 | t.equal(srcRows.length, bufRows.length, 'should unpack the same number of rows'); 14 | t.equal(srcRows.length, 3, 'should unpack 3 rows'); 15 | for (var i = 0; i < 3; i++) { 16 | t.equal(bufRows[i].source, srcRows[i].source, 'should have the same source'); 17 | } 18 | }, 'should not throw'); 19 | }); 20 | -------------------------------------------------------------------------------- /test/return.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var pack = require('browser-pack'); 4 | var concat = require('concat-stream'); 5 | var vm = require('vm'); 6 | 7 | var fs = require('fs'); 8 | var src = fs.readFileSync(__dirname + '/files/return.js', 'utf8'); 9 | 10 | test('return', function (t) { 11 | t.plan(1); 12 | 13 | var p = pack({ raw: true }); 14 | p.pipe(concat(function (body) { 15 | var log = function (msg) { 16 | t.equal(msg, 'whatever'); 17 | }; 18 | var c = { console: { log: log } }; 19 | vm.runInNewContext(body.toString('utf8'), c); 20 | })); 21 | 22 | var rows = unpack(src); 23 | rows.forEach(function (row) { p.write(row) }); 24 | p.end(); 25 | }); 26 | -------------------------------------------------------------------------------- /test/standalone.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | 4 | var fs = require('fs'); 5 | var src = fs.readFileSync(__dirname + '/files/standalone.js', 'utf8'); 6 | 7 | test('standalone', function (t) { 8 | t.plan(2); 9 | t.doesNotThrow(function() { 10 | var rows = unpack(src); 11 | t.equal(rows.length, 3, 'should unpack 3 rows'); 12 | }, 'should not throw'); 13 | }); 14 | -------------------------------------------------------------------------------- /test/uglified.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var pack = require('browser-pack'); 4 | var concat = require('concat-stream'); 5 | var vm = require('vm'); 6 | 7 | var fs = require('fs'); 8 | var src = fs.readFileSync(__dirname + '/files/uglified.js', 'utf8'); 9 | 10 | test('uglified', function (t) { 11 | t.plan(4); 12 | t.doesNotThrow(function() { 13 | var p = pack({ raw: true }); 14 | var rows = unpack(src); 15 | t.equal(rows.length, 3, 'should unpack 3 rows'); 16 | t.ok(rows[2].hasOwnProperty('id'), 'third row should have an id property'); 17 | }, 'should not throw'); 18 | 19 | t.deepEquals(deps(src), ['./foo.js', 'gamma']); 20 | 21 | function deps(src) { 22 | var rows = unpack(src); 23 | return rows.reduce(function(prev, row) { 24 | return prev.concat(Object.keys(row.deps)); 25 | }, []); 26 | } 27 | }); 28 | -------------------------------------------------------------------------------- /test/unpack.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var unpack = require('../'); 3 | var pack = require('browser-pack'); 4 | var concat = require('concat-stream'); 5 | var vm = require('vm'); 6 | 7 | var fs = require('fs'); 8 | var src = fs.readFileSync(__dirname + '/files/bundle.js', 'utf8'); 9 | var empty = fs.readFileSync(__dirname + '/files/empty.js', 'utf8'); 10 | 11 | test('unpack', function (t) { 12 | t.plan(1); 13 | 14 | var p = pack({ raw: true }); 15 | p.pipe(concat(function (body) { 16 | var log = function (msg) { 17 | t.equal(msg, 521); 18 | }; 19 | var c = { console: { log: log } }; 20 | vm.runInNewContext(body.toString('utf8'), c); 21 | })); 22 | 23 | var rows = unpack(src); 24 | rows.forEach(function (row) { p.write(row) }); 25 | p.end(); 26 | }); 27 | 28 | test('does not break on empty modules', function (t) { 29 | t.plan(1); 30 | 31 | var p = pack({ raw: true }); 32 | var rows = unpack(empty); 33 | 34 | p.pipe(concat(function (body) { 35 | t.pass('did not emit an error'); 36 | })) 37 | 38 | rows.forEach(function (row) { 39 | p.write(row); 40 | }) 41 | 42 | p.end(); 43 | }) 44 | --------------------------------------------------------------------------------