we don't need uglify stuff
This commit is contained in:
parent
967824f82c
commit
bafc9ce828
46 changed files with 0 additions and 36237 deletions
419
node_modules/commander/CHANGELOG.md
generated
vendored
419
node_modules/commander/CHANGELOG.md
generated
vendored
|
@ -1,419 +0,0 @@
|
||||||
2.20.3 / 2019-10-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support Node.js 0.10 (Revert #1059)
|
|
||||||
* Ran "npm unpublish commander@2.20.2". There is no 2.20.2.
|
|
||||||
|
|
||||||
2.20.1 / 2019-09-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve executable subcommand tracking
|
|
||||||
* Update dev dependencies
|
|
||||||
|
|
||||||
2.20.0 / 2019-04-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix: resolve symbolic links completely when hunting for subcommands (#935)
|
|
||||||
* Update index.d.ts (#930)
|
|
||||||
* Update Readme.md (#924)
|
|
||||||
* Remove --save option as it isn't required anymore (#918)
|
|
||||||
* Add link to the license file (#900)
|
|
||||||
* Added example of receiving args from options (#858)
|
|
||||||
* Added missing semicolon (#882)
|
|
||||||
* Add extension to .eslintrc (#876)
|
|
||||||
|
|
||||||
2.19.0 / 2018-10-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Removed newline after Options and Commands headers (#864)
|
|
||||||
* Bugfix - Error output (#862)
|
|
||||||
* Fix to change default value to string (#856)
|
|
||||||
|
|
||||||
2.18.0 / 2018-09-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Standardize help output (#853)
|
|
||||||
* chmod 644 travis.yml (#851)
|
|
||||||
* add support for execute typescript subcommand via ts-node (#849)
|
|
||||||
|
|
||||||
2.17.1 / 2018-08-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix bug in command emit (#844)
|
|
||||||
|
|
||||||
2.17.0 / 2018-08-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fixed newline output after help information (#833)
|
|
||||||
* Fix to emit the action even without command (#778)
|
|
||||||
* npm update (#823)
|
|
||||||
|
|
||||||
2.16.0 / 2018-06-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Remove Makefile and `test/run` (#821)
|
|
||||||
* Make 'npm test' run on Windows (#820)
|
|
||||||
* Add badge to display install size (#807)
|
|
||||||
* chore: cache node_modules (#814)
|
|
||||||
* chore: remove Node.js 4 (EOL), add Node.js 10 (#813)
|
|
||||||
* fixed typo in readme (#812)
|
|
||||||
* Fix types (#804)
|
|
||||||
* Update eslint to resolve vulnerabilities in lodash (#799)
|
|
||||||
* updated readme with custom event listeners. (#791)
|
|
||||||
* fix tests (#794)
|
|
||||||
|
|
||||||
2.15.0 / 2018-03-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Update downloads badge to point to graph of downloads over time instead of duplicating link to npm
|
|
||||||
* Arguments description
|
|
||||||
|
|
||||||
2.14.1 / 2018-02-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix typing of help function
|
|
||||||
|
|
||||||
2.14.0 / 2018-02-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* only register the option:version event once
|
|
||||||
* Fixes issue #727: Passing empty string for option on command is set to undefined
|
|
||||||
* enable eqeqeq rule
|
|
||||||
* resolves #754 add linter configuration to project
|
|
||||||
* resolves #560 respect custom name for version option
|
|
||||||
* document how to override the version flag
|
|
||||||
* document using options per command
|
|
||||||
|
|
||||||
2.13.0 / 2018-01-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Do not print default for --no-
|
|
||||||
* remove trailing spaces in command help
|
|
||||||
* Update CI's Node.js to LTS and latest version
|
|
||||||
* typedefs: Command and Option types added to commander namespace
|
|
||||||
|
|
||||||
2.12.2 / 2017-11-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix: typings are not shipped
|
|
||||||
|
|
||||||
2.12.1 / 2017-11-23
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Move @types/node to dev dependency
|
|
||||||
|
|
||||||
2.12.0 / 2017-11-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add attributeName() method to Option objects
|
|
||||||
* Documentation updated for options with --no prefix
|
|
||||||
* typings: `outputHelp` takes a string as the first parameter
|
|
||||||
* typings: use overloads
|
|
||||||
* feat(typings): update to match js api
|
|
||||||
* Print default value in option help
|
|
||||||
* Fix translation error
|
|
||||||
* Fail when using same command and alias (#491)
|
|
||||||
* feat(typings): add help callback
|
|
||||||
* fix bug when description is add after command with options (#662)
|
|
||||||
* Format js code
|
|
||||||
* Rename History.md to CHANGELOG.md (#668)
|
|
||||||
* feat(typings): add typings to support TypeScript (#646)
|
|
||||||
* use current node
|
|
||||||
|
|
||||||
2.11.0 / 2017-07-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix help section order and padding (#652)
|
|
||||||
* feature: support for signals to subcommands (#632)
|
|
||||||
* Fixed #37, --help should not display first (#447)
|
|
||||||
* Fix translation errors. (#570)
|
|
||||||
* Add package-lock.json
|
|
||||||
* Remove engines
|
|
||||||
* Upgrade package version
|
|
||||||
* Prefix events to prevent conflicts between commands and options (#494)
|
|
||||||
* Removing dependency on graceful-readlink
|
|
||||||
* Support setting name in #name function and make it chainable
|
|
||||||
* Add .vscode directory to .gitignore (Visual Studio Code metadata)
|
|
||||||
* Updated link to ruby commander in readme files
|
|
||||||
|
|
||||||
2.10.0 / 2017-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Update .travis.yml. drop support for older node.js versions.
|
|
||||||
* Fix require arguments in README.md
|
|
||||||
* On SemVer you do not start from 0.0.1
|
|
||||||
* Add missing semi colon in readme
|
|
||||||
* Add save param to npm install
|
|
||||||
* node v6 travis test
|
|
||||||
* Update Readme_zh-CN.md
|
|
||||||
* Allow literal '--' to be passed-through as an argument
|
|
||||||
* Test subcommand alias help
|
|
||||||
* link build badge to master branch
|
|
||||||
* Support the alias of Git style sub-command
|
|
||||||
* added keyword commander for better search result on npm
|
|
||||||
* Fix Sub-Subcommands
|
|
||||||
* test node.js stable
|
|
||||||
* Fixes TypeError when a command has an option called `--description`
|
|
||||||
* Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets.
|
|
||||||
* Add chinese Readme file
|
|
||||||
|
|
||||||
2.9.0 / 2015-10-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add option `isDefault` to set default subcommand #415 @Qix-
|
|
||||||
* Add callback to allow filtering or post-processing of help text #434 @djulien
|
|
||||||
* Fix `undefined` text in help information close #414 #416 @zhiyelee
|
|
||||||
|
|
||||||
2.8.1 / 2015-04-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Back out `support multiline description` Close #396 #397
|
|
||||||
|
|
||||||
2.8.0 / 2015-04-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
|
|
||||||
* Fix bug in Git-style sub-commands #372 @zhiyelee
|
|
||||||
* Allow commands to be hidden from help #383 @tonylukasavage
|
|
||||||
* When git-style sub-commands are in use, yet none are called, display help #382 @claylo
|
|
||||||
* Add ability to specify arguments syntax for top-level command #258 @rrthomas
|
|
||||||
* Support multiline descriptions #208 @zxqfox
|
|
||||||
|
|
||||||
2.7.1 / 2015-03-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
|
|
||||||
|
|
||||||
2.7.0 / 2015-03-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
|
|
||||||
* Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
|
|
||||||
* Add support for camelCase on `opts()`. Close #353 @nkzawa
|
|
||||||
* Add node.js 0.12 and io.js to travis.yml
|
|
||||||
* Allow RegEx options. #337 @palanik
|
|
||||||
* Fixes exit code when sub-command failing. Close #260 #332 @pirelenito
|
|
||||||
* git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee
|
|
||||||
|
|
||||||
2.6.0 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
|
|
||||||
* Add application description to the help msg. Close #112 @dalssoft
|
|
||||||
|
|
||||||
2.5.1 / 2014-12-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
|
|
||||||
|
|
||||||
2.5.0 / 2014-10-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add support for variadic arguments. Closes #277 @whitlockjc
|
|
||||||
|
|
||||||
2.4.0 / 2014-10-17
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fixed a bug on executing the coercion function of subcommands option. Closes #270
|
|
||||||
* added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
|
|
||||||
* added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
|
|
||||||
* fixed a bug on subcommand name. Closes #248 @jonathandelgado
|
|
||||||
* fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
|
|
||||||
|
|
||||||
2.3.0 / 2014-07-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add command alias'. Closes PR #210
|
|
||||||
* fix: Typos. Closes #99
|
|
||||||
* fix: Unused fs module. Closes #217
|
|
||||||
|
|
||||||
2.2.0 / 2014-03-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add passing of previous option value
|
|
||||||
* fix: support subcommands on windows. Closes #142
|
|
||||||
* Now the defaultValue passed as the second argument of the coercion function.
|
|
||||||
|
|
||||||
2.1.0 / 2013-11-21
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add: allow cflag style option params, unit test, fixes #174
|
|
||||||
|
|
||||||
2.0.0 / 2013-07-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* remove input methods (.prompt, .confirm, etc)
|
|
||||||
|
|
||||||
1.3.2 / 2013-07-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add support for sub-commands to co-exist with the original command
|
|
||||||
|
|
||||||
1.3.1 / 2013-07-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add quick .runningCommand hack so you can opt-out of other logic when running a sub command
|
|
||||||
|
|
||||||
1.3.0 / 2013-07-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add EACCES error handling
|
|
||||||
* fix sub-command --help
|
|
||||||
|
|
||||||
1.2.0 / 2013-06-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* allow "-" hyphen as an option argument
|
|
||||||
* support for RegExp coercion
|
|
||||||
|
|
||||||
1.1.1 / 2012-11-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add more sub-command padding
|
|
||||||
* fix .usage() when args are present. Closes #106
|
|
||||||
|
|
||||||
1.1.0 / 2012-11-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add git-style executable subcommand support. Closes #94
|
|
||||||
|
|
||||||
1.0.5 / 2012-10-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix `--name` clobbering. Closes #92
|
|
||||||
* fix examples/help. Closes #89
|
|
||||||
|
|
||||||
1.0.4 / 2012-09-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `outputHelp()` method.
|
|
||||||
|
|
||||||
1.0.3 / 2012-08-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* remove invalid .version() defaulting
|
|
||||||
|
|
||||||
1.0.2 / 2012-08-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `--foo=bar` support [arv]
|
|
||||||
* fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
|
|
||||||
|
|
||||||
1.0.1 / 2012-08-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix issue #56
|
|
||||||
* fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
|
|
||||||
|
|
||||||
1.0.0 / 2012-07-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add support for optional option descriptions
|
|
||||||
* add defaulting of `.version()` to package.json's version
|
|
||||||
|
|
||||||
0.6.1 / 2012-06-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added: append (yes or no) on confirmation
|
|
||||||
* Added: allow node.js v0.7.x
|
|
||||||
|
|
||||||
0.6.0 / 2012-04-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added `.prompt(obj, callback)` support. Closes #49
|
|
||||||
* Added default support to .choose(). Closes #41
|
|
||||||
* Fixed the choice example
|
|
||||||
|
|
||||||
0.5.1 / 2011-12-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fixed `password()` for recent nodes. Closes #36
|
|
||||||
|
|
||||||
0.5.0 / 2011-12-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added sub-command option support [itay]
|
|
||||||
|
|
||||||
0.4.3 / 2011-12-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fixed custom help ordering. Closes #32
|
|
||||||
|
|
||||||
0.4.2 / 2011-11-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added travis support
|
|
||||||
* Fixed: line-buffered input automatically trimmed. Closes #31
|
|
||||||
|
|
||||||
0.4.1 / 2011-11-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Removed listening for "close" on --help
|
|
||||||
|
|
||||||
0.4.0 / 2011-11-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added support for `--`. Closes #24
|
|
||||||
|
|
||||||
0.3.3 / 2011-11-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fixed: wait for close event when writing help info [Jerry Hamlet]
|
|
||||||
|
|
||||||
0.3.2 / 2011-11-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fixed long flag definitions with values [felixge]
|
|
||||||
|
|
||||||
0.3.1 / 2011-10-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Changed `--version` short flag to `-V` from `-v`
|
|
||||||
* Changed `.version()` so it's configurable [felixge]
|
|
||||||
|
|
||||||
0.3.0 / 2011-10-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added support for long flags only. Closes #18
|
|
||||||
|
|
||||||
0.2.1 / 2011-10-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* "node": ">= 0.4.x < 0.7.0". Closes #20
|
|
||||||
|
|
||||||
0.2.0 / 2011-09-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
|
|
||||||
|
|
||||||
0.1.0 / 2011-08-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added support for custom `--help` output
|
|
||||||
|
|
||||||
0.0.5 / 2011-08-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Changed: when the user enters nothing prompt for password again
|
|
||||||
* Fixed issue with passwords beginning with numbers [NuckChorris]
|
|
||||||
|
|
||||||
0.0.4 / 2011-08-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fixed `Commander#args`
|
|
||||||
|
|
||||||
0.0.3 / 2011-08-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added default option value support
|
|
||||||
|
|
||||||
0.0.2 / 2011-08-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added mask support to `Command#password(str[, mask], fn)`
|
|
||||||
* Added `Command#password(str, fn)`
|
|
||||||
|
|
||||||
0.0.1 / 2010-01-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial release
|
|
22
node_modules/commander/LICENSE
generated
vendored
22
node_modules/commander/LICENSE
generated
vendored
|
@ -1,22 +0,0 @@
|
||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
428
node_modules/commander/Readme.md
generated
vendored
428
node_modules/commander/Readme.md
generated
vendored
|
@ -1,428 +0,0 @@
|
||||||
# Commander.js
|
|
||||||
|
|
||||||
|
|
||||||
[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js)
|
|
||||||
[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
|
|
||||||
[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true)
|
|
||||||
[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander)
|
|
||||||
[![Join the chat at https://gitter.im/tj/commander.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
||||||
|
|
||||||
The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).
|
|
||||||
[API documentation](http://tj.github.com/commander.js/)
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
$ npm install commander
|
|
||||||
|
|
||||||
## Option parsing
|
|
||||||
|
|
||||||
Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.option('-p, --peppers', 'Add peppers')
|
|
||||||
.option('-P, --pineapple', 'Add pineapple')
|
|
||||||
.option('-b, --bbq-sauce', 'Add bbq sauce')
|
|
||||||
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
console.log('you ordered a pizza with:');
|
|
||||||
if (program.peppers) console.log(' - peppers');
|
|
||||||
if (program.pineapple) console.log(' - pineapple');
|
|
||||||
if (program.bbqSauce) console.log(' - bbq');
|
|
||||||
console.log(' - %s cheese', program.cheese);
|
|
||||||
```
|
|
||||||
|
|
||||||
Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
|
|
||||||
|
|
||||||
Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.option('--no-sauce', 'Remove sauce')
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
console.log('you ordered a pizza');
|
|
||||||
if (program.sauce) console.log(' with sauce');
|
|
||||||
else console.log(' without sauce');
|
|
||||||
```
|
|
||||||
|
|
||||||
To get string arguments from options you will need to use angle brackets <> for required inputs or square brackets [] for optional inputs.
|
|
||||||
|
|
||||||
e.g. ```.option('-m --myarg [myVar]', 'my super cool description')```
|
|
||||||
|
|
||||||
Then to access the input if it was passed in.
|
|
||||||
|
|
||||||
e.g. ```var myInput = program.myarg```
|
|
||||||
|
|
||||||
**NOTE**: If you pass a argument without using brackets the example above will return true and not the value passed in.
|
|
||||||
|
|
||||||
|
|
||||||
## Version option
|
|
||||||
|
|
||||||
Calling the `version` implicitly adds the `-V` and `--version` options to the command.
|
|
||||||
When either of these options is present, the command prints the version number and exits.
|
|
||||||
|
|
||||||
$ ./examples/pizza -V
|
|
||||||
0.0.1
|
|
||||||
|
|
||||||
If you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method.
|
|
||||||
|
|
||||||
```js
|
|
||||||
program
|
|
||||||
.version('0.0.1', '-v, --version')
|
|
||||||
```
|
|
||||||
|
|
||||||
The version flags can be named anything, but the long option is required.
|
|
||||||
|
|
||||||
## Command-specific options
|
|
||||||
|
|
||||||
You can attach options to a command.
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.command('rm <dir>')
|
|
||||||
.option('-r, --recursive', 'Remove recursively')
|
|
||||||
.action(function (dir, cmd) {
|
|
||||||
console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
|
|
||||||
})
|
|
||||||
|
|
||||||
program.parse(process.argv)
|
|
||||||
```
|
|
||||||
|
|
||||||
A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated.
|
|
||||||
|
|
||||||
## Coercion
|
|
||||||
|
|
||||||
```js
|
|
||||||
function range(val) {
|
|
||||||
return val.split('..').map(Number);
|
|
||||||
}
|
|
||||||
|
|
||||||
function list(val) {
|
|
||||||
return val.split(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
function collect(val, memo) {
|
|
||||||
memo.push(val);
|
|
||||||
return memo;
|
|
||||||
}
|
|
||||||
|
|
||||||
function increaseVerbosity(v, total) {
|
|
||||||
return total + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.usage('[options] <file ...>')
|
|
||||||
.option('-i, --integer <n>', 'An integer argument', parseInt)
|
|
||||||
.option('-f, --float <n>', 'A float argument', parseFloat)
|
|
||||||
.option('-r, --range <a>..<b>', 'A range', range)
|
|
||||||
.option('-l, --list <items>', 'A list', list)
|
|
||||||
.option('-o, --optional [value]', 'An optional value')
|
|
||||||
.option('-c, --collect [value]', 'A repeatable value', collect, [])
|
|
||||||
.option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
console.log(' int: %j', program.integer);
|
|
||||||
console.log(' float: %j', program.float);
|
|
||||||
console.log(' optional: %j', program.optional);
|
|
||||||
program.range = program.range || [];
|
|
||||||
console.log(' range: %j..%j', program.range[0], program.range[1]);
|
|
||||||
console.log(' list: %j', program.list);
|
|
||||||
console.log(' collect: %j', program.collect);
|
|
||||||
console.log(' verbosity: %j', program.verbose);
|
|
||||||
console.log(' args: %j', program.args);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Regular Expression
|
|
||||||
```js
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
|
|
||||||
.option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
console.log(' size: %j', program.size);
|
|
||||||
console.log(' drink: %j', program.drink);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Variadic arguments
|
|
||||||
|
|
||||||
The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to
|
|
||||||
append `...` to the argument name. Here is an example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.command('rmdir <dir> [otherDirs...]')
|
|
||||||
.action(function (dir, otherDirs) {
|
|
||||||
console.log('rmdir %s', dir);
|
|
||||||
if (otherDirs) {
|
|
||||||
otherDirs.forEach(function (oDir) {
|
|
||||||
console.log('rmdir %s', oDir);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
program.parse(process.argv);
|
|
||||||
```
|
|
||||||
|
|
||||||
An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
|
|
||||||
to your action as demonstrated above.
|
|
||||||
|
|
||||||
## Specify the argument syntax
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.arguments('<cmd> [env]')
|
|
||||||
.action(function (cmd, env) {
|
|
||||||
cmdValue = cmd;
|
|
||||||
envValue = env;
|
|
||||||
});
|
|
||||||
|
|
||||||
program.parse(process.argv);
|
|
||||||
|
|
||||||
if (typeof cmdValue === 'undefined') {
|
|
||||||
console.error('no command given!');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
console.log('command:', cmdValue);
|
|
||||||
console.log('environment:', envValue || "no environment given");
|
|
||||||
```
|
|
||||||
Angled brackets (e.g. `<cmd>`) indicate required input. Square brackets (e.g. `[env]`) indicate optional input.
|
|
||||||
|
|
||||||
## Git-style sub-commands
|
|
||||||
|
|
||||||
```js
|
|
||||||
// file: ./examples/pm
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.command('install [name]', 'install one or more packages')
|
|
||||||
.command('search [query]', 'search with optional query')
|
|
||||||
.command('list', 'list packages installed', {isDefault: true})
|
|
||||||
.parse(process.argv);
|
|
||||||
```
|
|
||||||
|
|
||||||
When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
|
|
||||||
The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
|
|
||||||
|
|
||||||
Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
|
|
||||||
|
|
||||||
If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
|
|
||||||
|
|
||||||
### `--harmony`
|
|
||||||
|
|
||||||
You can enable `--harmony` option in two ways:
|
|
||||||
* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
|
|
||||||
* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
|
|
||||||
|
|
||||||
## Automated --help
|
|
||||||
|
|
||||||
The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ./examples/pizza --help
|
|
||||||
Usage: pizza [options]
|
|
||||||
|
|
||||||
An application for pizzas ordering
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help output usage information
|
|
||||||
-V, --version output the version number
|
|
||||||
-p, --peppers Add peppers
|
|
||||||
-P, --pineapple Add pineapple
|
|
||||||
-b, --bbq Add bbq sauce
|
|
||||||
-c, --cheese <type> Add the specified type of cheese [marble]
|
|
||||||
-C, --no-cheese You do not want any cheese
|
|
||||||
```
|
|
||||||
|
|
||||||
## Custom help
|
|
||||||
|
|
||||||
You can display arbitrary `-h, --help` information
|
|
||||||
by listening for "--help". Commander will automatically
|
|
||||||
exit once you are done so that the remainder of your program
|
|
||||||
does not execute causing undesired behaviors, for example
|
|
||||||
in the following executable "stuff" will not output when
|
|
||||||
`--help` is used.
|
|
||||||
|
|
||||||
```js
|
|
||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.option('-f, --foo', 'enable some foo')
|
|
||||||
.option('-b, --bar', 'enable some bar')
|
|
||||||
.option('-B, --baz', 'enable some baz');
|
|
||||||
|
|
||||||
// must be before .parse() since
|
|
||||||
// node's emit() is immediate
|
|
||||||
|
|
||||||
program.on('--help', function(){
|
|
||||||
console.log('')
|
|
||||||
console.log('Examples:');
|
|
||||||
console.log(' $ custom-help --help');
|
|
||||||
console.log(' $ custom-help -h');
|
|
||||||
});
|
|
||||||
|
|
||||||
program.parse(process.argv);
|
|
||||||
|
|
||||||
console.log('stuff');
|
|
||||||
```
|
|
||||||
|
|
||||||
Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
|
|
||||||
|
|
||||||
```
|
|
||||||
Usage: custom-help [options]
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help output usage information
|
|
||||||
-V, --version output the version number
|
|
||||||
-f, --foo enable some foo
|
|
||||||
-b, --bar enable some bar
|
|
||||||
-B, --baz enable some baz
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
$ custom-help --help
|
|
||||||
$ custom-help -h
|
|
||||||
```
|
|
||||||
|
|
||||||
## .outputHelp(cb)
|
|
||||||
|
|
||||||
Output help information without exiting.
|
|
||||||
Optional callback cb allows post-processing of help text before it is displayed.
|
|
||||||
|
|
||||||
If you want to display help by default (e.g. if no command was provided), you can use something like:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var program = require('commander');
|
|
||||||
var colors = require('colors');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.command('getstream [url]', 'get stream URL')
|
|
||||||
.parse(process.argv);
|
|
||||||
|
|
||||||
if (!process.argv.slice(2).length) {
|
|
||||||
program.outputHelp(make_red);
|
|
||||||
}
|
|
||||||
|
|
||||||
function make_red(txt) {
|
|
||||||
return colors.red(txt); //display the help text in red on the console
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## .help(cb)
|
|
||||||
|
|
||||||
Output help information and exit immediately.
|
|
||||||
Optional callback cb allows post-processing of help text before it is displayed.
|
|
||||||
|
|
||||||
|
|
||||||
## Custom event listeners
|
|
||||||
You can execute custom actions by listening to command and option events.
|
|
||||||
|
|
||||||
```js
|
|
||||||
program.on('option:verbose', function () {
|
|
||||||
process.env.VERBOSE = this.verbose;
|
|
||||||
});
|
|
||||||
|
|
||||||
// error on unknown commands
|
|
||||||
program.on('command:*', function () {
|
|
||||||
console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```js
|
|
||||||
var program = require('commander');
|
|
||||||
|
|
||||||
program
|
|
||||||
.version('0.1.0')
|
|
||||||
.option('-C, --chdir <path>', 'change the working directory')
|
|
||||||
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
|
||||||
.option('-T, --no-tests', 'ignore test hook');
|
|
||||||
|
|
||||||
program
|
|
||||||
.command('setup [env]')
|
|
||||||
.description('run setup commands for all envs')
|
|
||||||
.option("-s, --setup_mode [mode]", "Which setup mode to use")
|
|
||||||
.action(function(env, options){
|
|
||||||
var mode = options.setup_mode || "normal";
|
|
||||||
env = env || 'all';
|
|
||||||
console.log('setup for %s env(s) with %s mode', env, mode);
|
|
||||||
});
|
|
||||||
|
|
||||||
program
|
|
||||||
.command('exec <cmd>')
|
|
||||||
.alias('ex')
|
|
||||||
.description('execute the given remote cmd')
|
|
||||||
.option("-e, --exec_mode <mode>", "Which exec mode to use")
|
|
||||||
.action(function(cmd, options){
|
|
||||||
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
|
|
||||||
}).on('--help', function() {
|
|
||||||
console.log('');
|
|
||||||
console.log('Examples:');
|
|
||||||
console.log('');
|
|
||||||
console.log(' $ deploy exec sequential');
|
|
||||||
console.log(' $ deploy exec async');
|
|
||||||
});
|
|
||||||
|
|
||||||
program
|
|
||||||
.command('*')
|
|
||||||
.action(function(env){
|
|
||||||
console.log('deploying "%s"', env);
|
|
||||||
});
|
|
||||||
|
|
||||||
program.parse(process.argv);
|
|
||||||
```
|
|
||||||
|
|
||||||
More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](https://github.com/tj/commander.js/blob/master/LICENSE)
|
|
1224
node_modules/commander/index.js
generated
vendored
1224
node_modules/commander/index.js
generated
vendored
File diff suppressed because it is too large
Load diff
70
node_modules/commander/package.json
generated
vendored
70
node_modules/commander/package.json
generated
vendored
|
@ -1,70 +0,0 @@
|
||||||
{
|
|
||||||
"_from": "commander@~2.20.3",
|
|
||||||
"_id": "commander@2.20.3",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
|
||||||
"_location": "/commander",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "commander@~2.20.3",
|
|
||||||
"name": "commander",
|
|
||||||
"escapedName": "commander",
|
|
||||||
"rawSpec": "~2.20.3",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "~2.20.3"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/uglify-js"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
|
||||||
"_shasum": "fd485e84c03eb4881c20722ba48035e8531aeb33",
|
|
||||||
"_spec": "commander@~2.20.3",
|
|
||||||
"_where": "/home/nilix/lib/planetaryGears/node_modules/uglify-js",
|
|
||||||
"author": {
|
|
||||||
"name": "TJ Holowaychuk",
|
|
||||||
"email": "tj@vision-media.ca"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/tj/commander.js/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "the complete solution for node.js command-line programs",
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^12.7.8",
|
|
||||||
"eslint": "^6.4.0",
|
|
||||||
"should": "^13.2.3",
|
|
||||||
"sinon": "^7.5.0",
|
|
||||||
"standard": "^14.3.1",
|
|
||||||
"ts-node": "^8.4.1",
|
|
||||||
"typescript": "^3.6.3"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"index.js",
|
|
||||||
"typings/index.d.ts"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/tj/commander.js#readme",
|
|
||||||
"keywords": [
|
|
||||||
"commander",
|
|
||||||
"command",
|
|
||||||
"option",
|
|
||||||
"parser"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index",
|
|
||||||
"name": "commander",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/tj/commander.js.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint index.js",
|
|
||||||
"test": "node test/run.js && npm run test-typings",
|
|
||||||
"test-typings": "tsc -p tsconfig.json"
|
|
||||||
},
|
|
||||||
"typings": "typings/index.d.ts",
|
|
||||||
"version": "2.20.3"
|
|
||||||
}
|
|
310
node_modules/commander/typings/index.d.ts
generated
vendored
310
node_modules/commander/typings/index.d.ts
generated
vendored
|
@ -1,310 +0,0 @@
|
||||||
// Type definitions for commander 2.11
|
|
||||||
// Project: https://github.com/visionmedia/commander.js
|
|
||||||
// Definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
|
||||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
|
||||||
|
|
||||||
declare namespace local {
|
|
||||||
|
|
||||||
class Option {
|
|
||||||
flags: string;
|
|
||||||
required: boolean;
|
|
||||||
optional: boolean;
|
|
||||||
bool: boolean;
|
|
||||||
short?: string;
|
|
||||||
long: string;
|
|
||||||
description: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize a new `Option` with the given `flags` and `description`.
|
|
||||||
*
|
|
||||||
* @param {string} flags
|
|
||||||
* @param {string} [description]
|
|
||||||
*/
|
|
||||||
constructor(flags: string, description?: string);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Command extends NodeJS.EventEmitter {
|
|
||||||
[key: string]: any;
|
|
||||||
|
|
||||||
args: string[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize a new `Command`.
|
|
||||||
*
|
|
||||||
* @param {string} [name]
|
|
||||||
*/
|
|
||||||
constructor(name?: string);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the program version to `str`.
|
|
||||||
*
|
|
||||||
* This method auto-registers the "-V, --version" flag
|
|
||||||
* which will print the version number when passed.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @param {string} [flags]
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
version(str: string, flags?: string): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add command `name`.
|
|
||||||
*
|
|
||||||
* The `.action()` callback is invoked when the
|
|
||||||
* command `name` is specified via __ARGV__,
|
|
||||||
* and the remaining arguments are applied to the
|
|
||||||
* function for access.
|
|
||||||
*
|
|
||||||
* When the `name` is "*" an un-matched command
|
|
||||||
* will be passed as the first arg, followed by
|
|
||||||
* the rest of __ARGV__ remaining.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* program
|
|
||||||
* .version('0.0.1')
|
|
||||||
* .option('-C, --chdir <path>', 'change the working directory')
|
|
||||||
* .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
|
||||||
* .option('-T, --no-tests', 'ignore test hook')
|
|
||||||
*
|
|
||||||
* program
|
|
||||||
* .command('setup')
|
|
||||||
* .description('run remote setup commands')
|
|
||||||
* .action(function() {
|
|
||||||
* console.log('setup');
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* program
|
|
||||||
* .command('exec <cmd>')
|
|
||||||
* .description('run the given remote command')
|
|
||||||
* .action(function(cmd) {
|
|
||||||
* console.log('exec "%s"', cmd);
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* program
|
|
||||||
* .command('teardown <dir> [otherDirs...]')
|
|
||||||
* .description('run teardown commands')
|
|
||||||
* .action(function(dir, otherDirs) {
|
|
||||||
* console.log('dir "%s"', dir);
|
|
||||||
* if (otherDirs) {
|
|
||||||
* otherDirs.forEach(function (oDir) {
|
|
||||||
* console.log('dir "%s"', oDir);
|
|
||||||
* });
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* program
|
|
||||||
* .command('*')
|
|
||||||
* .description('deploy the given env')
|
|
||||||
* .action(function(env) {
|
|
||||||
* console.log('deploying "%s"', env);
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* program.parse(process.argv);
|
|
||||||
*
|
|
||||||
* @param {string} name
|
|
||||||
* @param {string} [desc] for git-style sub-commands
|
|
||||||
* @param {CommandOptions} [opts] command options
|
|
||||||
* @returns {Command} the new command
|
|
||||||
*/
|
|
||||||
command(name: string, desc?: string, opts?: commander.CommandOptions): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define argument syntax for the top-level command.
|
|
||||||
*
|
|
||||||
* @param {string} desc
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
arguments(desc: string): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse expected `args`.
|
|
||||||
*
|
|
||||||
* For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
|
|
||||||
*
|
|
||||||
* @param {string[]} args
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
parseExpectedArgs(args: string[]): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register callback `fn` for the command.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* program
|
|
||||||
* .command('help')
|
|
||||||
* .description('display verbose help')
|
|
||||||
* .action(function() {
|
|
||||||
* // output help here
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* @param {(...args: any[]) => void} fn
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
action(fn: (...args: any[]) => void): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define option with `flags`, `description` and optional
|
|
||||||
* coercion `fn`.
|
|
||||||
*
|
|
||||||
* The `flags` string should contain both the short and long flags,
|
|
||||||
* separated by comma, a pipe or space. The following are all valid
|
|
||||||
* all will output this way when `--help` is used.
|
|
||||||
*
|
|
||||||
* "-p, --pepper"
|
|
||||||
* "-p|--pepper"
|
|
||||||
* "-p --pepper"
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* // simple boolean defaulting to false
|
|
||||||
* program.option('-p, --pepper', 'add pepper');
|
|
||||||
*
|
|
||||||
* --pepper
|
|
||||||
* program.pepper
|
|
||||||
* // => Boolean
|
|
||||||
*
|
|
||||||
* // simple boolean defaulting to true
|
|
||||||
* program.option('-C, --no-cheese', 'remove cheese');
|
|
||||||
*
|
|
||||||
* program.cheese
|
|
||||||
* // => true
|
|
||||||
*
|
|
||||||
* --no-cheese
|
|
||||||
* program.cheese
|
|
||||||
* // => false
|
|
||||||
*
|
|
||||||
* // required argument
|
|
||||||
* program.option('-C, --chdir <path>', 'change the working directory');
|
|
||||||
*
|
|
||||||
* --chdir /tmp
|
|
||||||
* program.chdir
|
|
||||||
* // => "/tmp"
|
|
||||||
*
|
|
||||||
* // optional argument
|
|
||||||
* program.option('-c, --cheese [type]', 'add cheese [marble]');
|
|
||||||
*
|
|
||||||
* @param {string} flags
|
|
||||||
* @param {string} [description]
|
|
||||||
* @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default
|
|
||||||
* @param {*} [defaultValue]
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;
|
|
||||||
option(flags: string, description?: string, defaultValue?: any): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allow unknown options on the command line.
|
|
||||||
*
|
|
||||||
* @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
allowUnknownOption(arg?: boolean): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse `argv`, settings options and invoking commands when defined.
|
|
||||||
*
|
|
||||||
* @param {string[]} argv
|
|
||||||
* @returns {Command} for chaining
|
|
||||||
*/
|
|
||||||
parse(argv: string[]): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse options from `argv` returning `argv` void of these options.
|
|
||||||
*
|
|
||||||
* @param {string[]} argv
|
|
||||||
* @returns {ParseOptionsResult}
|
|
||||||
*/
|
|
||||||
parseOptions(argv: string[]): commander.ParseOptionsResult;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return an object containing options as key-value pairs
|
|
||||||
*
|
|
||||||
* @returns {{[key: string]: any}}
|
|
||||||
*/
|
|
||||||
opts(): { [key: string]: any };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the description to `str`.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @param {{[argName: string]: string}} argsDescription
|
|
||||||
* @return {(Command | string)}
|
|
||||||
*/
|
|
||||||
description(str: string, argsDescription?: {[argName: string]: string}): Command;
|
|
||||||
description(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set an alias for the command.
|
|
||||||
*
|
|
||||||
* @param {string} alias
|
|
||||||
* @return {(Command | string)}
|
|
||||||
*/
|
|
||||||
alias(alias: string): Command;
|
|
||||||
alias(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set or get the command usage.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @return {(Command | string)}
|
|
||||||
*/
|
|
||||||
usage(str: string): Command;
|
|
||||||
usage(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the name of the command.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @return {Command}
|
|
||||||
*/
|
|
||||||
name(str: string): Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the name of the command.
|
|
||||||
*
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
name(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Output help information for this command.
|
|
||||||
*
|
|
||||||
* @param {(str: string) => string} [cb]
|
|
||||||
*/
|
|
||||||
outputHelp(cb?: (str: string) => string): void;
|
|
||||||
|
|
||||||
/** Output help information and exit.
|
|
||||||
*
|
|
||||||
* @param {(str: string) => string} [cb]
|
|
||||||
*/
|
|
||||||
help(cb?: (str: string) => string): never;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
declare namespace commander {
|
|
||||||
|
|
||||||
type Command = local.Command
|
|
||||||
|
|
||||||
type Option = local.Option
|
|
||||||
|
|
||||||
interface CommandOptions {
|
|
||||||
noHelp?: boolean;
|
|
||||||
isDefault?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ParseOptionsResult {
|
|
||||||
args: string[];
|
|
||||||
unknown: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface CommanderStatic extends Command {
|
|
||||||
Command: typeof local.Command;
|
|
||||||
Option: typeof local.Option;
|
|
||||||
CommandOptions: CommandOptions;
|
|
||||||
ParseOptionsResult: ParseOptionsResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
declare const commander: commander.CommanderStatic;
|
|
||||||
export = commander;
|
|
301
node_modules/source-map/CHANGELOG.md
generated
vendored
301
node_modules/source-map/CHANGELOG.md
generated
vendored
|
@ -1,301 +0,0 @@
|
||||||
# Change Log
|
|
||||||
|
|
||||||
## 0.5.6
|
|
||||||
|
|
||||||
* Fix for regression when people were using numbers as names in source maps. See
|
|
||||||
#236.
|
|
||||||
|
|
||||||
## 0.5.5
|
|
||||||
|
|
||||||
* Fix "regression" of unsupported, implementation behavior that half the world
|
|
||||||
happens to have come to depend on. See #235.
|
|
||||||
|
|
||||||
* Fix regression involving function hoisting in SpiderMonkey. See #233.
|
|
||||||
|
|
||||||
## 0.5.4
|
|
||||||
|
|
||||||
* Large performance improvements to source-map serialization. See #228 and #229.
|
|
||||||
|
|
||||||
## 0.5.3
|
|
||||||
|
|
||||||
* Do not include unnecessary distribution files. See
|
|
||||||
commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86.
|
|
||||||
|
|
||||||
## 0.5.2
|
|
||||||
|
|
||||||
* Include browser distributions of the library in package.json's `files`. See
|
|
||||||
issue #212.
|
|
||||||
|
|
||||||
## 0.5.1
|
|
||||||
|
|
||||||
* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See
|
|
||||||
ff05274becc9e6e1295ed60f3ea090d31d843379.
|
|
||||||
|
|
||||||
## 0.5.0
|
|
||||||
|
|
||||||
* Node 0.8 is no longer supported.
|
|
||||||
|
|
||||||
* Use webpack instead of dryice for bundling.
|
|
||||||
|
|
||||||
* Big speedups serializing source maps. See pull request #203.
|
|
||||||
|
|
||||||
* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that
|
|
||||||
explicitly start with the source root. See issue #199.
|
|
||||||
|
|
||||||
## 0.4.4
|
|
||||||
|
|
||||||
* Fix an issue where using a `SourceMapGenerator` after having created a
|
|
||||||
`SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See
|
|
||||||
issue #191.
|
|
||||||
|
|
||||||
* Fix an issue with where `SourceMapGenerator` would mistakenly consider
|
|
||||||
different mappings as duplicates of each other and avoid generating them. See
|
|
||||||
issue #192.
|
|
||||||
|
|
||||||
## 0.4.3
|
|
||||||
|
|
||||||
* A very large number of performance improvements, particularly when parsing
|
|
||||||
source maps. Collectively about 75% of time shaved off of the source map
|
|
||||||
parsing benchmark!
|
|
||||||
|
|
||||||
* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy
|
|
||||||
searching in the presence of a column option. See issue #177.
|
|
||||||
|
|
||||||
* Fix a bug with joining a source and its source root when the source is above
|
|
||||||
the root. See issue #182.
|
|
||||||
|
|
||||||
* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to
|
|
||||||
determine when all sources' contents are inlined into the source map. See
|
|
||||||
issue #190.
|
|
||||||
|
|
||||||
## 0.4.2
|
|
||||||
|
|
||||||
* Add an `.npmignore` file so that the benchmarks aren't pulled down by
|
|
||||||
dependent projects. Issue #169.
|
|
||||||
|
|
||||||
* Add an optional `column` argument to
|
|
||||||
`SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines
|
|
||||||
with no mappings. Issues #172 and #173.
|
|
||||||
|
|
||||||
## 0.4.1
|
|
||||||
|
|
||||||
* Fix accidentally defining a global variable. #170.
|
|
||||||
|
|
||||||
## 0.4.0
|
|
||||||
|
|
||||||
* The default direction for fuzzy searching was changed back to its original
|
|
||||||
direction. See #164.
|
|
||||||
|
|
||||||
* There is now a `bias` option you can supply to `SourceMapConsumer` to control
|
|
||||||
the fuzzy searching direction. See #167.
|
|
||||||
|
|
||||||
* About an 8% speed up in parsing source maps. See #159.
|
|
||||||
|
|
||||||
* Added a benchmark for parsing and generating source maps.
|
|
||||||
|
|
||||||
## 0.3.0
|
|
||||||
|
|
||||||
* Change the default direction that searching for positions fuzzes when there is
|
|
||||||
not an exact match. See #154.
|
|
||||||
|
|
||||||
* Support for environments using json2.js for JSON serialization. See #156.
|
|
||||||
|
|
||||||
## 0.2.0
|
|
||||||
|
|
||||||
* Support for consuming "indexed" source maps which do not have any remote
|
|
||||||
sections. See pull request #127. This introduces a minor backwards
|
|
||||||
incompatibility if you are monkey patching `SourceMapConsumer.prototype`
|
|
||||||
methods.
|
|
||||||
|
|
||||||
## 0.1.43
|
|
||||||
|
|
||||||
* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue
|
|
||||||
#148 for some discussion and issues #150, #151, and #152 for implementations.
|
|
||||||
|
|
||||||
## 0.1.42
|
|
||||||
|
|
||||||
* Fix an issue where `SourceNode`s from different versions of the source-map
|
|
||||||
library couldn't be used in conjunction with each other. See issue #142.
|
|
||||||
|
|
||||||
## 0.1.41
|
|
||||||
|
|
||||||
* Fix a bug with getting the source content of relative sources with a "./"
|
|
||||||
prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768).
|
|
||||||
|
|
||||||
* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the
|
|
||||||
column span of each mapping.
|
|
||||||
|
|
||||||
* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find
|
|
||||||
all generated positions associated with a given original source and line.
|
|
||||||
|
|
||||||
## 0.1.40
|
|
||||||
|
|
||||||
* Performance improvements for parsing source maps in SourceMapConsumer.
|
|
||||||
|
|
||||||
## 0.1.39
|
|
||||||
|
|
||||||
* Fix a bug where setting a source's contents to null before any source content
|
|
||||||
had been set before threw a TypeError. See issue #131.
|
|
||||||
|
|
||||||
## 0.1.38
|
|
||||||
|
|
||||||
* Fix a bug where finding relative paths from an empty path were creating
|
|
||||||
absolute paths. See issue #129.
|
|
||||||
|
|
||||||
## 0.1.37
|
|
||||||
|
|
||||||
* Fix a bug where if the source root was an empty string, relative source paths
|
|
||||||
would turn into absolute source paths. Issue #124.
|
|
||||||
|
|
||||||
## 0.1.36
|
|
||||||
|
|
||||||
* Allow the `names` mapping property to be an empty string. Issue #121.
|
|
||||||
|
|
||||||
## 0.1.35
|
|
||||||
|
|
||||||
* A third optional parameter was added to `SourceNode.fromStringWithSourceMap`
|
|
||||||
to specify a path that relative sources in the second parameter should be
|
|
||||||
relative to. Issue #105.
|
|
||||||
|
|
||||||
* If no file property is given to a `SourceMapGenerator`, then the resulting
|
|
||||||
source map will no longer have a `null` file property. The property will
|
|
||||||
simply not exist. Issue #104.
|
|
||||||
|
|
||||||
* Fixed a bug where consecutive newlines were ignored in `SourceNode`s.
|
|
||||||
Issue #116.
|
|
||||||
|
|
||||||
## 0.1.34
|
|
||||||
|
|
||||||
* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103.
|
|
||||||
|
|
||||||
* Fix bug involving source contents and the
|
|
||||||
`SourceMapGenerator.prototype.applySourceMap`. Issue #100.
|
|
||||||
|
|
||||||
## 0.1.33
|
|
||||||
|
|
||||||
* Fix some edge cases surrounding path joining and URL resolution.
|
|
||||||
|
|
||||||
* Add a third parameter for relative path to
|
|
||||||
`SourceMapGenerator.prototype.applySourceMap`.
|
|
||||||
|
|
||||||
* Fix issues with mappings and EOLs.
|
|
||||||
|
|
||||||
## 0.1.32
|
|
||||||
|
|
||||||
* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns
|
|
||||||
(issue 92).
|
|
||||||
|
|
||||||
* Fixed test runner to actually report number of failed tests as its process
|
|
||||||
exit code.
|
|
||||||
|
|
||||||
* Fixed a typo when reporting bad mappings (issue 87).
|
|
||||||
|
|
||||||
## 0.1.31
|
|
||||||
|
|
||||||
* Delay parsing the mappings in SourceMapConsumer until queried for a source
|
|
||||||
location.
|
|
||||||
|
|
||||||
* Support Sass source maps (which at the time of writing deviate from the spec
|
|
||||||
in small ways) in SourceMapConsumer.
|
|
||||||
|
|
||||||
## 0.1.30
|
|
||||||
|
|
||||||
* Do not join source root with a source, when the source is a data URI.
|
|
||||||
|
|
||||||
* Extend the test runner to allow running single specific test files at a time.
|
|
||||||
|
|
||||||
* Performance improvements in `SourceNode.prototype.walk` and
|
|
||||||
`SourceMapConsumer.prototype.eachMapping`.
|
|
||||||
|
|
||||||
* Source map browser builds will now work inside Workers.
|
|
||||||
|
|
||||||
* Better error messages when attempting to add an invalid mapping to a
|
|
||||||
`SourceMapGenerator`.
|
|
||||||
|
|
||||||
## 0.1.29
|
|
||||||
|
|
||||||
* Allow duplicate entries in the `names` and `sources` arrays of source maps
|
|
||||||
(usually from TypeScript) we are parsing. Fixes github issue 72.
|
|
||||||
|
|
||||||
## 0.1.28
|
|
||||||
|
|
||||||
* Skip duplicate mappings when creating source maps from SourceNode; github
|
|
||||||
issue 75.
|
|
||||||
|
|
||||||
## 0.1.27
|
|
||||||
|
|
||||||
* Don't throw an error when the `file` property is missing in SourceMapConsumer,
|
|
||||||
we don't use it anyway.
|
|
||||||
|
|
||||||
## 0.1.26
|
|
||||||
|
|
||||||
* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.
|
|
||||||
|
|
||||||
## 0.1.25
|
|
||||||
|
|
||||||
* Make compatible with browserify
|
|
||||||
|
|
||||||
## 0.1.24
|
|
||||||
|
|
||||||
* Fix issue with absolute paths and `file://` URIs. See
|
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=885597
|
|
||||||
|
|
||||||
## 0.1.23
|
|
||||||
|
|
||||||
* Fix issue with absolute paths and sourcesContent, github issue 64.
|
|
||||||
|
|
||||||
## 0.1.22
|
|
||||||
|
|
||||||
* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.
|
|
||||||
|
|
||||||
## 0.1.21
|
|
||||||
|
|
||||||
* Fixed handling of sources that start with a slash so that they are relative to
|
|
||||||
the source root's host.
|
|
||||||
|
|
||||||
## 0.1.20
|
|
||||||
|
|
||||||
* Fixed github issue #43: absolute URLs aren't joined with the source root
|
|
||||||
anymore.
|
|
||||||
|
|
||||||
## 0.1.19
|
|
||||||
|
|
||||||
* Using Travis CI to run tests.
|
|
||||||
|
|
||||||
## 0.1.18
|
|
||||||
|
|
||||||
* Fixed a bug in the handling of sourceRoot.
|
|
||||||
|
|
||||||
## 0.1.17
|
|
||||||
|
|
||||||
* Added SourceNode.fromStringWithSourceMap.
|
|
||||||
|
|
||||||
## 0.1.16
|
|
||||||
|
|
||||||
* Added missing documentation.
|
|
||||||
|
|
||||||
* Fixed the generating of empty mappings in SourceNode.
|
|
||||||
|
|
||||||
## 0.1.15
|
|
||||||
|
|
||||||
* Added SourceMapGenerator.applySourceMap.
|
|
||||||
|
|
||||||
## 0.1.14
|
|
||||||
|
|
||||||
* The sourceRoot is now handled consistently.
|
|
||||||
|
|
||||||
## 0.1.13
|
|
||||||
|
|
||||||
* Added SourceMapGenerator.fromSourceMap.
|
|
||||||
|
|
||||||
## 0.1.12
|
|
||||||
|
|
||||||
* SourceNode now generates empty mappings too.
|
|
||||||
|
|
||||||
## 0.1.11
|
|
||||||
|
|
||||||
* Added name support to SourceNode.
|
|
||||||
|
|
||||||
## 0.1.10
|
|
||||||
|
|
||||||
* Added sourcesContent support to the customer and generator.
|
|
28
node_modules/source-map/LICENSE
generated
vendored
28
node_modules/source-map/LICENSE
generated
vendored
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
Copyright (c) 2009-2011, Mozilla Foundation and contributors
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the names of the Mozilla Foundation nor the names of project
|
|
||||||
contributors may be used to endorse or promote products derived from this
|
|
||||||
software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
742
node_modules/source-map/README.md
generated
vendored
742
node_modules/source-map/README.md
generated
vendored
|
@ -1,742 +0,0 @@
|
||||||
# Source Map
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)
|
|
||||||
|
|
||||||
[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map)
|
|
||||||
|
|
||||||
This is a library to generate and consume the source map format
|
|
||||||
[described here][format].
|
|
||||||
|
|
||||||
[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
|
|
||||||
|
|
||||||
## Use with Node
|
|
||||||
|
|
||||||
$ npm install source-map
|
|
||||||
|
|
||||||
## Use on the Web
|
|
||||||
|
|
||||||
<script src="https://raw.githubusercontent.com/mozilla/source-map/master/dist/source-map.min.js" defer></script>
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
<!-- `npm run toc` to regenerate the Table of Contents -->
|
|
||||||
|
|
||||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|
||||||
## Table of Contents
|
|
||||||
|
|
||||||
- [Examples](#examples)
|
|
||||||
- [Consuming a source map](#consuming-a-source-map)
|
|
||||||
- [Generating a source map](#generating-a-source-map)
|
|
||||||
- [With SourceNode (high level API)](#with-sourcenode-high-level-api)
|
|
||||||
- [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)
|
|
||||||
- [API](#api)
|
|
||||||
- [SourceMapConsumer](#sourcemapconsumer)
|
|
||||||
- [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)
|
|
||||||
- [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)
|
|
||||||
- [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)
|
|
||||||
- [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)
|
|
||||||
- [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)
|
|
||||||
- [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)
|
|
||||||
- [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)
|
|
||||||
- [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)
|
|
||||||
- [SourceMapGenerator](#sourcemapgenerator)
|
|
||||||
- [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)
|
|
||||||
- [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)
|
|
||||||
- [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)
|
|
||||||
- [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)
|
|
||||||
- [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)
|
|
||||||
- [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)
|
|
||||||
- [SourceNode](#sourcenode)
|
|
||||||
- [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)
|
|
||||||
- [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)
|
|
||||||
- [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)
|
|
||||||
- [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)
|
|
||||||
- [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)
|
|
||||||
- [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)
|
|
||||||
- [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)
|
|
||||||
- [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)
|
|
||||||
- [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)
|
|
||||||
- [SourceNode.prototype.toString()](#sourcenodeprototypetostring)
|
|
||||||
- [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)
|
|
||||||
|
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Consuming a source map
|
|
||||||
|
|
||||||
```js
|
|
||||||
var rawSourceMap = {
|
|
||||||
version: 3,
|
|
||||||
file: 'min.js',
|
|
||||||
names: ['bar', 'baz', 'n'],
|
|
||||||
sources: ['one.js', 'two.js'],
|
|
||||||
sourceRoot: 'http://example.com/www/js/',
|
|
||||||
mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
|
|
||||||
};
|
|
||||||
|
|
||||||
var smc = new SourceMapConsumer(rawSourceMap);
|
|
||||||
|
|
||||||
console.log(smc.sources);
|
|
||||||
// [ 'http://example.com/www/js/one.js',
|
|
||||||
// 'http://example.com/www/js/two.js' ]
|
|
||||||
|
|
||||||
console.log(smc.originalPositionFor({
|
|
||||||
line: 2,
|
|
||||||
column: 28
|
|
||||||
}));
|
|
||||||
// { source: 'http://example.com/www/js/two.js',
|
|
||||||
// line: 2,
|
|
||||||
// column: 10,
|
|
||||||
// name: 'n' }
|
|
||||||
|
|
||||||
console.log(smc.generatedPositionFor({
|
|
||||||
source: 'http://example.com/www/js/two.js',
|
|
||||||
line: 2,
|
|
||||||
column: 10
|
|
||||||
}));
|
|
||||||
// { line: 2, column: 28 }
|
|
||||||
|
|
||||||
smc.eachMapping(function (m) {
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generating a source map
|
|
||||||
|
|
||||||
In depth guide:
|
|
||||||
[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
|
|
||||||
|
|
||||||
#### With SourceNode (high level API)
|
|
||||||
|
|
||||||
```js
|
|
||||||
function compile(ast) {
|
|
||||||
switch (ast.type) {
|
|
||||||
case 'BinaryExpression':
|
|
||||||
return new SourceNode(
|
|
||||||
ast.location.line,
|
|
||||||
ast.location.column,
|
|
||||||
ast.location.source,
|
|
||||||
[compile(ast.left), " + ", compile(ast.right)]
|
|
||||||
);
|
|
||||||
case 'Literal':
|
|
||||||
return new SourceNode(
|
|
||||||
ast.location.line,
|
|
||||||
ast.location.column,
|
|
||||||
ast.location.source,
|
|
||||||
String(ast.value)
|
|
||||||
);
|
|
||||||
// ...
|
|
||||||
default:
|
|
||||||
throw new Error("Bad AST");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var ast = parse("40 + 2", "add.js");
|
|
||||||
console.log(compile(ast).toStringWithSourceMap({
|
|
||||||
file: 'add.js'
|
|
||||||
}));
|
|
||||||
// { code: '40 + 2',
|
|
||||||
// map: [object SourceMapGenerator] }
|
|
||||||
```
|
|
||||||
|
|
||||||
#### With SourceMapGenerator (low level API)
|
|
||||||
|
|
||||||
```js
|
|
||||||
var map = new SourceMapGenerator({
|
|
||||||
file: "source-mapped.js"
|
|
||||||
});
|
|
||||||
|
|
||||||
map.addMapping({
|
|
||||||
generated: {
|
|
||||||
line: 10,
|
|
||||||
column: 35
|
|
||||||
},
|
|
||||||
source: "foo.js",
|
|
||||||
original: {
|
|
||||||
line: 33,
|
|
||||||
column: 2
|
|
||||||
},
|
|
||||||
name: "christopher"
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(map.toString());
|
|
||||||
// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
Get a reference to the module:
|
|
||||||
|
|
||||||
```js
|
|
||||||
// Node.js
|
|
||||||
var sourceMap = require('source-map');
|
|
||||||
|
|
||||||
// Browser builds
|
|
||||||
var sourceMap = window.sourceMap;
|
|
||||||
|
|
||||||
// Inside Firefox
|
|
||||||
const sourceMap = require("devtools/toolkit/sourcemap/source-map.js");
|
|
||||||
```
|
|
||||||
|
|
||||||
### SourceMapConsumer
|
|
||||||
|
|
||||||
A SourceMapConsumer instance represents a parsed source map which we can query
|
|
||||||
for information about the original file positions by giving it a file position
|
|
||||||
in the generated source.
|
|
||||||
|
|
||||||
#### new SourceMapConsumer(rawSourceMap)
|
|
||||||
|
|
||||||
The only parameter is the raw source map (either as a string which can be
|
|
||||||
`JSON.parse`'d, or an object). According to the spec, source maps have the
|
|
||||||
following attributes:
|
|
||||||
|
|
||||||
* `version`: Which version of the source map spec this map is following.
|
|
||||||
|
|
||||||
* `sources`: An array of URLs to the original source files.
|
|
||||||
|
|
||||||
* `names`: An array of identifiers which can be referenced by individual
|
|
||||||
mappings.
|
|
||||||
|
|
||||||
* `sourceRoot`: Optional. The URL root from which all sources are relative.
|
|
||||||
|
|
||||||
* `sourcesContent`: Optional. An array of contents of the original source files.
|
|
||||||
|
|
||||||
* `mappings`: A string of base64 VLQs which contain the actual mappings.
|
|
||||||
|
|
||||||
* `file`: Optional. The generated filename this source map is associated with.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.computeColumnSpans()
|
|
||||||
|
|
||||||
Compute the last column for each generated mapping. The last column is
|
|
||||||
inclusive.
|
|
||||||
|
|
||||||
```js
|
|
||||||
// Before:
|
|
||||||
consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
|
|
||||||
// [ { line: 2,
|
|
||||||
// column: 1 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 10 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 20 } ]
|
|
||||||
|
|
||||||
consumer.computeColumnSpans();
|
|
||||||
|
|
||||||
// After:
|
|
||||||
consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
|
|
||||||
// [ { line: 2,
|
|
||||||
// column: 1,
|
|
||||||
// lastColumn: 9 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 10,
|
|
||||||
// lastColumn: 19 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 20,
|
|
||||||
// lastColumn: Infinity } ]
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
|
|
||||||
|
|
||||||
Returns the original source, line, and column information for the generated
|
|
||||||
source's line and column positions provided. The only argument is an object with
|
|
||||||
the following properties:
|
|
||||||
|
|
||||||
* `line`: The line number in the generated source. Line numbers in
|
|
||||||
this library are 1-based (note that the underlying source map
|
|
||||||
specification uses 0-based line numbers -- this library handles the
|
|
||||||
translation).
|
|
||||||
|
|
||||||
* `column`: The column number in the generated source. Column numbers
|
|
||||||
in this library are 0-based.
|
|
||||||
|
|
||||||
* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or
|
|
||||||
`SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest
|
|
||||||
element that is smaller than or greater than the one we are searching for,
|
|
||||||
respectively, if the exact element cannot be found. Defaults to
|
|
||||||
`SourceMapConsumer.GREATEST_LOWER_BOUND`.
|
|
||||||
|
|
||||||
and an object is returned with the following properties:
|
|
||||||
|
|
||||||
* `source`: The original source file, or null if this information is not
|
|
||||||
available.
|
|
||||||
|
|
||||||
* `line`: The line number in the original source, or null if this information is
|
|
||||||
not available. The line number is 1-based.
|
|
||||||
|
|
||||||
* `column`: The column number in the original source, or null if this
|
|
||||||
information is not available. The column number is 0-based.
|
|
||||||
|
|
||||||
* `name`: The original identifier, or null if this information is not available.
|
|
||||||
|
|
||||||
```js
|
|
||||||
consumer.originalPositionFor({ line: 2, column: 10 })
|
|
||||||
// { source: 'foo.coffee',
|
|
||||||
// line: 2,
|
|
||||||
// column: 2,
|
|
||||||
// name: null }
|
|
||||||
|
|
||||||
consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })
|
|
||||||
// { source: null,
|
|
||||||
// line: null,
|
|
||||||
// column: null,
|
|
||||||
// name: null }
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
|
|
||||||
|
|
||||||
Returns the generated line and column information for the original source,
|
|
||||||
line, and column positions provided. The only argument is an object with
|
|
||||||
the following properties:
|
|
||||||
|
|
||||||
* `source`: The filename of the original source.
|
|
||||||
|
|
||||||
* `line`: The line number in the original source. The line number is
|
|
||||||
1-based.
|
|
||||||
|
|
||||||
* `column`: The column number in the original source. The column
|
|
||||||
number is 0-based.
|
|
||||||
|
|
||||||
and an object is returned with the following properties:
|
|
||||||
|
|
||||||
* `line`: The line number in the generated source, or null. The line
|
|
||||||
number is 1-based.
|
|
||||||
|
|
||||||
* `column`: The column number in the generated source, or null. The
|
|
||||||
column number is 0-based.
|
|
||||||
|
|
||||||
```js
|
|
||||||
consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 })
|
|
||||||
// { line: 1,
|
|
||||||
// column: 56 }
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)
|
|
||||||
|
|
||||||
Returns all generated line and column information for the original source, line,
|
|
||||||
and column provided. If no column is provided, returns all mappings
|
|
||||||
corresponding to a either the line we are searching for or the next closest line
|
|
||||||
that has any mappings. Otherwise, returns all mappings corresponding to the
|
|
||||||
given line and either the column we are searching for or the next closest column
|
|
||||||
that has any offsets.
|
|
||||||
|
|
||||||
The only argument is an object with the following properties:
|
|
||||||
|
|
||||||
* `source`: The filename of the original source.
|
|
||||||
|
|
||||||
* `line`: The line number in the original source. The line number is
|
|
||||||
1-based.
|
|
||||||
|
|
||||||
* `column`: Optional. The column number in the original source. The
|
|
||||||
column number is 0-based.
|
|
||||||
|
|
||||||
and an array of objects is returned, each with the following properties:
|
|
||||||
|
|
||||||
* `line`: The line number in the generated source, or null. The line
|
|
||||||
number is 1-based.
|
|
||||||
|
|
||||||
* `column`: The column number in the generated source, or null. The
|
|
||||||
column number is 0-based.
|
|
||||||
|
|
||||||
```js
|
|
||||||
consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" })
|
|
||||||
// [ { line: 2,
|
|
||||||
// column: 1 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 10 },
|
|
||||||
// { line: 2,
|
|
||||||
// column: 20 } ]
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.hasContentsOfAllSources()
|
|
||||||
|
|
||||||
Return true if we have the embedded source content for every source listed in
|
|
||||||
the source map, false otherwise.
|
|
||||||
|
|
||||||
In other words, if this method returns `true`, then
|
|
||||||
`consumer.sourceContentFor(s)` will succeed for every source `s` in
|
|
||||||
`consumer.sources`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
// ...
|
|
||||||
if (consumer.hasContentsOfAllSources()) {
|
|
||||||
consumerReadyCallback(consumer);
|
|
||||||
} else {
|
|
||||||
fetchSources(consumer, consumerReadyCallback);
|
|
||||||
}
|
|
||||||
// ...
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])
|
|
||||||
|
|
||||||
Returns the original source content for the source provided. The only
|
|
||||||
argument is the URL of the original source file.
|
|
||||||
|
|
||||||
If the source content for the given source is not found, then an error is
|
|
||||||
thrown. Optionally, pass `true` as the second param to have `null` returned
|
|
||||||
instead.
|
|
||||||
|
|
||||||
```js
|
|
||||||
consumer.sources
|
|
||||||
// [ "my-cool-lib.clj" ]
|
|
||||||
|
|
||||||
consumer.sourceContentFor("my-cool-lib.clj")
|
|
||||||
// "..."
|
|
||||||
|
|
||||||
consumer.sourceContentFor("this is not in the source map");
|
|
||||||
// Error: "this is not in the source map" is not in the source map
|
|
||||||
|
|
||||||
consumer.sourceContentFor("this is not in the source map", true);
|
|
||||||
// null
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
|
|
||||||
|
|
||||||
Iterate over each mapping between an original source/line/column and a
|
|
||||||
generated line/column in this source map.
|
|
||||||
|
|
||||||
* `callback`: The function that is called with each mapping. Mappings have the
|
|
||||||
form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
|
|
||||||
name }`
|
|
||||||
|
|
||||||
* `context`: Optional. If specified, this object will be the value of `this`
|
|
||||||
every time that `callback` is called.
|
|
||||||
|
|
||||||
* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
|
|
||||||
`SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
|
|
||||||
the mappings sorted by the generated file's line/column order or the
|
|
||||||
original's source/line/column order, respectively. Defaults to
|
|
||||||
`SourceMapConsumer.GENERATED_ORDER`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
consumer.eachMapping(function (m) { console.log(m); })
|
|
||||||
// ...
|
|
||||||
// { source: 'illmatic.js',
|
|
||||||
// generatedLine: 1,
|
|
||||||
// generatedColumn: 0,
|
|
||||||
// originalLine: 1,
|
|
||||||
// originalColumn: 0,
|
|
||||||
// name: null }
|
|
||||||
// { source: 'illmatic.js',
|
|
||||||
// generatedLine: 2,
|
|
||||||
// generatedColumn: 0,
|
|
||||||
// originalLine: 2,
|
|
||||||
// originalColumn: 0,
|
|
||||||
// name: null }
|
|
||||||
// ...
|
|
||||||
```
|
|
||||||
### SourceMapGenerator
|
|
||||||
|
|
||||||
An instance of the SourceMapGenerator represents a source map which is being
|
|
||||||
built incrementally.
|
|
||||||
|
|
||||||
#### new SourceMapGenerator([startOfSourceMap])
|
|
||||||
|
|
||||||
You may pass an object with the following properties:
|
|
||||||
|
|
||||||
* `file`: The filename of the generated source that this source map is
|
|
||||||
associated with.
|
|
||||||
|
|
||||||
* `sourceRoot`: A root for all relative URLs in this source map.
|
|
||||||
|
|
||||||
* `skipValidation`: Optional. When `true`, disables validation of mappings as
|
|
||||||
they are added. This can improve performance but should be used with
|
|
||||||
discretion, as a last resort. Even then, one should avoid using this flag when
|
|
||||||
running tests, if possible.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var generator = new sourceMap.SourceMapGenerator({
|
|
||||||
file: "my-generated-javascript-file.js",
|
|
||||||
sourceRoot: "http://example.com/app/js/"
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
|
|
||||||
|
|
||||||
Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.
|
|
||||||
|
|
||||||
* `sourceMapConsumer` The SourceMap.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.addMapping(mapping)
|
|
||||||
|
|
||||||
Add a single mapping from original source line and column to the generated
|
|
||||||
source's line and column for this source map being created. The mapping object
|
|
||||||
should have the following properties:
|
|
||||||
|
|
||||||
* `generated`: An object with the generated line and column positions.
|
|
||||||
|
|
||||||
* `original`: An object with the original line and column positions.
|
|
||||||
|
|
||||||
* `source`: The original source file (relative to the sourceRoot).
|
|
||||||
|
|
||||||
* `name`: An optional original token name for this mapping.
|
|
||||||
|
|
||||||
```js
|
|
||||||
generator.addMapping({
|
|
||||||
source: "module-one.scm",
|
|
||||||
original: { line: 128, column: 0 },
|
|
||||||
generated: { line: 3, column: 456 }
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
|
|
||||||
|
|
||||||
Set the source content for an original source file.
|
|
||||||
|
|
||||||
* `sourceFile` the URL of the original source file.
|
|
||||||
|
|
||||||
* `sourceContent` the content of the source file.
|
|
||||||
|
|
||||||
```js
|
|
||||||
generator.setSourceContent("module-one.scm",
|
|
||||||
fs.readFileSync("path/to/module-one.scm"))
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])
|
|
||||||
|
|
||||||
Applies a SourceMap for a source file to the SourceMap.
|
|
||||||
Each mapping to the supplied source file is rewritten using the
|
|
||||||
supplied SourceMap. Note: The resolution for the resulting mappings
|
|
||||||
is the minimum of this map and the supplied map.
|
|
||||||
|
|
||||||
* `sourceMapConsumer`: The SourceMap to be applied.
|
|
||||||
|
|
||||||
* `sourceFile`: Optional. The filename of the source file.
|
|
||||||
If omitted, sourceMapConsumer.file will be used, if it exists.
|
|
||||||
Otherwise an error will be thrown.
|
|
||||||
|
|
||||||
* `sourceMapPath`: Optional. The dirname of the path to the SourceMap
|
|
||||||
to be applied. If relative, it is relative to the SourceMap.
|
|
||||||
|
|
||||||
This parameter is needed when the two SourceMaps aren't in the same
|
|
||||||
directory, and the SourceMap to be applied contains relative source
|
|
||||||
paths. If so, those relative source paths need to be rewritten
|
|
||||||
relative to the SourceMap.
|
|
||||||
|
|
||||||
If omitted, it is assumed that both SourceMaps are in the same directory,
|
|
||||||
thus not needing any rewriting. (Supplying `'.'` has the same effect.)
|
|
||||||
|
|
||||||
#### SourceMapGenerator.prototype.toString()
|
|
||||||
|
|
||||||
Renders the source map being generated to a string.
|
|
||||||
|
|
||||||
```js
|
|
||||||
generator.toString()
|
|
||||||
// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### SourceNode
|
|
||||||
|
|
||||||
SourceNodes provide a way to abstract over interpolating and/or concatenating
|
|
||||||
snippets of generated JavaScript source code, while maintaining the line and
|
|
||||||
column information associated between those snippets and the original source
|
|
||||||
code. This is useful as the final intermediate representation a compiler might
|
|
||||||
use before outputting the generated JS and source map.
|
|
||||||
|
|
||||||
#### new SourceNode([line, column, source[, chunk[, name]]])
|
|
||||||
|
|
||||||
* `line`: The original line number associated with this source node, or null if
|
|
||||||
it isn't associated with an original line. The line number is 1-based.
|
|
||||||
|
|
||||||
* `column`: The original column number associated with this source node, or null
|
|
||||||
if it isn't associated with an original column. The column number
|
|
||||||
is 0-based.
|
|
||||||
|
|
||||||
* `source`: The original source's filename; null if no filename is provided.
|
|
||||||
|
|
||||||
* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
|
|
||||||
below.
|
|
||||||
|
|
||||||
* `name`: Optional. The original identifier.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var node = new SourceNode(1, 2, "a.cpp", [
|
|
||||||
new SourceNode(3, 4, "b.cpp", "extern int status;\n"),
|
|
||||||
new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"),
|
|
||||||
new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"),
|
|
||||||
]);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])
|
|
||||||
|
|
||||||
Creates a SourceNode from generated code and a SourceMapConsumer.
|
|
||||||
|
|
||||||
* `code`: The generated code
|
|
||||||
|
|
||||||
* `sourceMapConsumer` The SourceMap for the generated code
|
|
||||||
|
|
||||||
* `relativePath` The optional path that relative sources in `sourceMapConsumer`
|
|
||||||
should be relative to.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8"));
|
|
||||||
var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"),
|
|
||||||
consumer);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.add(chunk)
|
|
||||||
|
|
||||||
Add a chunk of generated JS to this source node.
|
|
||||||
|
|
||||||
* `chunk`: A string snippet of generated JS code, another instance of
|
|
||||||
`SourceNode`, or an array where each member is one of those things.
|
|
||||||
|
|
||||||
```js
|
|
||||||
node.add(" + ");
|
|
||||||
node.add(otherNode);
|
|
||||||
node.add([leftHandOperandNode, " + ", rightHandOperandNode]);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.prepend(chunk)
|
|
||||||
|
|
||||||
Prepend a chunk of generated JS to this source node.
|
|
||||||
|
|
||||||
* `chunk`: A string snippet of generated JS code, another instance of
|
|
||||||
`SourceNode`, or an array where each member is one of those things.
|
|
||||||
|
|
||||||
```js
|
|
||||||
node.prepend("/** Build Id: f783haef86324gf **/\n\n");
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
|
|
||||||
|
|
||||||
Set the source content for a source file. This will be added to the
|
|
||||||
`SourceMap` in the `sourcesContent` field.
|
|
||||||
|
|
||||||
* `sourceFile`: The filename of the source file
|
|
||||||
|
|
||||||
* `sourceContent`: The content of the source file
|
|
||||||
|
|
||||||
```js
|
|
||||||
node.setSourceContent("module-one.scm",
|
|
||||||
fs.readFileSync("path/to/module-one.scm"))
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.walk(fn)
|
|
||||||
|
|
||||||
Walk over the tree of JS snippets in this node and its children. The walking
|
|
||||||
function is called once for each snippet of JS and is passed that snippet and
|
|
||||||
the its original associated source's line/column location.
|
|
||||||
|
|
||||||
* `fn`: The traversal function.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var node = new SourceNode(1, 2, "a.js", [
|
|
||||||
new SourceNode(3, 4, "b.js", "uno"),
|
|
||||||
"dos",
|
|
||||||
[
|
|
||||||
"tres",
|
|
||||||
new SourceNode(5, 6, "c.js", "quatro")
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
|
|
||||||
node.walk(function (code, loc) { console.log("WALK:", code, loc); })
|
|
||||||
// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }
|
|
||||||
// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }
|
|
||||||
// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }
|
|
||||||
// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.walkSourceContents(fn)
|
|
||||||
|
|
||||||
Walk over the tree of SourceNodes. The walking function is called for each
|
|
||||||
source file content and is passed the filename and source content.
|
|
||||||
|
|
||||||
* `fn`: The traversal function.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var a = new SourceNode(1, 2, "a.js", "generated from a");
|
|
||||||
a.setSourceContent("a.js", "original a");
|
|
||||||
var b = new SourceNode(1, 2, "b.js", "generated from b");
|
|
||||||
b.setSourceContent("b.js", "original b");
|
|
||||||
var c = new SourceNode(1, 2, "c.js", "generated from c");
|
|
||||||
c.setSourceContent("c.js", "original c");
|
|
||||||
|
|
||||||
var node = new SourceNode(null, null, null, [a, b, c]);
|
|
||||||
node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); })
|
|
||||||
// WALK: a.js : original a
|
|
||||||
// WALK: b.js : original b
|
|
||||||
// WALK: c.js : original c
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.join(sep)
|
|
||||||
|
|
||||||
Like `Array.prototype.join` except for SourceNodes. Inserts the separator
|
|
||||||
between each of this source node's children.
|
|
||||||
|
|
||||||
* `sep`: The separator.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var lhs = new SourceNode(1, 2, "a.rs", "my_copy");
|
|
||||||
var operand = new SourceNode(3, 4, "a.rs", "=");
|
|
||||||
var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()");
|
|
||||||
|
|
||||||
var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);
|
|
||||||
var joinedNode = node.join(" ");
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.replaceRight(pattern, replacement)
|
|
||||||
|
|
||||||
Call `String.prototype.replace` on the very right-most source snippet. Useful
|
|
||||||
for trimming white space from the end of a source node, etc.
|
|
||||||
|
|
||||||
* `pattern`: The pattern to replace.
|
|
||||||
|
|
||||||
* `replacement`: The thing to replace the pattern with.
|
|
||||||
|
|
||||||
```js
|
|
||||||
// Trim trailing white space.
|
|
||||||
node.replaceRight(/\s*$/, "");
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.toString()
|
|
||||||
|
|
||||||
Return the string representation of this source node. Walks over the tree and
|
|
||||||
concatenates all the various snippets together to one string.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var node = new SourceNode(1, 2, "a.js", [
|
|
||||||
new SourceNode(3, 4, "b.js", "uno"),
|
|
||||||
"dos",
|
|
||||||
[
|
|
||||||
"tres",
|
|
||||||
new SourceNode(5, 6, "c.js", "quatro")
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
|
|
||||||
node.toString()
|
|
||||||
// 'unodostresquatro'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])
|
|
||||||
|
|
||||||
Returns the string representation of this tree of source nodes, plus a
|
|
||||||
SourceMapGenerator which contains all the mappings between the generated and
|
|
||||||
original sources.
|
|
||||||
|
|
||||||
The arguments are the same as those to `new SourceMapGenerator`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var node = new SourceNode(1, 2, "a.js", [
|
|
||||||
new SourceNode(3, 4, "b.js", "uno"),
|
|
||||||
"dos",
|
|
||||||
[
|
|
||||||
"tres",
|
|
||||||
new SourceNode(5, 6, "c.js", "quatro")
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
|
|
||||||
node.toStringWithSourceMap({ file: "my-output-file.js" })
|
|
||||||
// { code: 'unodostresquatro',
|
|
||||||
// map: [object SourceMapGenerator] }
|
|
||||||
```
|
|
3234
node_modules/source-map/dist/source-map.debug.js
generated
vendored
3234
node_modules/source-map/dist/source-map.debug.js
generated
vendored
File diff suppressed because one or more lines are too long
3233
node_modules/source-map/dist/source-map.js
generated
vendored
3233
node_modules/source-map/dist/source-map.js
generated
vendored
File diff suppressed because it is too large
Load diff
2
node_modules/source-map/dist/source-map.min.js
generated
vendored
2
node_modules/source-map/dist/source-map.min.js
generated
vendored
File diff suppressed because one or more lines are too long
1
node_modules/source-map/dist/source-map.min.js.map
generated
vendored
1
node_modules/source-map/dist/source-map.min.js.map
generated
vendored
File diff suppressed because one or more lines are too long
121
node_modules/source-map/lib/array-set.js
generated
vendored
121
node_modules/source-map/lib/array-set.js
generated
vendored
|
@ -1,121 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
var util = require('./util');
|
|
||||||
var has = Object.prototype.hasOwnProperty;
|
|
||||||
var hasNativeMap = typeof Map !== "undefined";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A data structure which is a combination of an array and a set. Adding a new
|
|
||||||
* member is O(1), testing for membership is O(1), and finding the index of an
|
|
||||||
* element is O(1). Removing elements from the set is not supported. Only
|
|
||||||
* strings are supported for membership.
|
|
||||||
*/
|
|
||||||
function ArraySet() {
|
|
||||||
this._array = [];
|
|
||||||
this._set = hasNativeMap ? new Map() : Object.create(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Static method for creating ArraySet instances from an existing array.
|
|
||||||
*/
|
|
||||||
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
|
|
||||||
var set = new ArraySet();
|
|
||||||
for (var i = 0, len = aArray.length; i < len; i++) {
|
|
||||||
set.add(aArray[i], aAllowDuplicates);
|
|
||||||
}
|
|
||||||
return set;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return how many unique items are in this ArraySet. If duplicates have been
|
|
||||||
* added, than those do not count towards the size.
|
|
||||||
*
|
|
||||||
* @returns Number
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.size = function ArraySet_size() {
|
|
||||||
return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the given string to this set.
|
|
||||||
*
|
|
||||||
* @param String aStr
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
|
|
||||||
var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
|
|
||||||
var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
|
|
||||||
var idx = this._array.length;
|
|
||||||
if (!isDuplicate || aAllowDuplicates) {
|
|
||||||
this._array.push(aStr);
|
|
||||||
}
|
|
||||||
if (!isDuplicate) {
|
|
||||||
if (hasNativeMap) {
|
|
||||||
this._set.set(aStr, idx);
|
|
||||||
} else {
|
|
||||||
this._set[sStr] = idx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is the given string a member of this set?
|
|
||||||
*
|
|
||||||
* @param String aStr
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.has = function ArraySet_has(aStr) {
|
|
||||||
if (hasNativeMap) {
|
|
||||||
return this._set.has(aStr);
|
|
||||||
} else {
|
|
||||||
var sStr = util.toSetString(aStr);
|
|
||||||
return has.call(this._set, sStr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* What is the index of the given string in the array?
|
|
||||||
*
|
|
||||||
* @param String aStr
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
|
|
||||||
if (hasNativeMap) {
|
|
||||||
var idx = this._set.get(aStr);
|
|
||||||
if (idx >= 0) {
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var sStr = util.toSetString(aStr);
|
|
||||||
if (has.call(this._set, sStr)) {
|
|
||||||
return this._set[sStr];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error('"' + aStr + '" is not in the set.');
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* What is the element at the given index?
|
|
||||||
*
|
|
||||||
* @param Number aIdx
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.at = function ArraySet_at(aIdx) {
|
|
||||||
if (aIdx >= 0 && aIdx < this._array.length) {
|
|
||||||
return this._array[aIdx];
|
|
||||||
}
|
|
||||||
throw new Error('No element indexed by ' + aIdx);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the array representation of this set (which has the proper indices
|
|
||||||
* indicated by indexOf). Note that this is a copy of the internal array used
|
|
||||||
* for storing the members so that no one can mess with internal state.
|
|
||||||
*/
|
|
||||||
ArraySet.prototype.toArray = function ArraySet_toArray() {
|
|
||||||
return this._array.slice();
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.ArraySet = ArraySet;
|
|
140
node_modules/source-map/lib/base64-vlq.js
generated
vendored
140
node_modules/source-map/lib/base64-vlq.js
generated
vendored
|
@ -1,140 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*
|
|
||||||
* Based on the Base 64 VLQ implementation in Closure Compiler:
|
|
||||||
* https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
|
|
||||||
*
|
|
||||||
* Copyright 2011 The Closure Compiler Authors. All rights reserved.
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following
|
|
||||||
* disclaimer in the documentation and/or other materials provided
|
|
||||||
* with the distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived
|
|
||||||
* from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var base64 = require('./base64');
|
|
||||||
|
|
||||||
// A single base 64 digit can contain 6 bits of data. For the base 64 variable
|
|
||||||
// length quantities we use in the source map spec, the first bit is the sign,
|
|
||||||
// the next four bits are the actual value, and the 6th bit is the
|
|
||||||
// continuation bit. The continuation bit tells us whether there are more
|
|
||||||
// digits in this value following this digit.
|
|
||||||
//
|
|
||||||
// Continuation
|
|
||||||
// | Sign
|
|
||||||
// | |
|
|
||||||
// V V
|
|
||||||
// 101011
|
|
||||||
|
|
||||||
var VLQ_BASE_SHIFT = 5;
|
|
||||||
|
|
||||||
// binary: 100000
|
|
||||||
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
|
|
||||||
|
|
||||||
// binary: 011111
|
|
||||||
var VLQ_BASE_MASK = VLQ_BASE - 1;
|
|
||||||
|
|
||||||
// binary: 100000
|
|
||||||
var VLQ_CONTINUATION_BIT = VLQ_BASE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts from a two-complement value to a value where the sign bit is
|
|
||||||
* placed in the least significant bit. For example, as decimals:
|
|
||||||
* 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
|
|
||||||
* 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
|
|
||||||
*/
|
|
||||||
function toVLQSigned(aValue) {
|
|
||||||
return aValue < 0
|
|
||||||
? ((-aValue) << 1) + 1
|
|
||||||
: (aValue << 1) + 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts to a two-complement value from a value where the sign bit is
|
|
||||||
* placed in the least significant bit. For example, as decimals:
|
|
||||||
* 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
|
|
||||||
* 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
|
|
||||||
*/
|
|
||||||
function fromVLQSigned(aValue) {
|
|
||||||
var isNegative = (aValue & 1) === 1;
|
|
||||||
var shifted = aValue >> 1;
|
|
||||||
return isNegative
|
|
||||||
? -shifted
|
|
||||||
: shifted;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the base 64 VLQ encoded value.
|
|
||||||
*/
|
|
||||||
exports.encode = function base64VLQ_encode(aValue) {
|
|
||||||
var encoded = "";
|
|
||||||
var digit;
|
|
||||||
|
|
||||||
var vlq = toVLQSigned(aValue);
|
|
||||||
|
|
||||||
do {
|
|
||||||
digit = vlq & VLQ_BASE_MASK;
|
|
||||||
vlq >>>= VLQ_BASE_SHIFT;
|
|
||||||
if (vlq > 0) {
|
|
||||||
// There are still more digits in this value, so we must make sure the
|
|
||||||
// continuation bit is marked.
|
|
||||||
digit |= VLQ_CONTINUATION_BIT;
|
|
||||||
}
|
|
||||||
encoded += base64.encode(digit);
|
|
||||||
} while (vlq > 0);
|
|
||||||
|
|
||||||
return encoded;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decodes the next base 64 VLQ value from the given string and returns the
|
|
||||||
* value and the rest of the string via the out parameter.
|
|
||||||
*/
|
|
||||||
exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
|
|
||||||
var strLen = aStr.length;
|
|
||||||
var result = 0;
|
|
||||||
var shift = 0;
|
|
||||||
var continuation, digit;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (aIndex >= strLen) {
|
|
||||||
throw new Error("Expected more digits in base 64 VLQ value.");
|
|
||||||
}
|
|
||||||
|
|
||||||
digit = base64.decode(aStr.charCodeAt(aIndex++));
|
|
||||||
if (digit === -1) {
|
|
||||||
throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
continuation = !!(digit & VLQ_CONTINUATION_BIT);
|
|
||||||
digit &= VLQ_BASE_MASK;
|
|
||||||
result = result + (digit << shift);
|
|
||||||
shift += VLQ_BASE_SHIFT;
|
|
||||||
} while (continuation);
|
|
||||||
|
|
||||||
aOutParam.value = fromVLQSigned(result);
|
|
||||||
aOutParam.rest = aIndex;
|
|
||||||
};
|
|
67
node_modules/source-map/lib/base64.js
generated
vendored
67
node_modules/source-map/lib/base64.js
generated
vendored
|
@ -1,67 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode an integer in the range of 0 to 63 to a single base 64 digit.
|
|
||||||
*/
|
|
||||||
exports.encode = function (number) {
|
|
||||||
if (0 <= number && number < intToCharMap.length) {
|
|
||||||
return intToCharMap[number];
|
|
||||||
}
|
|
||||||
throw new TypeError("Must be between 0 and 63: " + number);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a single base 64 character code digit to an integer. Returns -1 on
|
|
||||||
* failure.
|
|
||||||
*/
|
|
||||||
exports.decode = function (charCode) {
|
|
||||||
var bigA = 65; // 'A'
|
|
||||||
var bigZ = 90; // 'Z'
|
|
||||||
|
|
||||||
var littleA = 97; // 'a'
|
|
||||||
var littleZ = 122; // 'z'
|
|
||||||
|
|
||||||
var zero = 48; // '0'
|
|
||||||
var nine = 57; // '9'
|
|
||||||
|
|
||||||
var plus = 43; // '+'
|
|
||||||
var slash = 47; // '/'
|
|
||||||
|
|
||||||
var littleOffset = 26;
|
|
||||||
var numberOffset = 52;
|
|
||||||
|
|
||||||
// 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
if (bigA <= charCode && charCode <= bigZ) {
|
|
||||||
return (charCode - bigA);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 26 - 51: abcdefghijklmnopqrstuvwxyz
|
|
||||||
if (littleA <= charCode && charCode <= littleZ) {
|
|
||||||
return (charCode - littleA + littleOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 52 - 61: 0123456789
|
|
||||||
if (zero <= charCode && charCode <= nine) {
|
|
||||||
return (charCode - zero + numberOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 62: +
|
|
||||||
if (charCode == plus) {
|
|
||||||
return 62;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 63: /
|
|
||||||
if (charCode == slash) {
|
|
||||||
return 63;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invalid base64 digit.
|
|
||||||
return -1;
|
|
||||||
};
|
|
111
node_modules/source-map/lib/binary-search.js
generated
vendored
111
node_modules/source-map/lib/binary-search.js
generated
vendored
|
@ -1,111 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.GREATEST_LOWER_BOUND = 1;
|
|
||||||
exports.LEAST_UPPER_BOUND = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursive implementation of binary search.
|
|
||||||
*
|
|
||||||
* @param aLow Indices here and lower do not contain the needle.
|
|
||||||
* @param aHigh Indices here and higher do not contain the needle.
|
|
||||||
* @param aNeedle The element being searched for.
|
|
||||||
* @param aHaystack The non-empty array being searched.
|
|
||||||
* @param aCompare Function which takes two elements and returns -1, 0, or 1.
|
|
||||||
* @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
|
|
||||||
* 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
|
|
||||||
* closest element that is smaller than or greater than the one we are
|
|
||||||
* searching for, respectively, if the exact element cannot be found.
|
|
||||||
*/
|
|
||||||
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
|
|
||||||
// This function terminates when one of the following is true:
|
|
||||||
//
|
|
||||||
// 1. We find the exact element we are looking for.
|
|
||||||
//
|
|
||||||
// 2. We did not find the exact element, but we can return the index of
|
|
||||||
// the next-closest element.
|
|
||||||
//
|
|
||||||
// 3. We did not find the exact element, and there is no next-closest
|
|
||||||
// element than the one we are searching for, so we return -1.
|
|
||||||
var mid = Math.floor((aHigh - aLow) / 2) + aLow;
|
|
||||||
var cmp = aCompare(aNeedle, aHaystack[mid], true);
|
|
||||||
if (cmp === 0) {
|
|
||||||
// Found the element we are looking for.
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
else if (cmp > 0) {
|
|
||||||
// Our needle is greater than aHaystack[mid].
|
|
||||||
if (aHigh - mid > 1) {
|
|
||||||
// The element is in the upper half.
|
|
||||||
return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
|
|
||||||
}
|
|
||||||
|
|
||||||
// The exact needle element was not found in this haystack. Determine if
|
|
||||||
// we are in termination case (3) or (2) and return the appropriate thing.
|
|
||||||
if (aBias == exports.LEAST_UPPER_BOUND) {
|
|
||||||
return aHigh < aHaystack.length ? aHigh : -1;
|
|
||||||
} else {
|
|
||||||
return mid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Our needle is less than aHaystack[mid].
|
|
||||||
if (mid - aLow > 1) {
|
|
||||||
// The element is in the lower half.
|
|
||||||
return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
|
|
||||||
}
|
|
||||||
|
|
||||||
// we are in termination case (3) or (2) and return the appropriate thing.
|
|
||||||
if (aBias == exports.LEAST_UPPER_BOUND) {
|
|
||||||
return mid;
|
|
||||||
} else {
|
|
||||||
return aLow < 0 ? -1 : aLow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is an implementation of binary search which will always try and return
|
|
||||||
* the index of the closest element if there is no exact hit. This is because
|
|
||||||
* mappings between original and generated line/col pairs are single points,
|
|
||||||
* and there is an implicit region between each of them, so a miss just means
|
|
||||||
* that you aren't on the very start of a region.
|
|
||||||
*
|
|
||||||
* @param aNeedle The element you are looking for.
|
|
||||||
* @param aHaystack The array that is being searched.
|
|
||||||
* @param aCompare A function which takes the needle and an element in the
|
|
||||||
* array and returns -1, 0, or 1 depending on whether the needle is less
|
|
||||||
* than, equal to, or greater than the element, respectively.
|
|
||||||
* @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
|
|
||||||
* 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
|
|
||||||
* closest element that is smaller than or greater than the one we are
|
|
||||||
* searching for, respectively, if the exact element cannot be found.
|
|
||||||
* Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
|
|
||||||
*/
|
|
||||||
exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
|
|
||||||
if (aHaystack.length === 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
|
|
||||||
aCompare, aBias || exports.GREATEST_LOWER_BOUND);
|
|
||||||
if (index < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We have found either the exact element, or the next-closest element than
|
|
||||||
// the one we are searching for. However, there may be more than one such
|
|
||||||
// element. Make sure we always return the smallest of these.
|
|
||||||
while (index - 1 >= 0) {
|
|
||||||
if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--index;
|
|
||||||
}
|
|
||||||
|
|
||||||
return index;
|
|
||||||
};
|
|
79
node_modules/source-map/lib/mapping-list.js
generated
vendored
79
node_modules/source-map/lib/mapping-list.js
generated
vendored
|
@ -1,79 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2014 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
var util = require('./util');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine whether mappingB is after mappingA with respect to generated
|
|
||||||
* position.
|
|
||||||
*/
|
|
||||||
function generatedPositionAfter(mappingA, mappingB) {
|
|
||||||
// Optimized for most common case
|
|
||||||
var lineA = mappingA.generatedLine;
|
|
||||||
var lineB = mappingB.generatedLine;
|
|
||||||
var columnA = mappingA.generatedColumn;
|
|
||||||
var columnB = mappingB.generatedColumn;
|
|
||||||
return lineB > lineA || lineB == lineA && columnB >= columnA ||
|
|
||||||
util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A data structure to provide a sorted view of accumulated mappings in a
|
|
||||||
* performance conscious manner. It trades a neglibable overhead in general
|
|
||||||
* case for a large speedup in case of mappings being added in order.
|
|
||||||
*/
|
|
||||||
function MappingList() {
|
|
||||||
this._array = [];
|
|
||||||
this._sorted = true;
|
|
||||||
// Serves as infimum
|
|
||||||
this._last = {generatedLine: -1, generatedColumn: 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterate through internal items. This method takes the same arguments that
|
|
||||||
* `Array.prototype.forEach` takes.
|
|
||||||
*
|
|
||||||
* NOTE: The order of the mappings is NOT guaranteed.
|
|
||||||
*/
|
|
||||||
MappingList.prototype.unsortedForEach =
|
|
||||||
function MappingList_forEach(aCallback, aThisArg) {
|
|
||||||
this._array.forEach(aCallback, aThisArg);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the given source mapping.
|
|
||||||
*
|
|
||||||
* @param Object aMapping
|
|
||||||
*/
|
|
||||||
MappingList.prototype.add = function MappingList_add(aMapping) {
|
|
||||||
if (generatedPositionAfter(this._last, aMapping)) {
|
|
||||||
this._last = aMapping;
|
|
||||||
this._array.push(aMapping);
|
|
||||||
} else {
|
|
||||||
this._sorted = false;
|
|
||||||
this._array.push(aMapping);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the flat, sorted array of mappings. The mappings are sorted by
|
|
||||||
* generated position.
|
|
||||||
*
|
|
||||||
* WARNING: This method returns internal data without copying, for
|
|
||||||
* performance. The return value must NOT be mutated, and should be treated as
|
|
||||||
* an immutable borrow. If you want to take ownership, you must make your own
|
|
||||||
* copy.
|
|
||||||
*/
|
|
||||||
MappingList.prototype.toArray = function MappingList_toArray() {
|
|
||||||
if (!this._sorted) {
|
|
||||||
this._array.sort(util.compareByGeneratedPositionsInflated);
|
|
||||||
this._sorted = true;
|
|
||||||
}
|
|
||||||
return this._array;
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.MappingList = MappingList;
|
|
114
node_modules/source-map/lib/quick-sort.js
generated
vendored
114
node_modules/source-map/lib/quick-sort.js
generated
vendored
|
@ -1,114 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// It turns out that some (most?) JavaScript engines don't self-host
|
|
||||||
// `Array.prototype.sort`. This makes sense because C++ will likely remain
|
|
||||||
// faster than JS when doing raw CPU-intensive sorting. However, when using a
|
|
||||||
// custom comparator function, calling back and forth between the VM's C++ and
|
|
||||||
// JIT'd JS is rather slow *and* loses JIT type information, resulting in
|
|
||||||
// worse generated code for the comparator function than would be optimal. In
|
|
||||||
// fact, when sorting with a comparator, these costs outweigh the benefits of
|
|
||||||
// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
|
|
||||||
// a ~3500ms mean speed-up in `bench/bench.html`.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Swap the elements indexed by `x` and `y` in the array `ary`.
|
|
||||||
*
|
|
||||||
* @param {Array} ary
|
|
||||||
* The array.
|
|
||||||
* @param {Number} x
|
|
||||||
* The index of the first item.
|
|
||||||
* @param {Number} y
|
|
||||||
* The index of the second item.
|
|
||||||
*/
|
|
||||||
function swap(ary, x, y) {
|
|
||||||
var temp = ary[x];
|
|
||||||
ary[x] = ary[y];
|
|
||||||
ary[y] = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a random integer within the range `low .. high` inclusive.
|
|
||||||
*
|
|
||||||
* @param {Number} low
|
|
||||||
* The lower bound on the range.
|
|
||||||
* @param {Number} high
|
|
||||||
* The upper bound on the range.
|
|
||||||
*/
|
|
||||||
function randomIntInRange(low, high) {
|
|
||||||
return Math.round(low + (Math.random() * (high - low)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Quick Sort algorithm.
|
|
||||||
*
|
|
||||||
* @param {Array} ary
|
|
||||||
* An array to sort.
|
|
||||||
* @param {function} comparator
|
|
||||||
* Function to use to compare two items.
|
|
||||||
* @param {Number} p
|
|
||||||
* Start index of the array
|
|
||||||
* @param {Number} r
|
|
||||||
* End index of the array
|
|
||||||
*/
|
|
||||||
function doQuickSort(ary, comparator, p, r) {
|
|
||||||
// If our lower bound is less than our upper bound, we (1) partition the
|
|
||||||
// array into two pieces and (2) recurse on each half. If it is not, this is
|
|
||||||
// the empty array and our base case.
|
|
||||||
|
|
||||||
if (p < r) {
|
|
||||||
// (1) Partitioning.
|
|
||||||
//
|
|
||||||
// The partitioning chooses a pivot between `p` and `r` and moves all
|
|
||||||
// elements that are less than or equal to the pivot to the before it, and
|
|
||||||
// all the elements that are greater than it after it. The effect is that
|
|
||||||
// once partition is done, the pivot is in the exact place it will be when
|
|
||||||
// the array is put in sorted order, and it will not need to be moved
|
|
||||||
// again. This runs in O(n) time.
|
|
||||||
|
|
||||||
// Always choose a random pivot so that an input array which is reverse
|
|
||||||
// sorted does not cause O(n^2) running time.
|
|
||||||
var pivotIndex = randomIntInRange(p, r);
|
|
||||||
var i = p - 1;
|
|
||||||
|
|
||||||
swap(ary, pivotIndex, r);
|
|
||||||
var pivot = ary[r];
|
|
||||||
|
|
||||||
// Immediately after `j` is incremented in this loop, the following hold
|
|
||||||
// true:
|
|
||||||
//
|
|
||||||
// * Every element in `ary[p .. i]` is less than or equal to the pivot.
|
|
||||||
//
|
|
||||||
// * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
|
|
||||||
for (var j = p; j < r; j++) {
|
|
||||||
if (comparator(ary[j], pivot) <= 0) {
|
|
||||||
i += 1;
|
|
||||||
swap(ary, i, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
swap(ary, i + 1, j);
|
|
||||||
var q = i + 1;
|
|
||||||
|
|
||||||
// (2) Recurse on each half.
|
|
||||||
|
|
||||||
doQuickSort(ary, comparator, p, q - 1);
|
|
||||||
doQuickSort(ary, comparator, q + 1, r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sort the given array in-place with the given comparator function.
|
|
||||||
*
|
|
||||||
* @param {Array} ary
|
|
||||||
* An array to sort.
|
|
||||||
* @param {function} comparator
|
|
||||||
* Function to use to compare two items.
|
|
||||||
*/
|
|
||||||
exports.quickSort = function (ary, comparator) {
|
|
||||||
doQuickSort(ary, comparator, 0, ary.length - 1);
|
|
||||||
};
|
|
1145
node_modules/source-map/lib/source-map-consumer.js
generated
vendored
1145
node_modules/source-map/lib/source-map-consumer.js
generated
vendored
File diff suppressed because it is too large
Load diff
425
node_modules/source-map/lib/source-map-generator.js
generated
vendored
425
node_modules/source-map/lib/source-map-generator.js
generated
vendored
|
@ -1,425 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
var base64VLQ = require('./base64-vlq');
|
|
||||||
var util = require('./util');
|
|
||||||
var ArraySet = require('./array-set').ArraySet;
|
|
||||||
var MappingList = require('./mapping-list').MappingList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An instance of the SourceMapGenerator represents a source map which is
|
|
||||||
* being built incrementally. You may pass an object with the following
|
|
||||||
* properties:
|
|
||||||
*
|
|
||||||
* - file: The filename of the generated source.
|
|
||||||
* - sourceRoot: A root for all relative URLs in this source map.
|
|
||||||
*/
|
|
||||||
function SourceMapGenerator(aArgs) {
|
|
||||||
if (!aArgs) {
|
|
||||||
aArgs = {};
|
|
||||||
}
|
|
||||||
this._file = util.getArg(aArgs, 'file', null);
|
|
||||||
this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
|
|
||||||
this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
|
|
||||||
this._sources = new ArraySet();
|
|
||||||
this._names = new ArraySet();
|
|
||||||
this._mappings = new MappingList();
|
|
||||||
this._sourcesContents = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceMapGenerator.prototype._version = 3;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new SourceMapGenerator based on a SourceMapConsumer
|
|
||||||
*
|
|
||||||
* @param aSourceMapConsumer The SourceMap.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.fromSourceMap =
|
|
||||||
function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
|
|
||||||
var sourceRoot = aSourceMapConsumer.sourceRoot;
|
|
||||||
var generator = new SourceMapGenerator({
|
|
||||||
file: aSourceMapConsumer.file,
|
|
||||||
sourceRoot: sourceRoot
|
|
||||||
});
|
|
||||||
aSourceMapConsumer.eachMapping(function (mapping) {
|
|
||||||
var newMapping = {
|
|
||||||
generated: {
|
|
||||||
line: mapping.generatedLine,
|
|
||||||
column: mapping.generatedColumn
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mapping.source != null) {
|
|
||||||
newMapping.source = mapping.source;
|
|
||||||
if (sourceRoot != null) {
|
|
||||||
newMapping.source = util.relative(sourceRoot, newMapping.source);
|
|
||||||
}
|
|
||||||
|
|
||||||
newMapping.original = {
|
|
||||||
line: mapping.originalLine,
|
|
||||||
column: mapping.originalColumn
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mapping.name != null) {
|
|
||||||
newMapping.name = mapping.name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
generator.addMapping(newMapping);
|
|
||||||
});
|
|
||||||
aSourceMapConsumer.sources.forEach(function (sourceFile) {
|
|
||||||
var sourceRelative = sourceFile;
|
|
||||||
if (sourceRoot !== null) {
|
|
||||||
sourceRelative = util.relative(sourceRoot, sourceFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!generator._sources.has(sourceRelative)) {
|
|
||||||
generator._sources.add(sourceRelative);
|
|
||||||
}
|
|
||||||
|
|
||||||
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
|
|
||||||
if (content != null) {
|
|
||||||
generator.setSourceContent(sourceFile, content);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return generator;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a single mapping from original source line and column to the generated
|
|
||||||
* source's line and column for this source map being created. The mapping
|
|
||||||
* object should have the following properties:
|
|
||||||
*
|
|
||||||
* - generated: An object with the generated line and column positions.
|
|
||||||
* - original: An object with the original line and column positions.
|
|
||||||
* - source: The original source file (relative to the sourceRoot).
|
|
||||||
* - name: An optional original token name for this mapping.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype.addMapping =
|
|
||||||
function SourceMapGenerator_addMapping(aArgs) {
|
|
||||||
var generated = util.getArg(aArgs, 'generated');
|
|
||||||
var original = util.getArg(aArgs, 'original', null);
|
|
||||||
var source = util.getArg(aArgs, 'source', null);
|
|
||||||
var name = util.getArg(aArgs, 'name', null);
|
|
||||||
|
|
||||||
if (!this._skipValidation) {
|
|
||||||
this._validateMapping(generated, original, source, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (source != null) {
|
|
||||||
source = String(source);
|
|
||||||
if (!this._sources.has(source)) {
|
|
||||||
this._sources.add(source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name != null) {
|
|
||||||
name = String(name);
|
|
||||||
if (!this._names.has(name)) {
|
|
||||||
this._names.add(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._mappings.add({
|
|
||||||
generatedLine: generated.line,
|
|
||||||
generatedColumn: generated.column,
|
|
||||||
originalLine: original != null && original.line,
|
|
||||||
originalColumn: original != null && original.column,
|
|
||||||
source: source,
|
|
||||||
name: name
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the source content for a source file.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype.setSourceContent =
|
|
||||||
function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
|
|
||||||
var source = aSourceFile;
|
|
||||||
if (this._sourceRoot != null) {
|
|
||||||
source = util.relative(this._sourceRoot, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aSourceContent != null) {
|
|
||||||
// Add the source content to the _sourcesContents map.
|
|
||||||
// Create a new _sourcesContents map if the property is null.
|
|
||||||
if (!this._sourcesContents) {
|
|
||||||
this._sourcesContents = Object.create(null);
|
|
||||||
}
|
|
||||||
this._sourcesContents[util.toSetString(source)] = aSourceContent;
|
|
||||||
} else if (this._sourcesContents) {
|
|
||||||
// Remove the source file from the _sourcesContents map.
|
|
||||||
// If the _sourcesContents map is empty, set the property to null.
|
|
||||||
delete this._sourcesContents[util.toSetString(source)];
|
|
||||||
if (Object.keys(this._sourcesContents).length === 0) {
|
|
||||||
this._sourcesContents = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the mappings of a sub-source-map for a specific source file to the
|
|
||||||
* source map being generated. Each mapping to the supplied source file is
|
|
||||||
* rewritten using the supplied source map. Note: The resolution for the
|
|
||||||
* resulting mappings is the minimium of this map and the supplied map.
|
|
||||||
*
|
|
||||||
* @param aSourceMapConsumer The source map to be applied.
|
|
||||||
* @param aSourceFile Optional. The filename of the source file.
|
|
||||||
* If omitted, SourceMapConsumer's file property will be used.
|
|
||||||
* @param aSourceMapPath Optional. The dirname of the path to the source map
|
|
||||||
* to be applied. If relative, it is relative to the SourceMapConsumer.
|
|
||||||
* This parameter is needed when the two source maps aren't in the same
|
|
||||||
* directory, and the source map to be applied contains relative source
|
|
||||||
* paths. If so, those relative source paths need to be rewritten
|
|
||||||
* relative to the SourceMapGenerator.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype.applySourceMap =
|
|
||||||
function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
|
|
||||||
var sourceFile = aSourceFile;
|
|
||||||
// If aSourceFile is omitted, we will use the file property of the SourceMap
|
|
||||||
if (aSourceFile == null) {
|
|
||||||
if (aSourceMapConsumer.file == null) {
|
|
||||||
throw new Error(
|
|
||||||
'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
|
|
||||||
'or the source map\'s "file" property. Both were omitted.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
sourceFile = aSourceMapConsumer.file;
|
|
||||||
}
|
|
||||||
var sourceRoot = this._sourceRoot;
|
|
||||||
// Make "sourceFile" relative if an absolute Url is passed.
|
|
||||||
if (sourceRoot != null) {
|
|
||||||
sourceFile = util.relative(sourceRoot, sourceFile);
|
|
||||||
}
|
|
||||||
// Applying the SourceMap can add and remove items from the sources and
|
|
||||||
// the names array.
|
|
||||||
var newSources = new ArraySet();
|
|
||||||
var newNames = new ArraySet();
|
|
||||||
|
|
||||||
// Find mappings for the "sourceFile"
|
|
||||||
this._mappings.unsortedForEach(function (mapping) {
|
|
||||||
if (mapping.source === sourceFile && mapping.originalLine != null) {
|
|
||||||
// Check if it can be mapped by the source map, then update the mapping.
|
|
||||||
var original = aSourceMapConsumer.originalPositionFor({
|
|
||||||
line: mapping.originalLine,
|
|
||||||
column: mapping.originalColumn
|
|
||||||
});
|
|
||||||
if (original.source != null) {
|
|
||||||
// Copy mapping
|
|
||||||
mapping.source = original.source;
|
|
||||||
if (aSourceMapPath != null) {
|
|
||||||
mapping.source = util.join(aSourceMapPath, mapping.source)
|
|
||||||
}
|
|
||||||
if (sourceRoot != null) {
|
|
||||||
mapping.source = util.relative(sourceRoot, mapping.source);
|
|
||||||
}
|
|
||||||
mapping.originalLine = original.line;
|
|
||||||
mapping.originalColumn = original.column;
|
|
||||||
if (original.name != null) {
|
|
||||||
mapping.name = original.name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var source = mapping.source;
|
|
||||||
if (source != null && !newSources.has(source)) {
|
|
||||||
newSources.add(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
var name = mapping.name;
|
|
||||||
if (name != null && !newNames.has(name)) {
|
|
||||||
newNames.add(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
}, this);
|
|
||||||
this._sources = newSources;
|
|
||||||
this._names = newNames;
|
|
||||||
|
|
||||||
// Copy sourcesContents of applied map.
|
|
||||||
aSourceMapConsumer.sources.forEach(function (sourceFile) {
|
|
||||||
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
|
|
||||||
if (content != null) {
|
|
||||||
if (aSourceMapPath != null) {
|
|
||||||
sourceFile = util.join(aSourceMapPath, sourceFile);
|
|
||||||
}
|
|
||||||
if (sourceRoot != null) {
|
|
||||||
sourceFile = util.relative(sourceRoot, sourceFile);
|
|
||||||
}
|
|
||||||
this.setSourceContent(sourceFile, content);
|
|
||||||
}
|
|
||||||
}, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A mapping can have one of the three levels of data:
|
|
||||||
*
|
|
||||||
* 1. Just the generated position.
|
|
||||||
* 2. The Generated position, original position, and original source.
|
|
||||||
* 3. Generated and original position, original source, as well as a name
|
|
||||||
* token.
|
|
||||||
*
|
|
||||||
* To maintain consistency, we validate that any new mapping being added falls
|
|
||||||
* in to one of these categories.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype._validateMapping =
|
|
||||||
function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
|
|
||||||
aName) {
|
|
||||||
// When aOriginal is truthy but has empty values for .line and .column,
|
|
||||||
// it is most likely a programmer error. In this case we throw a very
|
|
||||||
// specific error message to try to guide them the right way.
|
|
||||||
// For example: https://github.com/Polymer/polymer-bundler/pull/519
|
|
||||||
if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
|
|
||||||
throw new Error(
|
|
||||||
'original.line and original.column are not numbers -- you probably meant to omit ' +
|
|
||||||
'the original mapping entirely and only map the generated position. If so, pass ' +
|
|
||||||
'null for the original mapping instead of an object with empty or null values.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
|
|
||||||
&& aGenerated.line > 0 && aGenerated.column >= 0
|
|
||||||
&& !aOriginal && !aSource && !aName) {
|
|
||||||
// Case 1.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
|
|
||||||
&& aOriginal && 'line' in aOriginal && 'column' in aOriginal
|
|
||||||
&& aGenerated.line > 0 && aGenerated.column >= 0
|
|
||||||
&& aOriginal.line > 0 && aOriginal.column >= 0
|
|
||||||
&& aSource) {
|
|
||||||
// Cases 2 and 3.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error('Invalid mapping: ' + JSON.stringify({
|
|
||||||
generated: aGenerated,
|
|
||||||
source: aSource,
|
|
||||||
original: aOriginal,
|
|
||||||
name: aName
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize the accumulated mappings in to the stream of base 64 VLQs
|
|
||||||
* specified by the source map format.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype._serializeMappings =
|
|
||||||
function SourceMapGenerator_serializeMappings() {
|
|
||||||
var previousGeneratedColumn = 0;
|
|
||||||
var previousGeneratedLine = 1;
|
|
||||||
var previousOriginalColumn = 0;
|
|
||||||
var previousOriginalLine = 0;
|
|
||||||
var previousName = 0;
|
|
||||||
var previousSource = 0;
|
|
||||||
var result = '';
|
|
||||||
var next;
|
|
||||||
var mapping;
|
|
||||||
var nameIdx;
|
|
||||||
var sourceIdx;
|
|
||||||
|
|
||||||
var mappings = this._mappings.toArray();
|
|
||||||
for (var i = 0, len = mappings.length; i < len; i++) {
|
|
||||||
mapping = mappings[i];
|
|
||||||
next = ''
|
|
||||||
|
|
||||||
if (mapping.generatedLine !== previousGeneratedLine) {
|
|
||||||
previousGeneratedColumn = 0;
|
|
||||||
while (mapping.generatedLine !== previousGeneratedLine) {
|
|
||||||
next += ';';
|
|
||||||
previousGeneratedLine++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (i > 0) {
|
|
||||||
if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
next += ',';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next += base64VLQ.encode(mapping.generatedColumn
|
|
||||||
- previousGeneratedColumn);
|
|
||||||
previousGeneratedColumn = mapping.generatedColumn;
|
|
||||||
|
|
||||||
if (mapping.source != null) {
|
|
||||||
sourceIdx = this._sources.indexOf(mapping.source);
|
|
||||||
next += base64VLQ.encode(sourceIdx - previousSource);
|
|
||||||
previousSource = sourceIdx;
|
|
||||||
|
|
||||||
// lines are stored 0-based in SourceMap spec version 3
|
|
||||||
next += base64VLQ.encode(mapping.originalLine - 1
|
|
||||||
- previousOriginalLine);
|
|
||||||
previousOriginalLine = mapping.originalLine - 1;
|
|
||||||
|
|
||||||
next += base64VLQ.encode(mapping.originalColumn
|
|
||||||
- previousOriginalColumn);
|
|
||||||
previousOriginalColumn = mapping.originalColumn;
|
|
||||||
|
|
||||||
if (mapping.name != null) {
|
|
||||||
nameIdx = this._names.indexOf(mapping.name);
|
|
||||||
next += base64VLQ.encode(nameIdx - previousName);
|
|
||||||
previousName = nameIdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result += next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
SourceMapGenerator.prototype._generateSourcesContent =
|
|
||||||
function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
|
|
||||||
return aSources.map(function (source) {
|
|
||||||
if (!this._sourcesContents) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (aSourceRoot != null) {
|
|
||||||
source = util.relative(aSourceRoot, source);
|
|
||||||
}
|
|
||||||
var key = util.toSetString(source);
|
|
||||||
return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
|
|
||||||
? this._sourcesContents[key]
|
|
||||||
: null;
|
|
||||||
}, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Externalize the source map.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype.toJSON =
|
|
||||||
function SourceMapGenerator_toJSON() {
|
|
||||||
var map = {
|
|
||||||
version: this._version,
|
|
||||||
sources: this._sources.toArray(),
|
|
||||||
names: this._names.toArray(),
|
|
||||||
mappings: this._serializeMappings()
|
|
||||||
};
|
|
||||||
if (this._file != null) {
|
|
||||||
map.file = this._file;
|
|
||||||
}
|
|
||||||
if (this._sourceRoot != null) {
|
|
||||||
map.sourceRoot = this._sourceRoot;
|
|
||||||
}
|
|
||||||
if (this._sourcesContents) {
|
|
||||||
map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
|
|
||||||
}
|
|
||||||
|
|
||||||
return map;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the source map being generated to a string.
|
|
||||||
*/
|
|
||||||
SourceMapGenerator.prototype.toString =
|
|
||||||
function SourceMapGenerator_toString() {
|
|
||||||
return JSON.stringify(this.toJSON());
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.SourceMapGenerator = SourceMapGenerator;
|
|
413
node_modules/source-map/lib/source-node.js
generated
vendored
413
node_modules/source-map/lib/source-node.js
generated
vendored
|
@ -1,413 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
|
|
||||||
var util = require('./util');
|
|
||||||
|
|
||||||
// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
|
|
||||||
// operating systems these days (capturing the result).
|
|
||||||
var REGEX_NEWLINE = /(\r?\n)/;
|
|
||||||
|
|
||||||
// Newline character code for charCodeAt() comparisons
|
|
||||||
var NEWLINE_CODE = 10;
|
|
||||||
|
|
||||||
// Private symbol for identifying `SourceNode`s when multiple versions of
|
|
||||||
// the source-map library are loaded. This MUST NOT CHANGE across
|
|
||||||
// versions!
|
|
||||||
var isSourceNode = "$$$isSourceNode$$$";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SourceNodes provide a way to abstract over interpolating/concatenating
|
|
||||||
* snippets of generated JavaScript source code while maintaining the line and
|
|
||||||
* column information associated with the original source code.
|
|
||||||
*
|
|
||||||
* @param aLine The original line number.
|
|
||||||
* @param aColumn The original column number.
|
|
||||||
* @param aSource The original source's filename.
|
|
||||||
* @param aChunks Optional. An array of strings which are snippets of
|
|
||||||
* generated JS, or other SourceNodes.
|
|
||||||
* @param aName The original identifier.
|
|
||||||
*/
|
|
||||||
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
|
|
||||||
this.children = [];
|
|
||||||
this.sourceContents = {};
|
|
||||||
this.line = aLine == null ? null : aLine;
|
|
||||||
this.column = aColumn == null ? null : aColumn;
|
|
||||||
this.source = aSource == null ? null : aSource;
|
|
||||||
this.name = aName == null ? null : aName;
|
|
||||||
this[isSourceNode] = true;
|
|
||||||
if (aChunks != null) this.add(aChunks);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a SourceNode from generated code and a SourceMapConsumer.
|
|
||||||
*
|
|
||||||
* @param aGeneratedCode The generated code
|
|
||||||
* @param aSourceMapConsumer The SourceMap for the generated code
|
|
||||||
* @param aRelativePath Optional. The path that relative sources in the
|
|
||||||
* SourceMapConsumer should be relative to.
|
|
||||||
*/
|
|
||||||
SourceNode.fromStringWithSourceMap =
|
|
||||||
function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
|
|
||||||
// The SourceNode we want to fill with the generated code
|
|
||||||
// and the SourceMap
|
|
||||||
var node = new SourceNode();
|
|
||||||
|
|
||||||
// All even indices of this array are one line of the generated code,
|
|
||||||
// while all odd indices are the newlines between two adjacent lines
|
|
||||||
// (since `REGEX_NEWLINE` captures its match).
|
|
||||||
// Processed fragments are accessed by calling `shiftNextLine`.
|
|
||||||
var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
|
|
||||||
var remainingLinesIndex = 0;
|
|
||||||
var shiftNextLine = function() {
|
|
||||||
var lineContents = getNextLine();
|
|
||||||
// The last line of a file might not have a newline.
|
|
||||||
var newLine = getNextLine() || "";
|
|
||||||
return lineContents + newLine;
|
|
||||||
|
|
||||||
function getNextLine() {
|
|
||||||
return remainingLinesIndex < remainingLines.length ?
|
|
||||||
remainingLines[remainingLinesIndex++] : undefined;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// We need to remember the position of "remainingLines"
|
|
||||||
var lastGeneratedLine = 1, lastGeneratedColumn = 0;
|
|
||||||
|
|
||||||
// The generate SourceNodes we need a code range.
|
|
||||||
// To extract it current and last mapping is used.
|
|
||||||
// Here we store the last mapping.
|
|
||||||
var lastMapping = null;
|
|
||||||
|
|
||||||
aSourceMapConsumer.eachMapping(function (mapping) {
|
|
||||||
if (lastMapping !== null) {
|
|
||||||
// We add the code from "lastMapping" to "mapping":
|
|
||||||
// First check if there is a new line in between.
|
|
||||||
if (lastGeneratedLine < mapping.generatedLine) {
|
|
||||||
// Associate first line with "lastMapping"
|
|
||||||
addMappingWithCode(lastMapping, shiftNextLine());
|
|
||||||
lastGeneratedLine++;
|
|
||||||
lastGeneratedColumn = 0;
|
|
||||||
// The remaining code is added without mapping
|
|
||||||
} else {
|
|
||||||
// There is no new line in between.
|
|
||||||
// Associate the code between "lastGeneratedColumn" and
|
|
||||||
// "mapping.generatedColumn" with "lastMapping"
|
|
||||||
var nextLine = remainingLines[remainingLinesIndex] || '';
|
|
||||||
var code = nextLine.substr(0, mapping.generatedColumn -
|
|
||||||
lastGeneratedColumn);
|
|
||||||
remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
|
|
||||||
lastGeneratedColumn);
|
|
||||||
lastGeneratedColumn = mapping.generatedColumn;
|
|
||||||
addMappingWithCode(lastMapping, code);
|
|
||||||
// No more remaining code, continue
|
|
||||||
lastMapping = mapping;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We add the generated code until the first mapping
|
|
||||||
// to the SourceNode without any mapping.
|
|
||||||
// Each line is added as separate string.
|
|
||||||
while (lastGeneratedLine < mapping.generatedLine) {
|
|
||||||
node.add(shiftNextLine());
|
|
||||||
lastGeneratedLine++;
|
|
||||||
}
|
|
||||||
if (lastGeneratedColumn < mapping.generatedColumn) {
|
|
||||||
var nextLine = remainingLines[remainingLinesIndex] || '';
|
|
||||||
node.add(nextLine.substr(0, mapping.generatedColumn));
|
|
||||||
remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
|
|
||||||
lastGeneratedColumn = mapping.generatedColumn;
|
|
||||||
}
|
|
||||||
lastMapping = mapping;
|
|
||||||
}, this);
|
|
||||||
// We have processed all mappings.
|
|
||||||
if (remainingLinesIndex < remainingLines.length) {
|
|
||||||
if (lastMapping) {
|
|
||||||
// Associate the remaining code in the current line with "lastMapping"
|
|
||||||
addMappingWithCode(lastMapping, shiftNextLine());
|
|
||||||
}
|
|
||||||
// and add the remaining lines without any mapping
|
|
||||||
node.add(remainingLines.splice(remainingLinesIndex).join(""));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy sourcesContent into SourceNode
|
|
||||||
aSourceMapConsumer.sources.forEach(function (sourceFile) {
|
|
||||||
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
|
|
||||||
if (content != null) {
|
|
||||||
if (aRelativePath != null) {
|
|
||||||
sourceFile = util.join(aRelativePath, sourceFile);
|
|
||||||
}
|
|
||||||
node.setSourceContent(sourceFile, content);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return node;
|
|
||||||
|
|
||||||
function addMappingWithCode(mapping, code) {
|
|
||||||
if (mapping === null || mapping.source === undefined) {
|
|
||||||
node.add(code);
|
|
||||||
} else {
|
|
||||||
var source = aRelativePath
|
|
||||||
? util.join(aRelativePath, mapping.source)
|
|
||||||
: mapping.source;
|
|
||||||
node.add(new SourceNode(mapping.originalLine,
|
|
||||||
mapping.originalColumn,
|
|
||||||
source,
|
|
||||||
code,
|
|
||||||
mapping.name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a chunk of generated JS to this source node.
|
|
||||||
*
|
|
||||||
* @param aChunk A string snippet of generated JS code, another instance of
|
|
||||||
* SourceNode, or an array where each member is one of those things.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.add = function SourceNode_add(aChunk) {
|
|
||||||
if (Array.isArray(aChunk)) {
|
|
||||||
aChunk.forEach(function (chunk) {
|
|
||||||
this.add(chunk);
|
|
||||||
}, this);
|
|
||||||
}
|
|
||||||
else if (aChunk[isSourceNode] || typeof aChunk === "string") {
|
|
||||||
if (aChunk) {
|
|
||||||
this.children.push(aChunk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new TypeError(
|
|
||||||
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a chunk of generated JS to the beginning of this source node.
|
|
||||||
*
|
|
||||||
* @param aChunk A string snippet of generated JS code, another instance of
|
|
||||||
* SourceNode, or an array where each member is one of those things.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
|
|
||||||
if (Array.isArray(aChunk)) {
|
|
||||||
for (var i = aChunk.length-1; i >= 0; i--) {
|
|
||||||
this.prepend(aChunk[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (aChunk[isSourceNode] || typeof aChunk === "string") {
|
|
||||||
this.children.unshift(aChunk);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new TypeError(
|
|
||||||
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk over the tree of JS snippets in this node and its children. The
|
|
||||||
* walking function is called once for each snippet of JS and is passed that
|
|
||||||
* snippet and the its original associated source's line/column location.
|
|
||||||
*
|
|
||||||
* @param aFn The traversal function.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
|
|
||||||
var chunk;
|
|
||||||
for (var i = 0, len = this.children.length; i < len; i++) {
|
|
||||||
chunk = this.children[i];
|
|
||||||
if (chunk[isSourceNode]) {
|
|
||||||
chunk.walk(aFn);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (chunk !== '') {
|
|
||||||
aFn(chunk, { source: this.source,
|
|
||||||
line: this.line,
|
|
||||||
column: this.column,
|
|
||||||
name: this.name });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
|
|
||||||
* each of `this.children`.
|
|
||||||
*
|
|
||||||
* @param aSep The separator.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.join = function SourceNode_join(aSep) {
|
|
||||||
var newChildren;
|
|
||||||
var i;
|
|
||||||
var len = this.children.length;
|
|
||||||
if (len > 0) {
|
|
||||||
newChildren = [];
|
|
||||||
for (i = 0; i < len-1; i++) {
|
|
||||||
newChildren.push(this.children[i]);
|
|
||||||
newChildren.push(aSep);
|
|
||||||
}
|
|
||||||
newChildren.push(this.children[i]);
|
|
||||||
this.children = newChildren;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call String.prototype.replace on the very right-most source snippet. Useful
|
|
||||||
* for trimming whitespace from the end of a source node, etc.
|
|
||||||
*
|
|
||||||
* @param aPattern The pattern to replace.
|
|
||||||
* @param aReplacement The thing to replace the pattern with.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
|
|
||||||
var lastChild = this.children[this.children.length - 1];
|
|
||||||
if (lastChild[isSourceNode]) {
|
|
||||||
lastChild.replaceRight(aPattern, aReplacement);
|
|
||||||
}
|
|
||||||
else if (typeof lastChild === 'string') {
|
|
||||||
this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.children.push(''.replace(aPattern, aReplacement));
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the source content for a source file. This will be added to the SourceMapGenerator
|
|
||||||
* in the sourcesContent field.
|
|
||||||
*
|
|
||||||
* @param aSourceFile The filename of the source file
|
|
||||||
* @param aSourceContent The content of the source file
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.setSourceContent =
|
|
||||||
function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
|
|
||||||
this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk over the tree of SourceNodes. The walking function is called for each
|
|
||||||
* source file content and is passed the filename and source content.
|
|
||||||
*
|
|
||||||
* @param aFn The traversal function.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.walkSourceContents =
|
|
||||||
function SourceNode_walkSourceContents(aFn) {
|
|
||||||
for (var i = 0, len = this.children.length; i < len; i++) {
|
|
||||||
if (this.children[i][isSourceNode]) {
|
|
||||||
this.children[i].walkSourceContents(aFn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sources = Object.keys(this.sourceContents);
|
|
||||||
for (var i = 0, len = sources.length; i < len; i++) {
|
|
||||||
aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the string representation of this source node. Walks over the tree
|
|
||||||
* and concatenates all the various snippets together to one string.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.toString = function SourceNode_toString() {
|
|
||||||
var str = "";
|
|
||||||
this.walk(function (chunk) {
|
|
||||||
str += chunk;
|
|
||||||
});
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string representation of this source node along with a source
|
|
||||||
* map.
|
|
||||||
*/
|
|
||||||
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
|
|
||||||
var generated = {
|
|
||||||
code: "",
|
|
||||||
line: 1,
|
|
||||||
column: 0
|
|
||||||
};
|
|
||||||
var map = new SourceMapGenerator(aArgs);
|
|
||||||
var sourceMappingActive = false;
|
|
||||||
var lastOriginalSource = null;
|
|
||||||
var lastOriginalLine = null;
|
|
||||||
var lastOriginalColumn = null;
|
|
||||||
var lastOriginalName = null;
|
|
||||||
this.walk(function (chunk, original) {
|
|
||||||
generated.code += chunk;
|
|
||||||
if (original.source !== null
|
|
||||||
&& original.line !== null
|
|
||||||
&& original.column !== null) {
|
|
||||||
if(lastOriginalSource !== original.source
|
|
||||||
|| lastOriginalLine !== original.line
|
|
||||||
|| lastOriginalColumn !== original.column
|
|
||||||
|| lastOriginalName !== original.name) {
|
|
||||||
map.addMapping({
|
|
||||||
source: original.source,
|
|
||||||
original: {
|
|
||||||
line: original.line,
|
|
||||||
column: original.column
|
|
||||||
},
|
|
||||||
generated: {
|
|
||||||
line: generated.line,
|
|
||||||
column: generated.column
|
|
||||||
},
|
|
||||||
name: original.name
|
|
||||||
});
|
|
||||||
}
|
|
||||||
lastOriginalSource = original.source;
|
|
||||||
lastOriginalLine = original.line;
|
|
||||||
lastOriginalColumn = original.column;
|
|
||||||
lastOriginalName = original.name;
|
|
||||||
sourceMappingActive = true;
|
|
||||||
} else if (sourceMappingActive) {
|
|
||||||
map.addMapping({
|
|
||||||
generated: {
|
|
||||||
line: generated.line,
|
|
||||||
column: generated.column
|
|
||||||
}
|
|
||||||
});
|
|
||||||
lastOriginalSource = null;
|
|
||||||
sourceMappingActive = false;
|
|
||||||
}
|
|
||||||
for (var idx = 0, length = chunk.length; idx < length; idx++) {
|
|
||||||
if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
|
|
||||||
generated.line++;
|
|
||||||
generated.column = 0;
|
|
||||||
// Mappings end at eol
|
|
||||||
if (idx + 1 === length) {
|
|
||||||
lastOriginalSource = null;
|
|
||||||
sourceMappingActive = false;
|
|
||||||
} else if (sourceMappingActive) {
|
|
||||||
map.addMapping({
|
|
||||||
source: original.source,
|
|
||||||
original: {
|
|
||||||
line: original.line,
|
|
||||||
column: original.column
|
|
||||||
},
|
|
||||||
generated: {
|
|
||||||
line: generated.line,
|
|
||||||
column: generated.column
|
|
||||||
},
|
|
||||||
name: original.name
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
generated.column++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.walkSourceContents(function (sourceFile, sourceContent) {
|
|
||||||
map.setSourceContent(sourceFile, sourceContent);
|
|
||||||
});
|
|
||||||
|
|
||||||
return { code: generated.code, map: map };
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.SourceNode = SourceNode;
|
|
488
node_modules/source-map/lib/util.js
generated
vendored
488
node_modules/source-map/lib/util.js
generated
vendored
|
@ -1,488 +0,0 @@
|
||||||
/* -*- Mode: js; js-indent-level: 2; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a helper function for getting values from parameter/options
|
|
||||||
* objects.
|
|
||||||
*
|
|
||||||
* @param args The object we are extracting values from
|
|
||||||
* @param name The name of the property we are getting.
|
|
||||||
* @param defaultValue An optional value to return if the property is missing
|
|
||||||
* from the object. If this is not specified and the property is missing, an
|
|
||||||
* error will be thrown.
|
|
||||||
*/
|
|
||||||
function getArg(aArgs, aName, aDefaultValue) {
|
|
||||||
if (aName in aArgs) {
|
|
||||||
return aArgs[aName];
|
|
||||||
} else if (arguments.length === 3) {
|
|
||||||
return aDefaultValue;
|
|
||||||
} else {
|
|
||||||
throw new Error('"' + aName + '" is a required argument.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.getArg = getArg;
|
|
||||||
|
|
||||||
var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
|
|
||||||
var dataUrlRegexp = /^data:.+\,.+$/;
|
|
||||||
|
|
||||||
function urlParse(aUrl) {
|
|
||||||
var match = aUrl.match(urlRegexp);
|
|
||||||
if (!match) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
scheme: match[1],
|
|
||||||
auth: match[2],
|
|
||||||
host: match[3],
|
|
||||||
port: match[4],
|
|
||||||
path: match[5]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
exports.urlParse = urlParse;
|
|
||||||
|
|
||||||
function urlGenerate(aParsedUrl) {
|
|
||||||
var url = '';
|
|
||||||
if (aParsedUrl.scheme) {
|
|
||||||
url += aParsedUrl.scheme + ':';
|
|
||||||
}
|
|
||||||
url += '//';
|
|
||||||
if (aParsedUrl.auth) {
|
|
||||||
url += aParsedUrl.auth + '@';
|
|
||||||
}
|
|
||||||
if (aParsedUrl.host) {
|
|
||||||
url += aParsedUrl.host;
|
|
||||||
}
|
|
||||||
if (aParsedUrl.port) {
|
|
||||||
url += ":" + aParsedUrl.port
|
|
||||||
}
|
|
||||||
if (aParsedUrl.path) {
|
|
||||||
url += aParsedUrl.path;
|
|
||||||
}
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
exports.urlGenerate = urlGenerate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Normalizes a path, or the path portion of a URL:
|
|
||||||
*
|
|
||||||
* - Replaces consecutive slashes with one slash.
|
|
||||||
* - Removes unnecessary '.' parts.
|
|
||||||
* - Removes unnecessary '<dir>/..' parts.
|
|
||||||
*
|
|
||||||
* Based on code in the Node.js 'path' core module.
|
|
||||||
*
|
|
||||||
* @param aPath The path or url to normalize.
|
|
||||||
*/
|
|
||||||
function normalize(aPath) {
|
|
||||||
var path = aPath;
|
|
||||||
var url = urlParse(aPath);
|
|
||||||
if (url) {
|
|
||||||
if (!url.path) {
|
|
||||||
return aPath;
|
|
||||||
}
|
|
||||||
path = url.path;
|
|
||||||
}
|
|
||||||
var isAbsolute = exports.isAbsolute(path);
|
|
||||||
|
|
||||||
var parts = path.split(/\/+/);
|
|
||||||
for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
|
|
||||||
part = parts[i];
|
|
||||||
if (part === '.') {
|
|
||||||
parts.splice(i, 1);
|
|
||||||
} else if (part === '..') {
|
|
||||||
up++;
|
|
||||||
} else if (up > 0) {
|
|
||||||
if (part === '') {
|
|
||||||
// The first part is blank if the path is absolute. Trying to go
|
|
||||||
// above the root is a no-op. Therefore we can remove all '..' parts
|
|
||||||
// directly after the root.
|
|
||||||
parts.splice(i + 1, up);
|
|
||||||
up = 0;
|
|
||||||
} else {
|
|
||||||
parts.splice(i, 2);
|
|
||||||
up--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
path = parts.join('/');
|
|
||||||
|
|
||||||
if (path === '') {
|
|
||||||
path = isAbsolute ? '/' : '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (url) {
|
|
||||||
url.path = path;
|
|
||||||
return urlGenerate(url);
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
exports.normalize = normalize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Joins two paths/URLs.
|
|
||||||
*
|
|
||||||
* @param aRoot The root path or URL.
|
|
||||||
* @param aPath The path or URL to be joined with the root.
|
|
||||||
*
|
|
||||||
* - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
|
|
||||||
* scheme-relative URL: Then the scheme of aRoot, if any, is prepended
|
|
||||||
* first.
|
|
||||||
* - Otherwise aPath is a path. If aRoot is a URL, then its path portion
|
|
||||||
* is updated with the result and aRoot is returned. Otherwise the result
|
|
||||||
* is returned.
|
|
||||||
* - If aPath is absolute, the result is aPath.
|
|
||||||
* - Otherwise the two paths are joined with a slash.
|
|
||||||
* - Joining for example 'http://' and 'www.example.com' is also supported.
|
|
||||||
*/
|
|
||||||
function join(aRoot, aPath) {
|
|
||||||
if (aRoot === "") {
|
|
||||||
aRoot = ".";
|
|
||||||
}
|
|
||||||
if (aPath === "") {
|
|
||||||
aPath = ".";
|
|
||||||
}
|
|
||||||
var aPathUrl = urlParse(aPath);
|
|
||||||
var aRootUrl = urlParse(aRoot);
|
|
||||||
if (aRootUrl) {
|
|
||||||
aRoot = aRootUrl.path || '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
// `join(foo, '//www.example.org')`
|
|
||||||
if (aPathUrl && !aPathUrl.scheme) {
|
|
||||||
if (aRootUrl) {
|
|
||||||
aPathUrl.scheme = aRootUrl.scheme;
|
|
||||||
}
|
|
||||||
return urlGenerate(aPathUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aPathUrl || aPath.match(dataUrlRegexp)) {
|
|
||||||
return aPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
// `join('http://', 'www.example.com')`
|
|
||||||
if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
|
|
||||||
aRootUrl.host = aPath;
|
|
||||||
return urlGenerate(aRootUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
var joined = aPath.charAt(0) === '/'
|
|
||||||
? aPath
|
|
||||||
: normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
|
|
||||||
|
|
||||||
if (aRootUrl) {
|
|
||||||
aRootUrl.path = joined;
|
|
||||||
return urlGenerate(aRootUrl);
|
|
||||||
}
|
|
||||||
return joined;
|
|
||||||
}
|
|
||||||
exports.join = join;
|
|
||||||
|
|
||||||
exports.isAbsolute = function (aPath) {
|
|
||||||
return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a path relative to a URL or another path.
|
|
||||||
*
|
|
||||||
* @param aRoot The root path or URL.
|
|
||||||
* @param aPath The path or URL to be made relative to aRoot.
|
|
||||||
*/
|
|
||||||
function relative(aRoot, aPath) {
|
|
||||||
if (aRoot === "") {
|
|
||||||
aRoot = ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
aRoot = aRoot.replace(/\/$/, '');
|
|
||||||
|
|
||||||
// It is possible for the path to be above the root. In this case, simply
|
|
||||||
// checking whether the root is a prefix of the path won't work. Instead, we
|
|
||||||
// need to remove components from the root one by one, until either we find
|
|
||||||
// a prefix that fits, or we run out of components to remove.
|
|
||||||
var level = 0;
|
|
||||||
while (aPath.indexOf(aRoot + '/') !== 0) {
|
|
||||||
var index = aRoot.lastIndexOf("/");
|
|
||||||
if (index < 0) {
|
|
||||||
return aPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the only part of the root that is left is the scheme (i.e. http://,
|
|
||||||
// file:///, etc.), one or more slashes (/), or simply nothing at all, we
|
|
||||||
// have exhausted all components, so the path is not relative to the root.
|
|
||||||
aRoot = aRoot.slice(0, index);
|
|
||||||
if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
|
|
||||||
return aPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
++level;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure we add a "../" for each component we removed from the root.
|
|
||||||
return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
|
|
||||||
}
|
|
||||||
exports.relative = relative;
|
|
||||||
|
|
||||||
var supportsNullProto = (function () {
|
|
||||||
var obj = Object.create(null);
|
|
||||||
return !('__proto__' in obj);
|
|
||||||
}());
|
|
||||||
|
|
||||||
function identity (s) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Because behavior goes wacky when you set `__proto__` on objects, we
|
|
||||||
* have to prefix all the strings in our set with an arbitrary character.
|
|
||||||
*
|
|
||||||
* See https://github.com/mozilla/source-map/pull/31 and
|
|
||||||
* https://github.com/mozilla/source-map/issues/30
|
|
||||||
*
|
|
||||||
* @param String aStr
|
|
||||||
*/
|
|
||||||
function toSetString(aStr) {
|
|
||||||
if (isProtoString(aStr)) {
|
|
||||||
return '$' + aStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return aStr;
|
|
||||||
}
|
|
||||||
exports.toSetString = supportsNullProto ? identity : toSetString;
|
|
||||||
|
|
||||||
function fromSetString(aStr) {
|
|
||||||
if (isProtoString(aStr)) {
|
|
||||||
return aStr.slice(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return aStr;
|
|
||||||
}
|
|
||||||
exports.fromSetString = supportsNullProto ? identity : fromSetString;
|
|
||||||
|
|
||||||
function isProtoString(s) {
|
|
||||||
if (!s) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var length = s.length;
|
|
||||||
|
|
||||||
if (length < 9 /* "__proto__".length */) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
|
|
||||||
s.charCodeAt(length - 2) !== 95 /* '_' */ ||
|
|
||||||
s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
|
|
||||||
s.charCodeAt(length - 4) !== 116 /* 't' */ ||
|
|
||||||
s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
|
|
||||||
s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
|
|
||||||
s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
|
|
||||||
s.charCodeAt(length - 8) !== 95 /* '_' */ ||
|
|
||||||
s.charCodeAt(length - 9) !== 95 /* '_' */) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = length - 10; i >= 0; i--) {
|
|
||||||
if (s.charCodeAt(i) !== 36 /* '$' */) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Comparator between two mappings where the original positions are compared.
|
|
||||||
*
|
|
||||||
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
|
|
||||||
* mappings with the same original source/line/column, but different generated
|
|
||||||
* line and column the same. Useful when searching for a mapping with a
|
|
||||||
* stubbed out mapping.
|
|
||||||
*/
|
|
||||||
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
|
|
||||||
var cmp = strcmp(mappingA.source, mappingB.source);
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
||||||
if (cmp !== 0 || onlyCompareOriginal) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return strcmp(mappingA.name, mappingB.name);
|
|
||||||
}
|
|
||||||
exports.compareByOriginalPositions = compareByOriginalPositions;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Comparator between two mappings with deflated source and name indices where
|
|
||||||
* the generated positions are compared.
|
|
||||||
*
|
|
||||||
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
|
|
||||||
* mappings with the same generated line and column, but different
|
|
||||||
* source/name/original line and column the same. Useful when searching for a
|
|
||||||
* mapping with a stubbed out mapping.
|
|
||||||
*/
|
|
||||||
function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
|
|
||||||
var cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
||||||
if (cmp !== 0 || onlyCompareGenerated) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = strcmp(mappingA.source, mappingB.source);
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return strcmp(mappingA.name, mappingB.name);
|
|
||||||
}
|
|
||||||
exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
|
|
||||||
|
|
||||||
function strcmp(aStr1, aStr2) {
|
|
||||||
if (aStr1 === aStr2) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aStr1 === null) {
|
|
||||||
return 1; // aStr2 !== null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aStr2 === null) {
|
|
||||||
return -1; // aStr1 !== null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aStr1 > aStr2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Comparator between two mappings with inflated source and name strings where
|
|
||||||
* the generated positions are compared.
|
|
||||||
*/
|
|
||||||
function compareByGeneratedPositionsInflated(mappingA, mappingB) {
|
|
||||||
var cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = strcmp(mappingA.source, mappingB.source);
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
||||||
if (cmp !== 0) {
|
|
||||||
return cmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return strcmp(mappingA.name, mappingB.name);
|
|
||||||
}
|
|
||||||
exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strip any JSON XSSI avoidance prefix from the string (as documented
|
|
||||||
* in the source maps specification), and then parse the string as
|
|
||||||
* JSON.
|
|
||||||
*/
|
|
||||||
function parseSourceMapInput(str) {
|
|
||||||
return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
|
|
||||||
}
|
|
||||||
exports.parseSourceMapInput = parseSourceMapInput;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the URL of a source given the the source root, the source's
|
|
||||||
* URL, and the source map's URL.
|
|
||||||
*/
|
|
||||||
function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
|
|
||||||
sourceURL = sourceURL || '';
|
|
||||||
|
|
||||||
if (sourceRoot) {
|
|
||||||
// This follows what Chrome does.
|
|
||||||
if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
|
|
||||||
sourceRoot += '/';
|
|
||||||
}
|
|
||||||
// The spec says:
|
|
||||||
// Line 4: An optional source root, useful for relocating source
|
|
||||||
// files on a server or removing repeated values in the
|
|
||||||
// “sources” entry. This value is prepended to the individual
|
|
||||||
// entries in the “source” field.
|
|
||||||
sourceURL = sourceRoot + sourceURL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Historically, SourceMapConsumer did not take the sourceMapURL as
|
|
||||||
// a parameter. This mode is still somewhat supported, which is why
|
|
||||||
// this code block is conditional. However, it's preferable to pass
|
|
||||||
// the source map URL to SourceMapConsumer, so that this function
|
|
||||||
// can implement the source URL resolution algorithm as outlined in
|
|
||||||
// the spec. This block is basically the equivalent of:
|
|
||||||
// new URL(sourceURL, sourceMapURL).toString()
|
|
||||||
// ... except it avoids using URL, which wasn't available in the
|
|
||||||
// older releases of node still supported by this library.
|
|
||||||
//
|
|
||||||
// The spec says:
|
|
||||||
// If the sources are not absolute URLs after prepending of the
|
|
||||||
// “sourceRoot”, the sources are resolved relative to the
|
|
||||||
// SourceMap (like resolving script src in a html document).
|
|
||||||
if (sourceMapURL) {
|
|
||||||
var parsed = urlParse(sourceMapURL);
|
|
||||||
if (!parsed) {
|
|
||||||
throw new Error("sourceMapURL could not be parsed");
|
|
||||||
}
|
|
||||||
if (parsed.path) {
|
|
||||||
// Strip the last path component, but keep the "/".
|
|
||||||
var index = parsed.path.lastIndexOf('/');
|
|
||||||
if (index >= 0) {
|
|
||||||
parsed.path = parsed.path.substring(0, index + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sourceURL = join(urlGenerate(parsed), sourceURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return normalize(sourceURL);
|
|
||||||
}
|
|
||||||
exports.computeSourceURL = computeSourceURL;
|
|
212
node_modules/source-map/package.json
generated
vendored
212
node_modules/source-map/package.json
generated
vendored
|
@ -1,212 +0,0 @@
|
||||||
{
|
|
||||||
"_from": "source-map@~0.6.1",
|
|
||||||
"_id": "source-map@0.6.1",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
|
||||||
"_location": "/source-map",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "source-map@~0.6.1",
|
|
||||||
"name": "source-map",
|
|
||||||
"escapedName": "source-map",
|
|
||||||
"rawSpec": "~0.6.1",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "~0.6.1"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/uglify-js"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
|
||||||
"_shasum": "74722af32e9614e9c287a8d0bbde48b5e2f1a263",
|
|
||||||
"_spec": "source-map@~0.6.1",
|
|
||||||
"_where": "/home/nilix/lib/planetaryGears/node_modules/uglify-js",
|
|
||||||
"author": {
|
|
||||||
"name": "Nick Fitzgerald",
|
|
||||||
"email": "nfitzgerald@mozilla.com"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/mozilla/source-map/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Tobias Koppers",
|
|
||||||
"email": "tobias.koppers@googlemail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Duncan Beevers",
|
|
||||||
"email": "duncan@dweebd.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Stephen Crane",
|
|
||||||
"email": "scrane@mozilla.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Ryan Seddon",
|
|
||||||
"email": "seddon.ryan@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Miles Elam",
|
|
||||||
"email": "miles.elam@deem.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mihai Bazon",
|
|
||||||
"email": "mihai.bazon@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Michael Ficarra",
|
|
||||||
"email": "github.public.email@michael.ficarra.me"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Todd Wolfson",
|
|
||||||
"email": "todd@twolfson.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Alexander Solovyov",
|
|
||||||
"email": "alexander@solovyov.net"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Felix Gnass",
|
|
||||||
"email": "fgnass@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Conrad Irwin",
|
|
||||||
"email": "conrad.irwin@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "usrbincc",
|
|
||||||
"email": "usrbincc@yahoo.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "David Glasser",
|
|
||||||
"email": "glasser@davidglasser.net"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Chase Douglas",
|
|
||||||
"email": "chase@newrelic.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Evan Wallace",
|
|
||||||
"email": "evan.exe@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Heather Arthur",
|
|
||||||
"email": "fayearthur@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Hugh Kennedy",
|
|
||||||
"email": "hughskennedy@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "David Glasser",
|
|
||||||
"email": "glasser@davidglasser.net"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Simon Lydell",
|
|
||||||
"email": "simon.lydell@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jmeas Smith",
|
|
||||||
"email": "jellyes2@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Michael Z Goddard",
|
|
||||||
"email": "mzgoddard@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "azu",
|
|
||||||
"email": "azu@users.noreply.github.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "John Gozde",
|
|
||||||
"email": "john@gozde.ca"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Adam Kirkton",
|
|
||||||
"email": "akirkton@truefitinnovation.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Chris Montgomery",
|
|
||||||
"email": "christopher.montgomery@dowjones.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "J. Ryan Stinnett",
|
|
||||||
"email": "jryans@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jack Herrington",
|
|
||||||
"email": "jherrington@walmartlabs.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Chris Truter",
|
|
||||||
"email": "jeffpalentine@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Daniel Espeset",
|
|
||||||
"email": "daniel@danielespeset.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jamie Wong",
|
|
||||||
"email": "jamie.lf.wong@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Eddy Bruël",
|
|
||||||
"email": "ejpbruel@mozilla.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Hawken Rives",
|
|
||||||
"email": "hawkrives@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Gilad Peleg",
|
|
||||||
"email": "giladp007@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "djchie",
|
|
||||||
"email": "djchie.dev@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Gary Ye",
|
|
||||||
"email": "garysye@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Nicolas Lalevée",
|
|
||||||
"email": "nicolas.lalevee@hibnet.org"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Generates and consumes source maps",
|
|
||||||
"devDependencies": {
|
|
||||||
"doctoc": "^0.15.0",
|
|
||||||
"webpack": "^1.12.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"source-map.js",
|
|
||||||
"source-map.d.ts",
|
|
||||||
"lib/",
|
|
||||||
"dist/source-map.debug.js",
|
|
||||||
"dist/source-map.js",
|
|
||||||
"dist/source-map.min.js",
|
|
||||||
"dist/source-map.min.js.map"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/mozilla/source-map",
|
|
||||||
"license": "BSD-3-Clause",
|
|
||||||
"main": "./source-map.js",
|
|
||||||
"name": "source-map",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+ssh://git@github.com/mozilla/source-map.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"build": "webpack --color",
|
|
||||||
"test": "npm run build && node test/run-tests.js",
|
|
||||||
"toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
|
|
||||||
},
|
|
||||||
"typings": "source-map",
|
|
||||||
"version": "0.6.1"
|
|
||||||
}
|
|
98
node_modules/source-map/source-map.d.ts
generated
vendored
98
node_modules/source-map/source-map.d.ts
generated
vendored
|
@ -1,98 +0,0 @@
|
||||||
export interface StartOfSourceMap {
|
|
||||||
file?: string;
|
|
||||||
sourceRoot?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface RawSourceMap extends StartOfSourceMap {
|
|
||||||
version: string;
|
|
||||||
sources: string[];
|
|
||||||
names: string[];
|
|
||||||
sourcesContent?: string[];
|
|
||||||
mappings: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Position {
|
|
||||||
line: number;
|
|
||||||
column: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LineRange extends Position {
|
|
||||||
lastColumn: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FindPosition extends Position {
|
|
||||||
// SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND
|
|
||||||
bias?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SourceFindPosition extends FindPosition {
|
|
||||||
source: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MappedPosition extends Position {
|
|
||||||
source: string;
|
|
||||||
name?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MappingItem {
|
|
||||||
source: string;
|
|
||||||
generatedLine: number;
|
|
||||||
generatedColumn: number;
|
|
||||||
originalLine: number;
|
|
||||||
originalColumn: number;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SourceMapConsumer {
|
|
||||||
static GENERATED_ORDER: number;
|
|
||||||
static ORIGINAL_ORDER: number;
|
|
||||||
|
|
||||||
static GREATEST_LOWER_BOUND: number;
|
|
||||||
static LEAST_UPPER_BOUND: number;
|
|
||||||
|
|
||||||
constructor(rawSourceMap: RawSourceMap);
|
|
||||||
computeColumnSpans(): void;
|
|
||||||
originalPositionFor(generatedPosition: FindPosition): MappedPosition;
|
|
||||||
generatedPositionFor(originalPosition: SourceFindPosition): LineRange;
|
|
||||||
allGeneratedPositionsFor(originalPosition: MappedPosition): Position[];
|
|
||||||
hasContentsOfAllSources(): boolean;
|
|
||||||
sourceContentFor(source: string, returnNullOnMissing?: boolean): string;
|
|
||||||
eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Mapping {
|
|
||||||
generated: Position;
|
|
||||||
original: Position;
|
|
||||||
source: string;
|
|
||||||
name?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SourceMapGenerator {
|
|
||||||
constructor(startOfSourceMap?: StartOfSourceMap);
|
|
||||||
static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;
|
|
||||||
addMapping(mapping: Mapping): void;
|
|
||||||
setSourceContent(sourceFile: string, sourceContent: string): void;
|
|
||||||
applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CodeWithSourceMap {
|
|
||||||
code: string;
|
|
||||||
map: SourceMapGenerator;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SourceNode {
|
|
||||||
constructor();
|
|
||||||
constructor(line: number, column: number, source: string);
|
|
||||||
constructor(line: number, column: number, source: string, chunk?: string, name?: string);
|
|
||||||
static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode;
|
|
||||||
add(chunk: string): void;
|
|
||||||
prepend(chunk: string): void;
|
|
||||||
setSourceContent(sourceFile: string, sourceContent: string): void;
|
|
||||||
walk(fn: (chunk: string, mapping: MappedPosition) => void): void;
|
|
||||||
walkSourceContents(fn: (file: string, content: string) => void): void;
|
|
||||||
join(sep: string): SourceNode;
|
|
||||||
replaceRight(pattern: string, replacement: string): SourceNode;
|
|
||||||
toString(): string;
|
|
||||||
toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;
|
|
||||||
}
|
|
8
node_modules/source-map/source-map.js
generated
vendored
8
node_modules/source-map/source-map.js
generated
vendored
|
@ -1,8 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2009-2011 Mozilla Foundation and contributors
|
|
||||||
* Licensed under the New BSD license. See LICENSE.txt or:
|
|
||||||
* http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
*/
|
|
||||||
exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
|
|
||||||
exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
|
|
||||||
exports.SourceNode = require('./lib/source-node').SourceNode;
|
|
29
node_modules/uglify-js/LICENSE
generated
vendored
29
node_modules/uglify-js/LICENSE
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
UglifyJS is released under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012-2019 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
1140
node_modules/uglify-js/README.md
generated
vendored
1140
node_modules/uglify-js/README.md
generated
vendored
File diff suppressed because it is too large
Load diff
419
node_modules/uglify-js/bin/uglifyjs
generated
vendored
419
node_modules/uglify-js/bin/uglifyjs
generated
vendored
|
@ -1,419 +0,0 @@
|
||||||
#! /usr/bin/env node
|
|
||||||
// -*- js -*-
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
require("../tools/exit");
|
|
||||||
|
|
||||||
var fs = require("fs");
|
|
||||||
var info = require("../package.json");
|
|
||||||
var path = require("path");
|
|
||||||
var program = require("commander");
|
|
||||||
var UglifyJS = require("../tools/node");
|
|
||||||
|
|
||||||
var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
|
||||||
var files = {};
|
|
||||||
var options = {
|
|
||||||
compress: false,
|
|
||||||
mangle: false
|
|
||||||
};
|
|
||||||
program.version(info.name + " " + info.version);
|
|
||||||
program.parseArgv = program.parse;
|
|
||||||
program.parse = undefined;
|
|
||||||
if (process.argv.indexOf("ast") >= 0) program.helpInformation = UglifyJS.describe_ast;
|
|
||||||
else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() {
|
|
||||||
var text = [];
|
|
||||||
var options = UglifyJS.default_options();
|
|
||||||
for (var option in options) {
|
|
||||||
text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:");
|
|
||||||
text.push(format_object(options[option]));
|
|
||||||
text.push("");
|
|
||||||
}
|
|
||||||
return text.join("\n");
|
|
||||||
};
|
|
||||||
program.option("-p, --parse <options>", "Specify parser options.", parse_js());
|
|
||||||
program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js());
|
|
||||||
program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js());
|
|
||||||
program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js());
|
|
||||||
program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js());
|
|
||||||
program.option("-o, --output <file>", "Output file (default STDOUT).");
|
|
||||||
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
|
||||||
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
|
||||||
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
|
||||||
program.option("-e, --enclose [arg[,...][:value[,...]]]", "Embed everything in a big function, with configurable argument(s) & value(s).");
|
|
||||||
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
|
||||||
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
|
||||||
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
|
||||||
program.option("--rename", "Force symbol expansion.");
|
|
||||||
program.option("--no-rename", "Disable symbol expansion.");
|
|
||||||
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
|
||||||
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
|
|
||||||
program.option("--timings", "Display operations run time on STDERR.");
|
|
||||||
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
|
||||||
program.option("--verbose", "Print diagnostic messages.");
|
|
||||||
program.option("--warn", "Print warning messages.");
|
|
||||||
program.option("--wrap <name>", "Embed everything as a function with “exports” corresponding to “name” globally.");
|
|
||||||
program.arguments("[files...]").parseArgv(process.argv);
|
|
||||||
if (program.configFile) {
|
|
||||||
options = JSON.parse(read_file(program.configFile));
|
|
||||||
if (options.mangle && options.mangle.properties && options.mangle.properties.regex) {
|
|
||||||
options.mangle.properties.regex = UglifyJS.parse(options.mangle.properties.regex, {
|
|
||||||
expression: true
|
|
||||||
}).getValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
|
||||||
fatal("cannot write source map to STDOUT");
|
|
||||||
}
|
|
||||||
[
|
|
||||||
"compress",
|
|
||||||
"enclose",
|
|
||||||
"ie8",
|
|
||||||
"mangle",
|
|
||||||
"sourceMap",
|
|
||||||
"toplevel",
|
|
||||||
"wrap"
|
|
||||||
].forEach(function(name) {
|
|
||||||
if (name in program) {
|
|
||||||
options[name] = program[name];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (program.verbose) {
|
|
||||||
options.warnings = "verbose";
|
|
||||||
} else if (program.warn) {
|
|
||||||
options.warnings = true;
|
|
||||||
}
|
|
||||||
if (options.warnings) {
|
|
||||||
UglifyJS.AST_Node.log_function(print_error, options.warnings == "verbose");
|
|
||||||
delete options.warnings;
|
|
||||||
}
|
|
||||||
if (program.beautify) {
|
|
||||||
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
|
||||||
if (!("beautify" in options.output)) {
|
|
||||||
options.output.beautify = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (program.comments) {
|
|
||||||
if (typeof options.output != "object") options.output = {};
|
|
||||||
options.output.comments = typeof program.comments == "string" ? program.comments : "some";
|
|
||||||
}
|
|
||||||
if (program.define) {
|
|
||||||
if (typeof options.compress != "object") options.compress = {};
|
|
||||||
if (typeof options.compress.global_defs != "object") options.compress.global_defs = {};
|
|
||||||
for (var expr in program.define) {
|
|
||||||
options.compress.global_defs[expr] = program.define[expr];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (program.keepFnames) {
|
|
||||||
options.keep_fnames = true;
|
|
||||||
}
|
|
||||||
if (program.mangleProps) {
|
|
||||||
if (program.mangleProps.domprops) {
|
|
||||||
delete program.mangleProps.domprops;
|
|
||||||
} else {
|
|
||||||
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
|
||||||
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
|
||||||
require("../tools/domprops").forEach(function(name) {
|
|
||||||
UglifyJS.push_uniq(program.mangleProps.reserved, name);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (typeof options.mangle != "object") options.mangle = {};
|
|
||||||
options.mangle.properties = program.mangleProps;
|
|
||||||
}
|
|
||||||
if (program.nameCache) {
|
|
||||||
options.nameCache = JSON.parse(read_file(program.nameCache, "{}"));
|
|
||||||
}
|
|
||||||
if (program.output == "ast") {
|
|
||||||
options.output = {
|
|
||||||
ast: true,
|
|
||||||
code: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (program.parse) {
|
|
||||||
if (!program.parse.acorn && !program.parse.spidermonkey) {
|
|
||||||
options.parse = program.parse;
|
|
||||||
} else if (program.sourceMap && program.sourceMap.content == "inline") {
|
|
||||||
fatal("inline source map only works with built-in parser");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (~program.rawArgs.indexOf("--rename")) {
|
|
||||||
options.rename = true;
|
|
||||||
} else if (!program.rename) {
|
|
||||||
options.rename = false;
|
|
||||||
}
|
|
||||||
var convert_path = function(name) {
|
|
||||||
return name;
|
|
||||||
};
|
|
||||||
if (typeof program.sourceMap == "object" && "base" in program.sourceMap) {
|
|
||||||
convert_path = function() {
|
|
||||||
var base = program.sourceMap.base;
|
|
||||||
delete options.sourceMap.base;
|
|
||||||
return function(name) {
|
|
||||||
return path.relative(base, name);
|
|
||||||
};
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
if (program.self) {
|
|
||||||
if (program.args.length) UglifyJS.AST_Node.warn("Ignoring input files since --self was passed");
|
|
||||||
if (!options.wrap) options.wrap = "UglifyJS";
|
|
||||||
simple_glob(UglifyJS.FILES).forEach(function(name) {
|
|
||||||
files[convert_path(name)] = read_file(name);
|
|
||||||
});
|
|
||||||
run();
|
|
||||||
} else if (program.args.length) {
|
|
||||||
simple_glob(program.args).forEach(function(name) {
|
|
||||||
files[convert_path(name)] = read_file(name);
|
|
||||||
});
|
|
||||||
run();
|
|
||||||
} else {
|
|
||||||
var chunks = [];
|
|
||||||
process.stdin.setEncoding("utf8");
|
|
||||||
process.stdin.on("data", function(chunk) {
|
|
||||||
chunks.push(chunk);
|
|
||||||
}).on("end", function() {
|
|
||||||
files = [ chunks.join("") ];
|
|
||||||
run();
|
|
||||||
});
|
|
||||||
process.stdin.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
function convert_ast(fn) {
|
|
||||||
return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null));
|
|
||||||
}
|
|
||||||
|
|
||||||
function run() {
|
|
||||||
var content = program.sourceMap && program.sourceMap.content;
|
|
||||||
if (content && content != "inline") {
|
|
||||||
UglifyJS.AST_Node.info("Using input source map: " + content);
|
|
||||||
options.sourceMap.content = read_file(content, content);
|
|
||||||
}
|
|
||||||
if (program.timings) options.timings = true;
|
|
||||||
try {
|
|
||||||
if (program.parse) {
|
|
||||||
if (program.parse.acorn) {
|
|
||||||
files = convert_ast(function(toplevel, name) {
|
|
||||||
return require("acorn").parse(files[name], {
|
|
||||||
locations: true,
|
|
||||||
program: toplevel,
|
|
||||||
sourceFile: name
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else if (program.parse.spidermonkey) {
|
|
||||||
files = convert_ast(function(toplevel, name) {
|
|
||||||
var obj = JSON.parse(files[name]);
|
|
||||||
if (!toplevel) return obj;
|
|
||||||
toplevel.body = toplevel.body.concat(obj.body);
|
|
||||||
return toplevel;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
fatal(ex);
|
|
||||||
}
|
|
||||||
var result = UglifyJS.minify(files, options);
|
|
||||||
if (result.error) {
|
|
||||||
var ex = result.error;
|
|
||||||
if (ex.name == "SyntaxError") {
|
|
||||||
print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col);
|
|
||||||
var file = files[ex.filename];
|
|
||||||
if (file) {
|
|
||||||
var col = ex.col;
|
|
||||||
var lines = file.split(/\r?\n/);
|
|
||||||
var line = lines[ex.line - 1];
|
|
||||||
if (!line && !col) {
|
|
||||||
line = lines[ex.line - 2];
|
|
||||||
col = line.length;
|
|
||||||
}
|
|
||||||
if (line) {
|
|
||||||
var limit = 70;
|
|
||||||
if (col > limit) {
|
|
||||||
line = line.slice(col - limit);
|
|
||||||
col = limit;
|
|
||||||
}
|
|
||||||
print_error(line.slice(0, 80));
|
|
||||||
print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ex.defs) {
|
|
||||||
print_error("Supported options:");
|
|
||||||
print_error(format_object(ex.defs));
|
|
||||||
}
|
|
||||||
fatal(ex);
|
|
||||||
} else if (program.output == "ast") {
|
|
||||||
if (!options.compress && !options.mangle) {
|
|
||||||
result.ast.figure_out_scope({});
|
|
||||||
}
|
|
||||||
print(JSON.stringify(result.ast, function(key, value) {
|
|
||||||
if (value) switch (key) {
|
|
||||||
case "thedef":
|
|
||||||
return symdef(value);
|
|
||||||
case "enclosed":
|
|
||||||
return value.length ? value.map(symdef) : undefined;
|
|
||||||
case "variables":
|
|
||||||
case "functions":
|
|
||||||
case "globals":
|
|
||||||
return value.size() ? value.map(symdef) : undefined;
|
|
||||||
}
|
|
||||||
if (skip_key(key)) return;
|
|
||||||
if (value instanceof UglifyJS.AST_Token) return;
|
|
||||||
if (value instanceof UglifyJS.Dictionary) return;
|
|
||||||
if (value instanceof UglifyJS.AST_Node) {
|
|
||||||
var result = {
|
|
||||||
_class: "AST_" + value.TYPE
|
|
||||||
};
|
|
||||||
value.CTOR.PROPS.forEach(function(prop) {
|
|
||||||
result[prop] = value[prop];
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}, 2));
|
|
||||||
} else if (program.output == "spidermonkey") {
|
|
||||||
print(JSON.stringify(UglifyJS.minify(result.code, {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
ast: true,
|
|
||||||
code: false
|
|
||||||
}
|
|
||||||
}).ast.to_mozilla_ast(), null, 2));
|
|
||||||
} else if (program.output) {
|
|
||||||
fs.writeFileSync(program.output, result.code);
|
|
||||||
if (result.map) {
|
|
||||||
fs.writeFileSync(program.output + ".map", result.map);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print(result.code);
|
|
||||||
}
|
|
||||||
if (program.nameCache) {
|
|
||||||
fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));
|
|
||||||
}
|
|
||||||
if (result.timings) for (var phase in result.timings) {
|
|
||||||
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function fatal(message) {
|
|
||||||
if (message instanceof Error) {
|
|
||||||
message = message.stack.replace(/^\S*?Error:/, "ERROR:")
|
|
||||||
} else {
|
|
||||||
message = "ERROR: " + message;
|
|
||||||
}
|
|
||||||
print_error(message);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// A file glob function that only supports "*" and "?" wildcards in the basename.
|
|
||||||
// Example: "foo/bar/*baz??.*.js"
|
|
||||||
// Argument `glob` may be a string or an array of strings.
|
|
||||||
// Returns an array of strings. Garbage in, garbage out.
|
|
||||||
function simple_glob(glob) {
|
|
||||||
if (Array.isArray(glob)) {
|
|
||||||
return [].concat.apply([], glob.map(simple_glob));
|
|
||||||
}
|
|
||||||
if (glob.match(/\*|\?/)) {
|
|
||||||
var dir = path.dirname(glob);
|
|
||||||
try {
|
|
||||||
var entries = fs.readdirSync(dir);
|
|
||||||
} catch (ex) {}
|
|
||||||
if (entries) {
|
|
||||||
var pattern = "^" + path.basename(glob)
|
|
||||||
.replace(/[.+^$[\]\\(){}]/g, "\\$&")
|
|
||||||
.replace(/\*/g, "[^/\\\\]*")
|
|
||||||
.replace(/\?/g, "[^/\\\\]") + "$";
|
|
||||||
var mod = process.platform === "win32" ? "i" : "";
|
|
||||||
var rx = new RegExp(pattern, mod);
|
|
||||||
var results = entries.filter(function(name) {
|
|
||||||
return rx.test(name);
|
|
||||||
}).map(function(name) {
|
|
||||||
return path.join(dir, name);
|
|
||||||
});
|
|
||||||
if (results.length) return results;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [ glob ];
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_file(path, default_value) {
|
|
||||||
try {
|
|
||||||
return fs.readFileSync(path, "utf8");
|
|
||||||
} catch (ex) {
|
|
||||||
if (ex.code == "ENOENT" && default_value != null) return default_value;
|
|
||||||
fatal(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse_js(flag) {
|
|
||||||
return function(value, options) {
|
|
||||||
options = options || {};
|
|
||||||
try {
|
|
||||||
UglifyJS.parse(value, {
|
|
||||||
expression: true
|
|
||||||
}).walk(new UglifyJS.TreeWalker(function(node) {
|
|
||||||
if (node instanceof UglifyJS.AST_Assign) {
|
|
||||||
var name = node.left.print_to_string();
|
|
||||||
var value = node.right;
|
|
||||||
if (flag) {
|
|
||||||
options[name] = value;
|
|
||||||
} else if (value instanceof UglifyJS.AST_Array) {
|
|
||||||
options[name] = value.elements.map(to_string);
|
|
||||||
} else {
|
|
||||||
options[name] = to_string(value);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) {
|
|
||||||
var name = node.print_to_string();
|
|
||||||
options[name] = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
|
|
||||||
|
|
||||||
function to_string(value) {
|
|
||||||
return value instanceof UglifyJS.AST_Constant ? value.getValue() : value.print_to_string({
|
|
||||||
quote_keys: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
} catch (ex) {
|
|
||||||
if (flag) {
|
|
||||||
fatal("cannot parse arguments for '" + flag + "': " + value);
|
|
||||||
} else {
|
|
||||||
options[value] = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function skip_key(key) {
|
|
||||||
return skip_keys.indexOf(key) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function symdef(def) {
|
|
||||||
var ret = (1e6 + def.id) + " " + def.name;
|
|
||||||
if (def.mangled_name) ret += " " + def.mangled_name;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function format_object(obj) {
|
|
||||||
var lines = [];
|
|
||||||
var padding = "";
|
|
||||||
Object.keys(obj).map(function(name) {
|
|
||||||
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
|
||||||
return [ name, JSON.stringify(obj[name]) ];
|
|
||||||
}).forEach(function(tokens) {
|
|
||||||
lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
|
|
||||||
});
|
|
||||||
return lines.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_error(msg) {
|
|
||||||
process.stderr.write(msg);
|
|
||||||
process.stderr.write("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
function print(txt) {
|
|
||||||
process.stdout.write(txt);
|
|
||||||
process.stdout.write("\n");
|
|
||||||
}
|
|
996
node_modules/uglify-js/lib/ast.js
generated
vendored
996
node_modules/uglify-js/lib/ast.js
generated
vendored
|
@ -1,996 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function DEFNODE(type, props, methods, base) {
|
|
||||||
if (typeof base === "undefined") base = AST_Node;
|
|
||||||
props = props ? props.split(/\s+/) : [];
|
|
||||||
var self_props = props;
|
|
||||||
if (base && base.PROPS) props = props.concat(base.PROPS);
|
|
||||||
var code = [
|
|
||||||
"return function AST_", type, "(props){",
|
|
||||||
"if(props){",
|
|
||||||
];
|
|
||||||
props.forEach(function(prop) {
|
|
||||||
code.push("this.", prop, "=props.", prop, ";");
|
|
||||||
});
|
|
||||||
var proto = base && new base;
|
|
||||||
if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
|
|
||||||
code.push("}}");
|
|
||||||
var ctor = new Function(code.join(""))();
|
|
||||||
if (proto) {
|
|
||||||
ctor.prototype = proto;
|
|
||||||
ctor.BASE = base;
|
|
||||||
}
|
|
||||||
if (base) base.SUBCLASSES.push(ctor);
|
|
||||||
ctor.prototype.CTOR = ctor;
|
|
||||||
ctor.PROPS = props || null;
|
|
||||||
ctor.SELF_PROPS = self_props;
|
|
||||||
ctor.SUBCLASSES = [];
|
|
||||||
if (type) {
|
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
|
||||||
}
|
|
||||||
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
|
||||||
if (/^\$/.test(name)) {
|
|
||||||
ctor[name.substr(1)] = methods[name];
|
|
||||||
} else {
|
|
||||||
ctor.prototype[name] = methods[name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ctor.DEFMETHOD = function(name, method) {
|
|
||||||
this.prototype[name] = method;
|
|
||||||
};
|
|
||||||
if (typeof exports !== "undefined") {
|
|
||||||
exports["AST_" + type] = ctor;
|
|
||||||
}
|
|
||||||
return ctor;
|
|
||||||
}
|
|
||||||
|
|
||||||
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
|
||||||
}, null);
|
|
||||||
|
|
||||||
var AST_Node = DEFNODE("Node", "start end", {
|
|
||||||
_clone: function(deep) {
|
|
||||||
if (deep) {
|
|
||||||
var self = this.clone();
|
|
||||||
return self.transform(new TreeTransformer(function(node) {
|
|
||||||
if (node !== self) {
|
|
||||||
return node.clone(true);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return new this.CTOR(this);
|
|
||||||
},
|
|
||||||
clone: function(deep) {
|
|
||||||
return this._clone(deep);
|
|
||||||
},
|
|
||||||
$documentation: "Base class of all AST nodes",
|
|
||||||
$propdoc: {
|
|
||||||
start: "[AST_Token] The first token of this node",
|
|
||||||
end: "[AST_Token] The last token of this node"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this);
|
|
||||||
},
|
|
||||||
walk: function(visitor) {
|
|
||||||
return this._walk(visitor); // not sure the indirection will be any help
|
|
||||||
}
|
|
||||||
}, null);
|
|
||||||
|
|
||||||
(AST_Node.log_function = function(fn, verbose) {
|
|
||||||
var printed = Object.create(null);
|
|
||||||
if (fn) {
|
|
||||||
AST_Node.info = verbose ? function(text, props) {
|
|
||||||
log("INFO: " + string_template(text, props));
|
|
||||||
} : noop;
|
|
||||||
AST_Node.warn = function(text, props) {
|
|
||||||
log("WARN: " + string_template(text, props));
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
AST_Node.info = AST_Node.warn = noop;
|
|
||||||
}
|
|
||||||
|
|
||||||
function log(msg) {
|
|
||||||
if (printed[msg]) return;
|
|
||||||
printed[msg] = true;
|
|
||||||
fn(msg);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
/* -----[ statements ]----- */
|
|
||||||
|
|
||||||
var AST_Statement = DEFNODE("Statement", null, {
|
|
||||||
$documentation: "Base class of all statements",
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Debugger = DEFNODE("Debugger", null, {
|
|
||||||
$documentation: "Represents a debugger statement",
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_Directive = DEFNODE("Directive", "value quote", {
|
|
||||||
$documentation: "Represents a directive, like \"use strict\";",
|
|
||||||
$propdoc: {
|
|
||||||
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
|
||||||
quote: "[string] the original quote character"
|
|
||||||
},
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|
||||||
$documentation: "A statement consisting of an expression, i.e. a = 1 + 2",
|
|
||||||
$propdoc: {
|
|
||||||
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
function walk_body(node, visitor) {
|
|
||||||
var body = node.body;
|
|
||||||
if (body instanceof AST_Statement) {
|
|
||||||
body._walk(visitor);
|
|
||||||
} else body.forEach(function(node) {
|
|
||||||
node._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var AST_Block = DEFNODE("Block", "body", {
|
|
||||||
$documentation: "A body of statements (usually braced)",
|
|
||||||
$propdoc: {
|
|
||||||
body: "[AST_Statement*] an array of statements"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
walk_body(this, visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_BlockStatement = DEFNODE("BlockStatement", null, {
|
|
||||||
$documentation: "A block statement",
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
|
||||||
$documentation: "The empty statement (empty block or simply a semicolon)"
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
|
||||||
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
|
||||||
$propdoc: {
|
|
||||||
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|
||||||
$documentation: "Statement with a label",
|
|
||||||
$propdoc: {
|
|
||||||
label: "[AST_Label] a label definition"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.label._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
clone: function(deep) {
|
|
||||||
var node = this._clone(deep);
|
|
||||||
if (deep) {
|
|
||||||
var label = node.label;
|
|
||||||
var def = this.label;
|
|
||||||
node.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) {
|
|
||||||
node.label.thedef = label;
|
|
||||||
label.references.push(node);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
}, AST_StatementWithBody);
|
|
||||||
|
|
||||||
var AST_IterationStatement = DEFNODE("IterationStatement", null, {
|
|
||||||
$documentation: "Internal class. All loops inherit from it."
|
|
||||||
}, AST_StatementWithBody);
|
|
||||||
|
|
||||||
var AST_DWLoop = DEFNODE("DWLoop", "condition", {
|
|
||||||
$documentation: "Base class for do/while statements",
|
|
||||||
$propdoc: {
|
|
||||||
condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement"
|
|
||||||
}
|
|
||||||
}, AST_IterationStatement);
|
|
||||||
|
|
||||||
var AST_Do = DEFNODE("Do", null, {
|
|
||||||
$documentation: "A `do` statement",
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.body._walk(visitor);
|
|
||||||
this.condition._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_DWLoop);
|
|
||||||
|
|
||||||
var AST_While = DEFNODE("While", null, {
|
|
||||||
$documentation: "A `while` statement",
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.condition._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_DWLoop);
|
|
||||||
|
|
||||||
var AST_For = DEFNODE("For", "init condition step", {
|
|
||||||
$documentation: "A `for` statement",
|
|
||||||
$propdoc: {
|
|
||||||
init: "[AST_Node?] the `for` initialization code, or null if empty",
|
|
||||||
condition: "[AST_Node?] the `for` termination clause, or null if empty",
|
|
||||||
step: "[AST_Node?] the `for` update clause, or null if empty"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
if (this.init) this.init._walk(visitor);
|
|
||||||
if (this.condition) this.condition._walk(visitor);
|
|
||||||
if (this.step) this.step._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_IterationStatement);
|
|
||||||
|
|
||||||
var AST_ForIn = DEFNODE("ForIn", "init object", {
|
|
||||||
$documentation: "A `for ... in` statement",
|
|
||||||
$propdoc: {
|
|
||||||
init: "[AST_Node] the `for/in` initialization code",
|
|
||||||
object: "[AST_Node] the object that we're looping through"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.init._walk(visitor);
|
|
||||||
this.object._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_IterationStatement);
|
|
||||||
|
|
||||||
var AST_With = DEFNODE("With", "expression", {
|
|
||||||
$documentation: "A `with` statement",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] the `with` expression"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_StatementWithBody);
|
|
||||||
|
|
||||||
/* -----[ scope and functions ]----- */
|
|
||||||
|
|
||||||
var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", {
|
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
|
||||||
$propdoc: {
|
|
||||||
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
|
||||||
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
|
||||||
uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`",
|
|
||||||
parent_scope: "[AST_Scope?/S] link to the parent scope",
|
|
||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
|
||||||
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
|
||||||
},
|
|
||||||
clone: function(deep) {
|
|
||||||
var node = this._clone(deep);
|
|
||||||
if (this.variables) node.variables = this.variables.clone();
|
|
||||||
if (this.functions) node.functions = this.functions.clone();
|
|
||||||
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
|
||||||
return node;
|
|
||||||
},
|
|
||||||
pinned: function() {
|
|
||||||
return this.uses_eval || this.uses_with;
|
|
||||||
}
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|
||||||
$documentation: "The toplevel scope",
|
|
||||||
$propdoc: {
|
|
||||||
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
|
||||||
},
|
|
||||||
wrap: function(name) {
|
|
||||||
var body = this.body;
|
|
||||||
return parse([
|
|
||||||
"(function(exports){'$ORIG';})(typeof ",
|
|
||||||
name,
|
|
||||||
"=='undefined'?(",
|
|
||||||
name,
|
|
||||||
"={}):",
|
|
||||||
name,
|
|
||||||
");"
|
|
||||||
].join(""), {
|
|
||||||
filename: "wrap=" + JSON.stringify(name)
|
|
||||||
}).transform(new TreeTransformer(function(node) {
|
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
|
||||||
return MAP.splice(body);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
enclose: function(args_values) {
|
|
||||||
if (typeof args_values != "string") args_values = "";
|
|
||||||
var index = args_values.indexOf(":");
|
|
||||||
if (index < 0) index = args_values.length;
|
|
||||||
var body = this.body;
|
|
||||||
return parse([
|
|
||||||
"(function(",
|
|
||||||
args_values.slice(0, index),
|
|
||||||
'){"$ORIG"})(',
|
|
||||||
args_values.slice(index + 1),
|
|
||||||
")"
|
|
||||||
].join(""), {
|
|
||||||
filename: "enclose=" + JSON.stringify(args_values)
|
|
||||||
}).transform(new TreeTransformer(function(node) {
|
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
|
||||||
return MAP.splice(body);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}, AST_Scope);
|
|
||||||
|
|
||||||
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments length_read", {
|
|
||||||
$documentation: "Base class for functions",
|
|
||||||
$propdoc: {
|
|
||||||
name: "[AST_SymbolDeclaration?] the name of this function",
|
|
||||||
argnames: "[AST_SymbolFunarg*] array of function arguments",
|
|
||||||
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
if (this.name) this.name._walk(visitor);
|
|
||||||
this.argnames.forEach(function(argname) {
|
|
||||||
argname._walk(visitor);
|
|
||||||
});
|
|
||||||
walk_body(this, visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Scope);
|
|
||||||
|
|
||||||
var AST_Accessor = DEFNODE("Accessor", null, {
|
|
||||||
$documentation: "A setter/getter function. The `name` property is always null."
|
|
||||||
}, AST_Lambda);
|
|
||||||
|
|
||||||
var AST_Function = DEFNODE("Function", "inlined", {
|
|
||||||
$documentation: "A function expression"
|
|
||||||
}, AST_Lambda);
|
|
||||||
|
|
||||||
var AST_Defun = DEFNODE("Defun", "inlined", {
|
|
||||||
$documentation: "A function definition"
|
|
||||||
}, AST_Lambda);
|
|
||||||
|
|
||||||
/* -----[ JUMPS ]----- */
|
|
||||||
|
|
||||||
var AST_Jump = DEFNODE("Jump", null, {
|
|
||||||
$documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)"
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_Exit = DEFNODE("Exit", "value", {
|
|
||||||
$documentation: "Base class for “exits” (`return` and `throw`)",
|
|
||||||
$propdoc: {
|
|
||||||
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, this.value && function() {
|
|
||||||
this.value._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Jump);
|
|
||||||
|
|
||||||
var AST_Return = DEFNODE("Return", null, {
|
|
||||||
$documentation: "A `return` statement"
|
|
||||||
}, AST_Exit);
|
|
||||||
|
|
||||||
var AST_Throw = DEFNODE("Throw", null, {
|
|
||||||
$documentation: "A `throw` statement"
|
|
||||||
}, AST_Exit);
|
|
||||||
|
|
||||||
var AST_LoopControl = DEFNODE("LoopControl", "label", {
|
|
||||||
$documentation: "Base class for loop control statements (`break` and `continue`)",
|
|
||||||
$propdoc: {
|
|
||||||
label: "[AST_LabelRef?] the label, or null if none",
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, this.label && function() {
|
|
||||||
this.label._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Jump);
|
|
||||||
|
|
||||||
var AST_Break = DEFNODE("Break", null, {
|
|
||||||
$documentation: "A `break` statement"
|
|
||||||
}, AST_LoopControl);
|
|
||||||
|
|
||||||
var AST_Continue = DEFNODE("Continue", null, {
|
|
||||||
$documentation: "A `continue` statement"
|
|
||||||
}, AST_LoopControl);
|
|
||||||
|
|
||||||
/* -----[ IF ]----- */
|
|
||||||
|
|
||||||
var AST_If = DEFNODE("If", "condition alternative", {
|
|
||||||
$documentation: "A `if` statement",
|
|
||||||
$propdoc: {
|
|
||||||
condition: "[AST_Node] the `if` condition",
|
|
||||||
alternative: "[AST_Statement?] the `else` part, or null if not present"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.condition._walk(visitor);
|
|
||||||
this.body._walk(visitor);
|
|
||||||
if (this.alternative) this.alternative._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_StatementWithBody);
|
|
||||||
|
|
||||||
/* -----[ SWITCH ]----- */
|
|
||||||
|
|
||||||
var AST_Switch = DEFNODE("Switch", "expression", {
|
|
||||||
$documentation: "A `switch` statement",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] the `switch` “discriminant”"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
walk_body(this, visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_SwitchBranch = DEFNODE("SwitchBranch", null, {
|
|
||||||
$documentation: "Base class for `switch` branches",
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_Default = DEFNODE("Default", null, {
|
|
||||||
$documentation: "A `default` switch branch",
|
|
||||||
}, AST_SwitchBranch);
|
|
||||||
|
|
||||||
var AST_Case = DEFNODE("Case", "expression", {
|
|
||||||
$documentation: "A `case` switch branch",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] the `case` expression"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
walk_body(this, visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_SwitchBranch);
|
|
||||||
|
|
||||||
/* -----[ EXCEPTIONS ]----- */
|
|
||||||
|
|
||||||
var AST_Try = DEFNODE("Try", "bcatch bfinally", {
|
|
||||||
$documentation: "A `try` statement",
|
|
||||||
$propdoc: {
|
|
||||||
bcatch: "[AST_Catch?] the catch block, or null if not present",
|
|
||||||
bfinally: "[AST_Finally?] the finally block, or null if not present"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
walk_body(this, visitor);
|
|
||||||
if (this.bcatch) this.bcatch._walk(visitor);
|
|
||||||
if (this.bfinally) this.bfinally._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_Catch = DEFNODE("Catch", "argname", {
|
|
||||||
$documentation: "A `catch` node; only makes sense as part of a `try` statement",
|
|
||||||
$propdoc: {
|
|
||||||
argname: "[AST_SymbolCatch] symbol for the exception"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.argname._walk(visitor);
|
|
||||||
walk_body(this, visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
var AST_Finally = DEFNODE("Finally", null, {
|
|
||||||
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
|
|
||||||
}, AST_Block);
|
|
||||||
|
|
||||||
/* -----[ VAR ]----- */
|
|
||||||
|
|
||||||
var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
|
||||||
$documentation: "Base class for `var` nodes (variable declarations/initializations)",
|
|
||||||
$propdoc: {
|
|
||||||
definitions: "[AST_VarDef*] array of variable definitions"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.definitions.forEach(function(defn) {
|
|
||||||
defn._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
|
||||||
|
|
||||||
var AST_Var = DEFNODE("Var", null, {
|
|
||||||
$documentation: "A `var` statement"
|
|
||||||
}, AST_Definitions);
|
|
||||||
|
|
||||||
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
|
||||||
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
|
||||||
$propdoc: {
|
|
||||||
name: "[AST_SymbolVar] name of the variable",
|
|
||||||
value: "[AST_Node?] initializer, or null of there's no initializer"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.name._walk(visitor);
|
|
||||||
if (this.value) this.value._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -----[ OTHER ]----- */
|
|
||||||
|
|
||||||
var AST_Call = DEFNODE("Call", "expression args", {
|
|
||||||
$documentation: "A function call expression",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] expression to invoke as function",
|
|
||||||
args: "[AST_Node*] array of arguments"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
this.args.forEach(function(node) {
|
|
||||||
node._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_New = DEFNODE("New", null, {
|
|
||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
|
||||||
}, AST_Call);
|
|
||||||
|
|
||||||
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
|
||||||
$documentation: "A sequence expression (comma-separated expressions)",
|
|
||||||
$propdoc: {
|
|
||||||
expressions: "[AST_Node*] array of expressions (at least two)"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expressions.forEach(function(node) {
|
|
||||||
node._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
|
|
||||||
$documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
|
|
||||||
$propdoc: {
|
|
||||||
expression: "[AST_Node] the “container” expression",
|
|
||||||
property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node"
|
|
||||||
},
|
|
||||||
getProperty: function() {
|
|
||||||
var p = this.property;
|
|
||||||
if (p instanceof AST_Constant) {
|
|
||||||
return p.getValue();
|
|
||||||
}
|
|
||||||
if (p instanceof AST_UnaryPrefix
|
|
||||||
&& p.operator == "void"
|
|
||||||
&& p.expression instanceof AST_Constant) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Dot = DEFNODE("Dot", null, {
|
|
||||||
$documentation: "A dotted property access expression",
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_PropAccess);
|
|
||||||
|
|
||||||
var AST_Sub = DEFNODE("Sub", null, {
|
|
||||||
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
this.property._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, AST_PropAccess);
|
|
||||||
|
|
||||||
var AST_Unary = DEFNODE("Unary", "operator expression", {
|
|
||||||
$documentation: "Base class for unary expressions",
|
|
||||||
$propdoc: {
|
|
||||||
operator: "[string] the operator",
|
|
||||||
expression: "[AST_Node] expression that this unary operator applies to"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.expression._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, {
|
|
||||||
$documentation: "Unary prefix expression, i.e. `typeof i` or `++i`"
|
|
||||||
}, AST_Unary);
|
|
||||||
|
|
||||||
var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
|
|
||||||
$documentation: "Unary postfix expression, i.e. `i++`"
|
|
||||||
}, AST_Unary);
|
|
||||||
|
|
||||||
var AST_Binary = DEFNODE("Binary", "operator left right", {
|
|
||||||
$documentation: "Binary expression, i.e. `a + b`",
|
|
||||||
$propdoc: {
|
|
||||||
left: "[AST_Node] left-hand side expression",
|
|
||||||
operator: "[string] the operator",
|
|
||||||
right: "[AST_Node] right-hand side expression"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.left._walk(visitor);
|
|
||||||
this.right._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", {
|
|
||||||
$documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`",
|
|
||||||
$propdoc: {
|
|
||||||
condition: "[AST_Node]",
|
|
||||||
consequent: "[AST_Node]",
|
|
||||||
alternative: "[AST_Node]"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.condition._walk(visitor);
|
|
||||||
this.consequent._walk(visitor);
|
|
||||||
this.alternative._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Assign = DEFNODE("Assign", null, {
|
|
||||||
$documentation: "An assignment expression — `a = b + 5`",
|
|
||||||
}, AST_Binary);
|
|
||||||
|
|
||||||
/* -----[ LITERALS ]----- */
|
|
||||||
|
|
||||||
var AST_Array = DEFNODE("Array", "elements", {
|
|
||||||
$documentation: "An array literal",
|
|
||||||
$propdoc: {
|
|
||||||
elements: "[AST_Node*] array of elements"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.elements.forEach(function(element) {
|
|
||||||
element._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_Object = DEFNODE("Object", "properties", {
|
|
||||||
$documentation: "An object literal",
|
|
||||||
$propdoc: {
|
|
||||||
properties: "[AST_ObjectProperty*] array of properties"
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.properties.forEach(function(prop) {
|
|
||||||
prop._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
|
||||||
$documentation: "Base class for literal object properties",
|
|
||||||
$propdoc: {
|
|
||||||
key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.",
|
|
||||||
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function() {
|
|
||||||
this.value._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
|
||||||
$documentation: "A key: value object property",
|
|
||||||
$propdoc: {
|
|
||||||
quote: "[string] the original quote character"
|
|
||||||
}
|
|
||||||
}, AST_ObjectProperty);
|
|
||||||
|
|
||||||
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
|
||||||
$documentation: "An object setter property",
|
|
||||||
}, AST_ObjectProperty);
|
|
||||||
|
|
||||||
var AST_ObjectGetter = DEFNODE("ObjectGetter", null, {
|
|
||||||
$documentation: "An object getter property",
|
|
||||||
}, AST_ObjectProperty);
|
|
||||||
|
|
||||||
var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
|
|
||||||
$propdoc: {
|
|
||||||
name: "[string] name of this symbol",
|
|
||||||
scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)",
|
|
||||||
thedef: "[SymbolDef/S] the definition of this symbol"
|
|
||||||
},
|
|
||||||
$documentation: "Base class for all symbols",
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
|
||||||
$documentation: "The name of a property accessor (setter/getter function)"
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
|
||||||
$documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)",
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
|
||||||
$documentation: "Symbol defining a variable",
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
|
||||||
$documentation: "Symbol naming a function argument",
|
|
||||||
}, AST_SymbolVar);
|
|
||||||
|
|
||||||
var AST_SymbolDefun = DEFNODE("SymbolDefun", null, {
|
|
||||||
$documentation: "Symbol defining a function",
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
|
||||||
$documentation: "Symbol naming a function expression",
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
|
|
||||||
$documentation: "Symbol naming the exception in catch",
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_Label = DEFNODE("Label", "references", {
|
|
||||||
$documentation: "Symbol naming a label (declaration)",
|
|
||||||
$propdoc: {
|
|
||||||
references: "[AST_LoopControl*] a list of nodes referring to this label"
|
|
||||||
},
|
|
||||||
initialize: function() {
|
|
||||||
this.references = [];
|
|
||||||
this.thedef = this;
|
|
||||||
}
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_SymbolRef = DEFNODE("SymbolRef", "fixed", {
|
|
||||||
$documentation: "Reference to some symbol (not definition/declaration)",
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_LabelRef = DEFNODE("LabelRef", null, {
|
|
||||||
$documentation: "Reference to a label symbol",
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_This = DEFNODE("This", null, {
|
|
||||||
$documentation: "The `this` symbol",
|
|
||||||
}, AST_Symbol);
|
|
||||||
|
|
||||||
var AST_Constant = DEFNODE("Constant", null, {
|
|
||||||
$documentation: "Base class for all constants",
|
|
||||||
getValue: function() {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AST_String = DEFNODE("String", "value quote", {
|
|
||||||
$documentation: "A string literal",
|
|
||||||
$propdoc: {
|
|
||||||
value: "[string] the contents of this string",
|
|
||||||
quote: "[string] the original quote character"
|
|
||||||
}
|
|
||||||
}, AST_Constant);
|
|
||||||
|
|
||||||
var AST_Number = DEFNODE("Number", "value", {
|
|
||||||
$documentation: "A number literal",
|
|
||||||
$propdoc: {
|
|
||||||
value: "[number] the numeric value",
|
|
||||||
}
|
|
||||||
}, AST_Constant);
|
|
||||||
|
|
||||||
var AST_RegExp = DEFNODE("RegExp", "value", {
|
|
||||||
$documentation: "A regexp literal",
|
|
||||||
$propdoc: {
|
|
||||||
value: "[RegExp] the actual regexp"
|
|
||||||
}
|
|
||||||
}, AST_Constant);
|
|
||||||
|
|
||||||
var AST_Atom = DEFNODE("Atom", null, {
|
|
||||||
$documentation: "Base class for atoms",
|
|
||||||
}, AST_Constant);
|
|
||||||
|
|
||||||
var AST_Null = DEFNODE("Null", null, {
|
|
||||||
$documentation: "The `null` atom",
|
|
||||||
value: null
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_NaN = DEFNODE("NaN", null, {
|
|
||||||
$documentation: "The impossible value",
|
|
||||||
value: 0/0
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_Undefined = DEFNODE("Undefined", null, {
|
|
||||||
$documentation: "The `undefined` value",
|
|
||||||
value: function(){}()
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_Hole = DEFNODE("Hole", null, {
|
|
||||||
$documentation: "A hole in an array",
|
|
||||||
value: function(){}()
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_Infinity = DEFNODE("Infinity", null, {
|
|
||||||
$documentation: "The `Infinity` value",
|
|
||||||
value: 1/0
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_Boolean = DEFNODE("Boolean", null, {
|
|
||||||
$documentation: "Base class for booleans",
|
|
||||||
}, AST_Atom);
|
|
||||||
|
|
||||||
var AST_False = DEFNODE("False", null, {
|
|
||||||
$documentation: "The `false` atom",
|
|
||||||
value: false
|
|
||||||
}, AST_Boolean);
|
|
||||||
|
|
||||||
var AST_True = DEFNODE("True", null, {
|
|
||||||
$documentation: "The `true` atom",
|
|
||||||
value: true
|
|
||||||
}, AST_Boolean);
|
|
||||||
|
|
||||||
/* -----[ TreeWalker ]----- */
|
|
||||||
|
|
||||||
function TreeWalker(callback) {
|
|
||||||
this.visit = callback;
|
|
||||||
this.stack = [];
|
|
||||||
this.directives = Object.create(null);
|
|
||||||
}
|
|
||||||
TreeWalker.prototype = {
|
|
||||||
_visit: function(node, descend) {
|
|
||||||
this.push(node);
|
|
||||||
var ret = this.visit(node, descend ? function() {
|
|
||||||
descend.call(node);
|
|
||||||
} : noop);
|
|
||||||
if (!ret && descend) {
|
|
||||||
descend.call(node);
|
|
||||||
}
|
|
||||||
this.pop();
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
parent: function(n) {
|
|
||||||
return this.stack[this.stack.length - 2 - (n || 0)];
|
|
||||||
},
|
|
||||||
push: function(node) {
|
|
||||||
if (node instanceof AST_Lambda) {
|
|
||||||
this.directives = Object.create(this.directives);
|
|
||||||
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
|
||||||
this.directives[node.value] = node;
|
|
||||||
}
|
|
||||||
this.stack.push(node);
|
|
||||||
},
|
|
||||||
pop: function() {
|
|
||||||
if (this.stack.pop() instanceof AST_Lambda) {
|
|
||||||
this.directives = Object.getPrototypeOf(this.directives);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
self: function() {
|
|
||||||
return this.stack[this.stack.length - 1];
|
|
||||||
},
|
|
||||||
find_parent: function(type) {
|
|
||||||
var stack = this.stack;
|
|
||||||
for (var i = stack.length; --i >= 0;) {
|
|
||||||
var x = stack[i];
|
|
||||||
if (x instanceof type) return x;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
has_directive: function(type) {
|
|
||||||
var dir = this.directives[type];
|
|
||||||
if (dir) return dir;
|
|
||||||
var node = this.stack[this.stack.length - 1];
|
|
||||||
if (node instanceof AST_Scope) {
|
|
||||||
for (var i = 0; i < node.body.length; ++i) {
|
|
||||||
var st = node.body[i];
|
|
||||||
if (!(st instanceof AST_Directive)) break;
|
|
||||||
if (st.value == type) return st;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
loopcontrol_target: function(node) {
|
|
||||||
var stack = this.stack;
|
|
||||||
if (node.label) for (var i = stack.length; --i >= 0;) {
|
|
||||||
var x = stack[i];
|
|
||||||
if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)
|
|
||||||
return x.body;
|
|
||||||
} else for (var i = stack.length; --i >= 0;) {
|
|
||||||
var x = stack[i];
|
|
||||||
if (x instanceof AST_IterationStatement
|
|
||||||
|| node instanceof AST_Break && x instanceof AST_Switch)
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
in_boolean_context: function() {
|
|
||||||
var self = this.self();
|
|
||||||
for (var i = 0, p; p = this.parent(i); i++) {
|
|
||||||
if (p instanceof AST_SimpleStatement
|
|
||||||
|| p instanceof AST_Conditional && p.condition === self
|
|
||||||
|| p instanceof AST_DWLoop && p.condition === self
|
|
||||||
|| p instanceof AST_For && p.condition === self
|
|
||||||
|| p instanceof AST_If && p.condition === self
|
|
||||||
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
|
|
||||||
|| p instanceof AST_Conditional
|
|
||||||
|| p.tail_node() === self) {
|
|
||||||
self = p;
|
|
||||||
} else if (p instanceof AST_Return) {
|
|
||||||
var fn;
|
|
||||||
do {
|
|
||||||
fn = this.parent(++i);
|
|
||||||
if (!fn) return false;
|
|
||||||
} while (!(fn instanceof AST_Lambda));
|
|
||||||
if (fn.name) return false;
|
|
||||||
self = this.parent(++i);
|
|
||||||
if (!self || self.TYPE != "Call" || self.expression !== fn) return false;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
7180
node_modules/uglify-js/lib/compress.js
generated
vendored
7180
node_modules/uglify-js/lib/compress.js
generated
vendored
File diff suppressed because it is too large
Load diff
264
node_modules/uglify-js/lib/minify.js
generated
vendored
264
node_modules/uglify-js/lib/minify.js
generated
vendored
|
@ -1,264 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var to_ascii, to_base64;
|
|
||||||
if (typeof Buffer == "undefined") {
|
|
||||||
to_ascii = atob;
|
|
||||||
to_base64 = btoa;
|
|
||||||
} else if (typeof Buffer.alloc == "undefined") {
|
|
||||||
to_ascii = function(b64) {
|
|
||||||
return new Buffer(b64, "base64").toString();
|
|
||||||
};
|
|
||||||
to_base64 = function(str) {
|
|
||||||
return new Buffer(str).toString("base64");
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
to_ascii = function(b64) {
|
|
||||||
return Buffer.from(b64, "base64").toString();
|
|
||||||
};
|
|
||||||
to_base64 = function(str) {
|
|
||||||
return Buffer.from(str).toString("base64");
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_source_map(name, toplevel) {
|
|
||||||
var comments = toplevel.end.comments_after;
|
|
||||||
for (var i = comments.length; --i >= 0;) {
|
|
||||||
var comment = comments[i];
|
|
||||||
if (comment.type != "comment1") break;
|
|
||||||
var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value);
|
|
||||||
if (!match) break;
|
|
||||||
if (match[1] == "sourceMappingURL") {
|
|
||||||
match = /^data:application\/json(;.*?)?;base64,(\S+)$/.exec(match[2]);
|
|
||||||
if (!match) break;
|
|
||||||
return to_ascii(match[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AST_Node.warn("inline source map not found: " + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse_source_map(content) {
|
|
||||||
try {
|
|
||||||
return JSON.parse(content);
|
|
||||||
} catch (ex) {
|
|
||||||
throw new Error("invalid input source map: " + content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_shorthand(name, options, keys) {
|
|
||||||
if (options[name]) {
|
|
||||||
keys.forEach(function(key) {
|
|
||||||
if (options[key]) {
|
|
||||||
if (typeof options[key] != "object") options[key] = {};
|
|
||||||
if (!(name in options[key])) options[key][name] = options[name];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function init_cache(cache) {
|
|
||||||
if (!cache) return;
|
|
||||||
if (!("props" in cache)) {
|
|
||||||
cache.props = new Dictionary();
|
|
||||||
} else if (!(cache.props instanceof Dictionary)) {
|
|
||||||
cache.props = Dictionary.fromObject(cache.props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_json(cache) {
|
|
||||||
return {
|
|
||||||
props: cache.props.toObject()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function minify(files, options) {
|
|
||||||
try {
|
|
||||||
options = defaults(options, {
|
|
||||||
compress: {},
|
|
||||||
enclose: false,
|
|
||||||
ie8: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
mangle: {},
|
|
||||||
nameCache: null,
|
|
||||||
output: {},
|
|
||||||
parse: {},
|
|
||||||
rename: undefined,
|
|
||||||
sourceMap: false,
|
|
||||||
timings: false,
|
|
||||||
toplevel: false,
|
|
||||||
warnings: false,
|
|
||||||
wrap: false,
|
|
||||||
}, true);
|
|
||||||
var timings = options.timings && {
|
|
||||||
start: Date.now()
|
|
||||||
};
|
|
||||||
if (options.rename === undefined) {
|
|
||||||
options.rename = options.compress && options.mangle;
|
|
||||||
}
|
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
|
||||||
var quoted_props;
|
|
||||||
if (options.mangle) {
|
|
||||||
options.mangle = defaults(options.mangle, {
|
|
||||||
cache: options.nameCache && (options.nameCache.vars || {}),
|
|
||||||
eval: false,
|
|
||||||
ie8: false,
|
|
||||||
keep_fnames: false,
|
|
||||||
properties: false,
|
|
||||||
reserved: [],
|
|
||||||
toplevel: false,
|
|
||||||
}, true);
|
|
||||||
if (options.mangle.properties) {
|
|
||||||
if (typeof options.mangle.properties != "object") {
|
|
||||||
options.mangle.properties = {};
|
|
||||||
}
|
|
||||||
if (options.mangle.properties.keep_quoted) {
|
|
||||||
quoted_props = options.mangle.properties.reserved;
|
|
||||||
if (!Array.isArray(quoted_props)) quoted_props = [];
|
|
||||||
options.mangle.properties.reserved = quoted_props;
|
|
||||||
}
|
|
||||||
if (options.nameCache && !("cache" in options.mangle.properties)) {
|
|
||||||
options.mangle.properties.cache = options.nameCache.props || {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
init_cache(options.mangle.cache);
|
|
||||||
init_cache(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
if (options.sourceMap) {
|
|
||||||
options.sourceMap = defaults(options.sourceMap, {
|
|
||||||
content: null,
|
|
||||||
filename: null,
|
|
||||||
includeSources: false,
|
|
||||||
root: null,
|
|
||||||
url: null,
|
|
||||||
}, true);
|
|
||||||
}
|
|
||||||
var warnings = [];
|
|
||||||
if (options.warnings) AST_Node.log_function(function(warning) {
|
|
||||||
warnings.push(warning);
|
|
||||||
}, options.warnings == "verbose");
|
|
||||||
if (timings) timings.parse = Date.now();
|
|
||||||
var source_maps, toplevel;
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
toplevel = files;
|
|
||||||
} else {
|
|
||||||
if (typeof files == "string") {
|
|
||||||
files = [ files ];
|
|
||||||
}
|
|
||||||
options.parse = options.parse || {};
|
|
||||||
options.parse.toplevel = null;
|
|
||||||
var source_map_content = options.sourceMap && options.sourceMap.content;
|
|
||||||
if (typeof source_map_content == "string" && source_map_content != "inline") {
|
|
||||||
source_map_content = parse_source_map(source_map_content);
|
|
||||||
}
|
|
||||||
source_maps = source_map_content && Object.create(null);
|
|
||||||
for (var name in files) if (HOP(files, name)) {
|
|
||||||
options.parse.filename = name;
|
|
||||||
options.parse.toplevel = toplevel = parse(files[name], options.parse);
|
|
||||||
if (source_maps) {
|
|
||||||
if (source_map_content == "inline") {
|
|
||||||
var inlined_content = read_source_map(name, toplevel);
|
|
||||||
if (inlined_content) {
|
|
||||||
source_maps[name] = parse_source_map(inlined_content);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
source_maps[name] = source_map_content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (quoted_props) {
|
|
||||||
reserve_quoted_keys(toplevel, quoted_props);
|
|
||||||
}
|
|
||||||
[ "enclose", "wrap" ].forEach(function(action) {
|
|
||||||
var option = options[action];
|
|
||||||
if (!option) return;
|
|
||||||
var orig = toplevel.print_to_string().slice(0, -1);
|
|
||||||
toplevel = toplevel[action](option);
|
|
||||||
files[toplevel.start.file] = toplevel.print_to_string().replace(orig, "");
|
|
||||||
});
|
|
||||||
if (timings) timings.rename = Date.now();
|
|
||||||
if (options.rename) {
|
|
||||||
toplevel.figure_out_scope(options.mangle);
|
|
||||||
toplevel.expand_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.compress = Date.now();
|
|
||||||
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
|
||||||
if (timings) timings.scope = Date.now();
|
|
||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
|
||||||
if (timings) timings.mangle = Date.now();
|
|
||||||
if (options.mangle) {
|
|
||||||
toplevel.compute_char_frequency(options.mangle);
|
|
||||||
toplevel.mangle_names(options.mangle);
|
|
||||||
}
|
|
||||||
if (timings) timings.properties = Date.now();
|
|
||||||
if (options.mangle && options.mangle.properties) {
|
|
||||||
toplevel = mangle_properties(toplevel, options.mangle.properties);
|
|
||||||
}
|
|
||||||
if (timings) timings.output = Date.now();
|
|
||||||
var result = {};
|
|
||||||
if (options.output.ast) {
|
|
||||||
result.ast = toplevel;
|
|
||||||
}
|
|
||||||
if (!HOP(options.output, "code") || options.output.code) {
|
|
||||||
if (options.sourceMap) {
|
|
||||||
options.output.source_map = SourceMap({
|
|
||||||
file: options.sourceMap.filename,
|
|
||||||
orig: source_maps,
|
|
||||||
root: options.sourceMap.root
|
|
||||||
});
|
|
||||||
if (options.sourceMap.includeSources) {
|
|
||||||
if (files instanceof AST_Toplevel) {
|
|
||||||
throw new Error("original source content unavailable");
|
|
||||||
} else for (var name in files) if (HOP(files, name)) {
|
|
||||||
options.output.source_map.get().setSourceContent(name, files[name]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
options.output.source_map.get()._sourcesContents = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete options.output.ast;
|
|
||||||
delete options.output.code;
|
|
||||||
var stream = OutputStream(options.output);
|
|
||||||
toplevel.print(stream);
|
|
||||||
result.code = stream.get();
|
|
||||||
if (options.sourceMap) {
|
|
||||||
result.map = options.output.source_map.toString();
|
|
||||||
var url = options.sourceMap.url;
|
|
||||||
if (url) {
|
|
||||||
result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
|
|
||||||
if (url == "inline") {
|
|
||||||
result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
|
|
||||||
} else {
|
|
||||||
result.code += "\n//# sourceMappingURL=" + url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.nameCache && options.mangle) {
|
|
||||||
if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
|
|
||||||
if (options.mangle.properties && options.mangle.properties.cache) {
|
|
||||||
options.nameCache.props = to_json(options.mangle.properties.cache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (timings) {
|
|
||||||
timings.end = Date.now();
|
|
||||||
result.timings = {
|
|
||||||
parse: 1e-3 * (timings.rename - timings.parse),
|
|
||||||
rename: 1e-3 * (timings.compress - timings.rename),
|
|
||||||
compress: 1e-3 * (timings.scope - timings.compress),
|
|
||||||
scope: 1e-3 * (timings.mangle - timings.scope),
|
|
||||||
mangle: 1e-3 * (timings.properties - timings.mangle),
|
|
||||||
properties: 1e-3 * (timings.output - timings.properties),
|
|
||||||
output: 1e-3 * (timings.end - timings.output),
|
|
||||||
total: 1e-3 * (timings.end - timings.start)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (warnings.length) {
|
|
||||||
result.warnings = warnings;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} catch (ex) {
|
|
||||||
return { error: ex };
|
|
||||||
}
|
|
||||||
}
|
|
629
node_modules/uglify-js/lib/mozilla-ast.js
generated
vendored
629
node_modules/uglify-js/lib/mozilla-ast.js
generated
vendored
|
@ -1,629 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
function normalize_directives(body) {
|
|
||||||
var in_directive = true;
|
|
||||||
for (var i = 0; i < body.length; i++) {
|
|
||||||
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
|
||||||
body[i] = new AST_Directive({
|
|
||||||
start: body[i].start,
|
|
||||||
end: body[i].end,
|
|
||||||
value: body[i].body.value
|
|
||||||
});
|
|
||||||
} else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) {
|
|
||||||
in_directive = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return body;
|
|
||||||
}
|
|
||||||
|
|
||||||
var MOZ_TO_ME = {
|
|
||||||
Program: function(M) {
|
|
||||||
return new AST_Toplevel({
|
|
||||||
start: my_start_token(M),
|
|
||||||
end: my_end_token(M),
|
|
||||||
body: normalize_directives(M.body.map(from_moz))
|
|
||||||
});
|
|
||||||
},
|
|
||||||
FunctionDeclaration: function(M) {
|
|
||||||
return new AST_Defun({
|
|
||||||
start: my_start_token(M),
|
|
||||||
end: my_end_token(M),
|
|
||||||
name: from_moz(M.id),
|
|
||||||
argnames: M.params.map(from_moz),
|
|
||||||
body: normalize_directives(from_moz(M.body).body)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
FunctionExpression: function(M) {
|
|
||||||
return new AST_Function({
|
|
||||||
start: my_start_token(M),
|
|
||||||
end: my_end_token(M),
|
|
||||||
name: from_moz(M.id),
|
|
||||||
argnames: M.params.map(from_moz),
|
|
||||||
body: normalize_directives(from_moz(M.body).body)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
ExpressionStatement: function(M) {
|
|
||||||
return new AST_SimpleStatement({
|
|
||||||
start: my_start_token(M),
|
|
||||||
end: my_end_token(M),
|
|
||||||
body: from_moz(M.expression)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
TryStatement: function(M) {
|
|
||||||
var handlers = M.handlers || [M.handler];
|
|
||||||
if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {
|
|
||||||
throw new Error("Multiple catch clauses are not supported.");
|
|
||||||
}
|
|
||||||
return new AST_Try({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
body : from_moz(M.block).body,
|
|
||||||
bcatch : from_moz(handlers[0]),
|
|
||||||
bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null
|
|
||||||
});
|
|
||||||
},
|
|
||||||
Property: function(M) {
|
|
||||||
var key = M.key;
|
|
||||||
var args = {
|
|
||||||
start : my_start_token(key),
|
|
||||||
end : my_end_token(M.value),
|
|
||||||
key : key.type == "Identifier" ? key.name : key.value,
|
|
||||||
value : from_moz(M.value)
|
|
||||||
};
|
|
||||||
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
|
||||||
args.key = new AST_SymbolAccessor({
|
|
||||||
name: args.key
|
|
||||||
});
|
|
||||||
args.value = new AST_Accessor(args.value);
|
|
||||||
if (M.kind == "get") return new AST_ObjectGetter(args);
|
|
||||||
if (M.kind == "set") return new AST_ObjectSetter(args);
|
|
||||||
},
|
|
||||||
ArrayExpression: function(M) {
|
|
||||||
return new AST_Array({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
elements : M.elements.map(function(elem) {
|
|
||||||
return elem === null ? new AST_Hole() : from_moz(elem);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
ObjectExpression: function(M) {
|
|
||||||
return new AST_Object({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
properties : M.properties.map(function(prop) {
|
|
||||||
prop.type = "Property";
|
|
||||||
return from_moz(prop)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
SequenceExpression: function(M) {
|
|
||||||
return new AST_Sequence({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
expressions: M.expressions.map(from_moz)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
MemberExpression: function(M) {
|
|
||||||
return new (M.computed ? AST_Sub : AST_Dot)({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
property : M.computed ? from_moz(M.property) : M.property.name,
|
|
||||||
expression : from_moz(M.object)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
SwitchCase: function(M) {
|
|
||||||
return new (M.test ? AST_Case : AST_Default)({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
expression : from_moz(M.test),
|
|
||||||
body : M.consequent.map(from_moz)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
VariableDeclaration: function(M) {
|
|
||||||
return new AST_Var({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
definitions : M.declarations.map(from_moz)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
Literal: function(M) {
|
|
||||||
var val = M.value, args = {
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M)
|
|
||||||
};
|
|
||||||
if (val === null) return new AST_Null(args);
|
|
||||||
var rx = M.regex;
|
|
||||||
if (rx && rx.pattern) {
|
|
||||||
// RegExpLiteral as per ESTree AST spec
|
|
||||||
args.value = new RegExp(rx.pattern, rx.flags);
|
|
||||||
args.value.raw_source = rx.pattern;
|
|
||||||
return new AST_RegExp(args);
|
|
||||||
} else if (rx) {
|
|
||||||
// support legacy RegExp
|
|
||||||
args.value = M.regex && M.raw ? M.raw : val;
|
|
||||||
return new AST_RegExp(args);
|
|
||||||
}
|
|
||||||
switch (typeof val) {
|
|
||||||
case "string":
|
|
||||||
args.value = val;
|
|
||||||
return new AST_String(args);
|
|
||||||
case "number":
|
|
||||||
args.value = val;
|
|
||||||
return new AST_Number(args);
|
|
||||||
case "boolean":
|
|
||||||
return new (val ? AST_True : AST_False)(args);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Identifier: function(M) {
|
|
||||||
var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
|
||||||
return new ( p.type == "LabeledStatement" ? AST_Label
|
|
||||||
: p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar
|
|
||||||
: p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
|
||||||
: p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
|
||||||
: p.type == "CatchClause" ? AST_SymbolCatch
|
|
||||||
: p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef
|
|
||||||
: AST_SymbolRef)({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
name : M.name
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
MOZ_TO_ME.UpdateExpression =
|
|
||||||
MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {
|
|
||||||
var prefix = "prefix" in M ? M.prefix
|
|
||||||
: M.type == "UnaryExpression" ? true : false;
|
|
||||||
return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({
|
|
||||||
start : my_start_token(M),
|
|
||||||
end : my_end_token(M),
|
|
||||||
operator : M.operator,
|
|
||||||
expression : from_moz(M.argument)
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
map("EmptyStatement", AST_EmptyStatement);
|
|
||||||
map("BlockStatement", AST_BlockStatement, "body@body");
|
|
||||||
map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative");
|
|
||||||
map("LabeledStatement", AST_LabeledStatement, "label>label, body>body");
|
|
||||||
map("BreakStatement", AST_Break, "label>label");
|
|
||||||
map("ContinueStatement", AST_Continue, "label>label");
|
|
||||||
map("WithStatement", AST_With, "object>expression, body>body");
|
|
||||||
map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body");
|
|
||||||
map("ReturnStatement", AST_Return, "argument>value");
|
|
||||||
map("ThrowStatement", AST_Throw, "argument>value");
|
|
||||||
map("WhileStatement", AST_While, "test>condition, body>body");
|
|
||||||
map("DoWhileStatement", AST_Do, "test>condition, body>body");
|
|
||||||
map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body");
|
|
||||||
map("ForInStatement", AST_ForIn, "left>init, right>object, body>body");
|
|
||||||
map("DebuggerStatement", AST_Debugger);
|
|
||||||
map("VariableDeclarator", AST_VarDef, "id>name, init>value");
|
|
||||||
map("CatchClause", AST_Catch, "param>argname, body%body");
|
|
||||||
|
|
||||||
map("ThisExpression", AST_This);
|
|
||||||
map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
|
||||||
map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
|
||||||
map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right");
|
|
||||||
map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
|
|
||||||
map("NewExpression", AST_New, "callee>expression, arguments@args");
|
|
||||||
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
|
||||||
|
|
||||||
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
|
||||||
return to_moz_scope("Program", M);
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
|
||||||
return {
|
|
||||||
type: "FunctionDeclaration",
|
|
||||||
id: to_moz(M.name),
|
|
||||||
params: M.argnames.map(to_moz),
|
|
||||||
body: to_moz_scope("BlockStatement", M)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Function, function To_Moz_FunctionExpression(M) {
|
|
||||||
return {
|
|
||||||
type: "FunctionExpression",
|
|
||||||
id: to_moz(M.name),
|
|
||||||
params: M.argnames.map(to_moz),
|
|
||||||
body: to_moz_scope("BlockStatement", M)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Directive, function To_Moz_Directive(M) {
|
|
||||||
return {
|
|
||||||
type: "ExpressionStatement",
|
|
||||||
expression: {
|
|
||||||
type: "Literal",
|
|
||||||
value: M.value
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {
|
|
||||||
return {
|
|
||||||
type: "ExpressionStatement",
|
|
||||||
expression: to_moz(M.body)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {
|
|
||||||
return {
|
|
||||||
type: "SwitchCase",
|
|
||||||
test: to_moz(M.expression),
|
|
||||||
consequent: M.body.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Try, function To_Moz_TryStatement(M) {
|
|
||||||
return {
|
|
||||||
type: "TryStatement",
|
|
||||||
block: to_moz_block(M),
|
|
||||||
handler: to_moz(M.bcatch),
|
|
||||||
guardedHandlers: [],
|
|
||||||
finalizer: to_moz(M.bfinally)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {
|
|
||||||
return {
|
|
||||||
type: "CatchClause",
|
|
||||||
param: to_moz(M.argname),
|
|
||||||
guard: null,
|
|
||||||
body: to_moz_block(M)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
|
|
||||||
return {
|
|
||||||
type: "VariableDeclaration",
|
|
||||||
kind: "var",
|
|
||||||
declarations: M.definitions.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
|
|
||||||
return {
|
|
||||||
type: "SequenceExpression",
|
|
||||||
expressions: M.expressions.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {
|
|
||||||
var isComputed = M instanceof AST_Sub;
|
|
||||||
return {
|
|
||||||
type: "MemberExpression",
|
|
||||||
object: to_moz(M.expression),
|
|
||||||
computed: isComputed,
|
|
||||||
property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Unary, function To_Moz_Unary(M) {
|
|
||||||
return {
|
|
||||||
type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression",
|
|
||||||
operator: M.operator,
|
|
||||||
prefix: M instanceof AST_UnaryPrefix,
|
|
||||||
argument: to_moz(M.expression)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {
|
|
||||||
return {
|
|
||||||
type: M.operator == "&&" || M.operator == "||" ? "LogicalExpression" : "BinaryExpression",
|
|
||||||
left: to_moz(M.left),
|
|
||||||
operator: M.operator,
|
|
||||||
right: to_moz(M.right)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {
|
|
||||||
return {
|
|
||||||
type: "ArrayExpression",
|
|
||||||
elements: M.elements.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
|
|
||||||
return {
|
|
||||||
type: "ObjectExpression",
|
|
||||||
properties: M.properties.map(to_moz)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
|
||||||
var key = {
|
|
||||||
type: "Literal",
|
|
||||||
value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key
|
|
||||||
};
|
|
||||||
var kind;
|
|
||||||
if (M instanceof AST_ObjectKeyVal) {
|
|
||||||
kind = "init";
|
|
||||||
} else
|
|
||||||
if (M instanceof AST_ObjectGetter) {
|
|
||||||
kind = "get";
|
|
||||||
} else
|
|
||||||
if (M instanceof AST_ObjectSetter) {
|
|
||||||
kind = "set";
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
type: "Property",
|
|
||||||
kind: kind,
|
|
||||||
key: key,
|
|
||||||
value: to_moz(M.value)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Symbol, function To_Moz_Identifier(M) {
|
|
||||||
var def = M.definition();
|
|
||||||
return {
|
|
||||||
type: "Identifier",
|
|
||||||
name: def && def.mangled_name || M.name
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
|
|
||||||
var flags = M.value.toString().match(/[gimuy]*$/)[0];
|
|
||||||
var value = "/" + M.value.raw_source + "/" + flags;
|
|
||||||
return {
|
|
||||||
type: "Literal",
|
|
||||||
value: value,
|
|
||||||
raw: value,
|
|
||||||
regex: {
|
|
||||||
pattern: M.value.raw_source,
|
|
||||||
flags: flags
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Constant, function To_Moz_Literal(M) {
|
|
||||||
var value = M.value;
|
|
||||||
if (typeof value === 'number' && (value < 0 || (value === 0 && 1 / value < 0))) {
|
|
||||||
return {
|
|
||||||
type: "UnaryExpression",
|
|
||||||
operator: "-",
|
|
||||||
prefix: true,
|
|
||||||
argument: {
|
|
||||||
type: "Literal",
|
|
||||||
value: -value,
|
|
||||||
raw: M.start.raw
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
type: "Literal",
|
|
||||||
value: value,
|
|
||||||
raw: M.start.raw
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
def_to_moz(AST_Atom, function To_Moz_Atom(M) {
|
|
||||||
return {
|
|
||||||
type: "Identifier",
|
|
||||||
name: String(M.value)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
|
||||||
AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
|
||||||
AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null });
|
|
||||||
|
|
||||||
AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast);
|
|
||||||
AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast);
|
|
||||||
|
|
||||||
/* -----[ tools ]----- */
|
|
||||||
|
|
||||||
function raw_token(moznode) {
|
|
||||||
if (moznode.type == "Literal") {
|
|
||||||
return moznode.raw != null ? moznode.raw : moznode.value + "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function my_start_token(moznode) {
|
|
||||||
var loc = moznode.loc, start = loc && loc.start;
|
|
||||||
var range = moznode.range;
|
|
||||||
return new AST_Token({
|
|
||||||
file : loc && loc.source,
|
|
||||||
line : start && start.line,
|
|
||||||
col : start && start.column,
|
|
||||||
pos : range ? range[0] : moznode.start,
|
|
||||||
endline : start && start.line,
|
|
||||||
endcol : start && start.column,
|
|
||||||
endpos : range ? range[0] : moznode.start,
|
|
||||||
raw : raw_token(moznode),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function my_end_token(moznode) {
|
|
||||||
var loc = moznode.loc, end = loc && loc.end;
|
|
||||||
var range = moznode.range;
|
|
||||||
return new AST_Token({
|
|
||||||
file : loc && loc.source,
|
|
||||||
line : end && end.line,
|
|
||||||
col : end && end.column,
|
|
||||||
pos : range ? range[1] : moznode.end,
|
|
||||||
endline : end && end.line,
|
|
||||||
endcol : end && end.column,
|
|
||||||
endpos : range ? range[1] : moznode.end,
|
|
||||||
raw : raw_token(moznode),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function map(moztype, mytype, propmap) {
|
|
||||||
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
|
||||||
moz_to_me += "return new U2." + mytype.name + "({\n" +
|
|
||||||
"start: my_start_token(M),\n" +
|
|
||||||
"end: my_end_token(M)";
|
|
||||||
|
|
||||||
var me_to_moz = "function To_Moz_" + moztype + "(M){\n";
|
|
||||||
me_to_moz += "return {\n" +
|
|
||||||
"type: " + JSON.stringify(moztype);
|
|
||||||
|
|
||||||
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop) {
|
|
||||||
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
|
||||||
if (!m) throw new Error("Can't understand property map: " + prop);
|
|
||||||
var moz = m[1], how = m[2], my = m[3];
|
|
||||||
moz_to_me += ",\n" + my + ": ";
|
|
||||||
me_to_moz += ",\n" + moz + ": ";
|
|
||||||
switch (how) {
|
|
||||||
case "@":
|
|
||||||
moz_to_me += "M." + moz + ".map(from_moz)";
|
|
||||||
me_to_moz += "M." + my + ".map(to_moz)";
|
|
||||||
break;
|
|
||||||
case ">":
|
|
||||||
moz_to_me += "from_moz(M." + moz + ")";
|
|
||||||
me_to_moz += "to_moz(M." + my + ")";
|
|
||||||
break;
|
|
||||||
case "=":
|
|
||||||
moz_to_me += "M." + moz;
|
|
||||||
me_to_moz += "M." + my;
|
|
||||||
break;
|
|
||||||
case "%":
|
|
||||||
moz_to_me += "from_moz(M." + moz + ").body";
|
|
||||||
me_to_moz += "to_moz_block(M)";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error("Can't understand operator in propmap: " + prop);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
moz_to_me += "\n})\n}";
|
|
||||||
me_to_moz += "\n}\n}";
|
|
||||||
|
|
||||||
//moz_to_me = parse(moz_to_me).print_to_string({ beautify: true });
|
|
||||||
//me_to_moz = parse(me_to_moz).print_to_string({ beautify: true });
|
|
||||||
//console.log(moz_to_me);
|
|
||||||
|
|
||||||
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
|
||||||
exports, my_start_token, my_end_token, from_moz
|
|
||||||
);
|
|
||||||
me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
|
|
||||||
to_moz, to_moz_block, to_moz_scope
|
|
||||||
);
|
|
||||||
MOZ_TO_ME[moztype] = moz_to_me;
|
|
||||||
def_to_moz(mytype, me_to_moz);
|
|
||||||
}
|
|
||||||
|
|
||||||
var FROM_MOZ_STACK = null;
|
|
||||||
|
|
||||||
function from_moz(node) {
|
|
||||||
FROM_MOZ_STACK.push(node);
|
|
||||||
var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
|
||||||
FROM_MOZ_STACK.pop();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
AST_Node.from_mozilla_ast = function(node) {
|
|
||||||
var save_stack = FROM_MOZ_STACK;
|
|
||||||
FROM_MOZ_STACK = [];
|
|
||||||
var ast = from_moz(node);
|
|
||||||
FROM_MOZ_STACK = save_stack;
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_LabelRef) {
|
|
||||||
for (var level = 0, parent; parent = this.parent(level); level++) {
|
|
||||||
if (parent instanceof AST_Scope) break;
|
|
||||||
if (parent instanceof AST_LabeledStatement && parent.label.name == node.name) {
|
|
||||||
node.thedef = parent.label;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!node.thedef) {
|
|
||||||
var s = node.start;
|
|
||||||
js_error("Undefined label " + node.name, s.file, s.line, s.col, s.pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
return ast;
|
|
||||||
};
|
|
||||||
|
|
||||||
function set_moz_loc(mynode, moznode, myparent) {
|
|
||||||
var start = mynode.start;
|
|
||||||
var end = mynode.end;
|
|
||||||
if (start.pos != null && end.endpos != null) {
|
|
||||||
moznode.range = [start.pos, end.endpos];
|
|
||||||
}
|
|
||||||
if (start.line) {
|
|
||||||
moznode.loc = {
|
|
||||||
start: {line: start.line, column: start.col},
|
|
||||||
end: end.endline ? {line: end.endline, column: end.endcol} : null
|
|
||||||
};
|
|
||||||
if (start.file) {
|
|
||||||
moznode.loc.source = start.file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return moznode;
|
|
||||||
}
|
|
||||||
|
|
||||||
function def_to_moz(mytype, handler) {
|
|
||||||
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
|
||||||
return set_moz_loc(this, handler(this));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_moz(node) {
|
|
||||||
return node != null ? node.to_mozilla_ast() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_moz_block(node) {
|
|
||||||
return {
|
|
||||||
type: "BlockStatement",
|
|
||||||
body: node.body.map(to_moz)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function to_moz_scope(type, node) {
|
|
||||||
var body = node.body.map(to_moz);
|
|
||||||
if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
|
|
||||||
body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
type: type,
|
|
||||||
body: body
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})();
|
|
1522
node_modules/uglify-js/lib/output.js
generated
vendored
1522
node_modules/uglify-js/lib/output.js
generated
vendored
File diff suppressed because it is too large
Load diff
1616
node_modules/uglify-js/lib/parse.js
generated
vendored
1616
node_modules/uglify-js/lib/parse.js
generated
vendored
File diff suppressed because it is too large
Load diff
234
node_modules/uglify-js/lib/propmangle.js
generated
vendored
234
node_modules/uglify-js/lib/propmangle.js
generated
vendored
|
@ -1,234 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function find_builtins(reserved) {
|
|
||||||
// NaN will be included due to Number.NaN
|
|
||||||
[
|
|
||||||
"null",
|
|
||||||
"true",
|
|
||||||
"false",
|
|
||||||
"Infinity",
|
|
||||||
"-Infinity",
|
|
||||||
"undefined",
|
|
||||||
].forEach(add);
|
|
||||||
[
|
|
||||||
Array,
|
|
||||||
Boolean,
|
|
||||||
Date,
|
|
||||||
Error,
|
|
||||||
Function,
|
|
||||||
Math,
|
|
||||||
Number,
|
|
||||||
Object,
|
|
||||||
RegExp,
|
|
||||||
String,
|
|
||||||
].forEach(function(ctor) {
|
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
|
||||||
if (ctor.prototype) {
|
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
|
||||||
add(node.key);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addStrings(node, add) {
|
|
||||||
node.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Sequence) {
|
|
||||||
addStrings(node.tail_node(), add);
|
|
||||||
} else if (node instanceof AST_String) {
|
|
||||||
add(node.value);
|
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
addStrings(node.consequent, add);
|
|
||||||
addStrings(node.alternative, add);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
function mangle_properties(ast, options) {
|
|
||||||
options = defaults(options, {
|
|
||||||
builtins: false,
|
|
||||||
cache: null,
|
|
||||||
debug: false,
|
|
||||||
keep_quoted: false,
|
|
||||||
only_cache: false,
|
|
||||||
regex: null,
|
|
||||||
reserved: null,
|
|
||||||
}, true);
|
|
||||||
|
|
||||||
var reserved = options.reserved;
|
|
||||||
if (!Array.isArray(reserved)) reserved = [];
|
|
||||||
if (!options.builtins) find_builtins(reserved);
|
|
||||||
|
|
||||||
var cname = -1;
|
|
||||||
var cache;
|
|
||||||
if (options.cache) {
|
|
||||||
cache = options.cache.props;
|
|
||||||
cache.each(function(mangled_name) {
|
|
||||||
push_uniq(reserved, mangled_name);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
cache = new Dictionary();
|
|
||||||
}
|
|
||||||
|
|
||||||
var regex = options.regex;
|
|
||||||
|
|
||||||
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
|
||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
|
||||||
// the same as passing an empty string.
|
|
||||||
var debug = options.debug !== false;
|
|
||||||
var debug_suffix;
|
|
||||||
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
|
||||||
|
|
||||||
var names_to_mangle = [];
|
|
||||||
var unmangleable = [];
|
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
|
||||||
add(node.key);
|
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter, since KeyVal is handled above
|
|
||||||
add(node.key.name);
|
|
||||||
} else if (node instanceof AST_Dot) {
|
|
||||||
add(node.property);
|
|
||||||
} else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
|
||||||
} else if (node instanceof AST_Call
|
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
|
||||||
addStrings(node.args[1], add);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
|
||||||
return ast.transform(new TreeTransformer(function(node) {
|
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
|
||||||
node.key = mangle(node.key);
|
|
||||||
} else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter
|
|
||||||
node.key.name = mangle(node.key.name);
|
|
||||||
} else if (node instanceof AST_Dot) {
|
|
||||||
node.property = mangle(node.property);
|
|
||||||
} else if (!options.keep_quoted && node instanceof AST_Sub) {
|
|
||||||
node.property = mangleStrings(node.property);
|
|
||||||
} else if (node instanceof AST_Call
|
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
|
||||||
node.args[1] = mangleStrings(node.args[1]);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// only function declarations after this line
|
|
||||||
|
|
||||||
function can_mangle(name) {
|
|
||||||
if (unmangleable.indexOf(name) >= 0) return false;
|
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
|
||||||
if (options.only_cache) return cache.has(name);
|
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function should_mangle(name) {
|
|
||||||
if (regex && !regex.test(name)) return false;
|
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
|
||||||
return cache.has(name) || names_to_mangle.indexOf(name) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
if (can_mangle(name)) push_uniq(names_to_mangle, name);
|
|
||||||
if (!should_mangle(name)) push_uniq(unmangleable, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
function mangle(name) {
|
|
||||||
if (!should_mangle(name)) {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
var mangled = cache.get(name);
|
|
||||||
if (!mangled) {
|
|
||||||
if (debug) {
|
|
||||||
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
|
||||||
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
|
||||||
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
|
||||||
}
|
|
||||||
// either debug mode is off, or it is on and we could not use the mangled name
|
|
||||||
if (!mangled) do {
|
|
||||||
mangled = base54(++cname);
|
|
||||||
} while (!can_mangle(mangled));
|
|
||||||
cache.set(name, mangled);
|
|
||||||
}
|
|
||||||
return mangled;
|
|
||||||
}
|
|
||||||
|
|
||||||
function mangleStrings(node) {
|
|
||||||
return node.transform(new TreeTransformer(function(node) {
|
|
||||||
if (node instanceof AST_Sequence) {
|
|
||||||
var last = node.expressions.length - 1;
|
|
||||||
node.expressions[last] = mangleStrings(node.expressions[last]);
|
|
||||||
} else if (node instanceof AST_String) {
|
|
||||||
node.value = mangle(node.value);
|
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
node.consequent = mangleStrings(node.consequent);
|
|
||||||
node.alternative = mangleStrings(node.alternative);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
616
node_modules/uglify-js/lib/scope.js
generated
vendored
616
node_modules/uglify-js/lib/scope.js
generated
vendored
|
@ -1,616 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function SymbolDef(scope, orig, init) {
|
|
||||||
this.name = orig.name;
|
|
||||||
this.orig = [ orig ];
|
|
||||||
this.init = init;
|
|
||||||
this.eliminated = 0;
|
|
||||||
this.scope = scope;
|
|
||||||
this.references = [];
|
|
||||||
this.replaced = 0;
|
|
||||||
this.global = false;
|
|
||||||
this.mangled_name = null;
|
|
||||||
this.undeclared = false;
|
|
||||||
this.id = SymbolDef.next_id++;
|
|
||||||
this.lambda = orig instanceof AST_SymbolLambda;
|
|
||||||
}
|
|
||||||
|
|
||||||
SymbolDef.next_id = 1;
|
|
||||||
|
|
||||||
SymbolDef.prototype = {
|
|
||||||
unmangleable: function(options) {
|
|
||||||
return this.global && !options.toplevel
|
|
||||||
|| this.undeclared
|
|
||||||
|| !options.eval && this.scope.pinned()
|
|
||||||
|| options.keep_fnames
|
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun);
|
|
||||||
},
|
|
||||||
mangle: function(options) {
|
|
||||||
var cache = options.cache && options.cache.props;
|
|
||||||
if (this.global && cache && cache.has(this.name)) {
|
|
||||||
this.mangled_name = cache.get(this.name);
|
|
||||||
} else if (!this.mangled_name && !this.unmangleable(options)) {
|
|
||||||
var def;
|
|
||||||
if (def = this.redefined()) {
|
|
||||||
this.mangled_name = def.mangled_name || def.name;
|
|
||||||
} else {
|
|
||||||
this.mangled_name = next_mangled_name(this.scope, options, this);
|
|
||||||
}
|
|
||||||
if (this.global && cache) {
|
|
||||||
cache.set(this.name, this.mangled_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
redefined: function() {
|
|
||||||
return this.defun && this.defun.variables.get(this.name);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
|
||||||
options = defaults(options, {
|
|
||||||
cache: null,
|
|
||||||
ie8: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
|
||||||
var self = this;
|
|
||||||
var scope = self.parent_scope = null;
|
|
||||||
var defun = null;
|
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
|
||||||
if (node instanceof AST_Catch) {
|
|
||||||
var save_scope = scope;
|
|
||||||
scope = new AST_Scope(node);
|
|
||||||
scope.init_scope_vars(save_scope);
|
|
||||||
descend();
|
|
||||||
scope = save_scope;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Scope) {
|
|
||||||
node.init_scope_vars(scope);
|
|
||||||
var save_scope = scope;
|
|
||||||
var save_defun = defun;
|
|
||||||
defun = scope = node;
|
|
||||||
descend();
|
|
||||||
scope = save_scope;
|
|
||||||
defun = save_defun;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_With) {
|
|
||||||
for (var s = scope; s; s = s.parent_scope) s.uses_with = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Symbol) {
|
|
||||||
node.scope = scope;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Label) {
|
|
||||||
node.thedef = node;
|
|
||||||
node.references = [];
|
|
||||||
}
|
|
||||||
if (node instanceof AST_SymbolDefun) {
|
|
||||||
// This should be defined in the parent scope, as we encounter the
|
|
||||||
// AST_Defun node before getting to its AST_Symbol.
|
|
||||||
(node.scope = defun.parent_scope.resolve()).def_function(node, defun);
|
|
||||||
} else if (node instanceof AST_SymbolLambda) {
|
|
||||||
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
|
||||||
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
|
||||||
} else if (node instanceof AST_SymbolVar) {
|
|
||||||
defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
|
||||||
if (defun !== scope) {
|
|
||||||
node.mark_enclosed(options);
|
|
||||||
var def = scope.find_variable(node);
|
|
||||||
if (node.thedef !== def) {
|
|
||||||
node.thedef = def;
|
|
||||||
}
|
|
||||||
node.reference(options);
|
|
||||||
}
|
|
||||||
} else if (node instanceof AST_SymbolCatch) {
|
|
||||||
scope.def_variable(node).defun = defun;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
self.walk(tw);
|
|
||||||
|
|
||||||
// pass 2: find back references and eval
|
|
||||||
self.globals = new Dictionary();
|
|
||||||
var tw = new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_LoopControl) {
|
|
||||||
if (node.label) node.label.thedef.references.push(node);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_SymbolRef) {
|
|
||||||
var name = node.name;
|
|
||||||
if (name == "eval" && tw.parent() instanceof AST_Call) {
|
|
||||||
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
|
|
||||||
s.uses_eval = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var sym = node.scope.find_variable(name);
|
|
||||||
if (!sym) {
|
|
||||||
sym = self.def_global(node);
|
|
||||||
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
|
||||||
sym.scope.uses_arguments = true;
|
|
||||||
}
|
|
||||||
node.thedef = sym;
|
|
||||||
node.reference(options);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// ensure mangling works if catch reuses a scope variable
|
|
||||||
if (node instanceof AST_SymbolCatch) {
|
|
||||||
var def = node.definition().redefined();
|
|
||||||
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
|
||||||
push_uniq(s.enclosed, def);
|
|
||||||
if (s === def.scope) break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
self.walk(tw);
|
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
|
||||||
if (options.ie8) self.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_SymbolCatch) {
|
|
||||||
var scope = node.thedef.defun;
|
|
||||||
if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
|
|
||||||
scope = scope.parent_scope.resolve();
|
|
||||||
}
|
|
||||||
redefine(node, scope);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_SymbolLambda) {
|
|
||||||
var def = node.thedef;
|
|
||||||
redefine(node, node.scope.parent_scope.resolve());
|
|
||||||
if (typeof node.thedef.init !== "undefined") {
|
|
||||||
node.thedef.init = false;
|
|
||||||
} else if (def.init) {
|
|
||||||
node.thedef.init = def.init;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
function redefine(node, scope) {
|
|
||||||
var name = node.name;
|
|
||||||
var old_def = node.thedef;
|
|
||||||
var new_def = scope.find_variable(name);
|
|
||||||
if (new_def) {
|
|
||||||
var redef;
|
|
||||||
while (redef = new_def.redefined()) new_def = redef;
|
|
||||||
} else {
|
|
||||||
new_def = self.globals.get(name) || scope.def_variable(node);
|
|
||||||
}
|
|
||||||
old_def.orig.concat(old_def.references).forEach(function(node) {
|
|
||||||
node.thedef = new_def;
|
|
||||||
node.reference(options);
|
|
||||||
});
|
|
||||||
if (old_def.lambda) new_def.lambda = true;
|
|
||||||
if (new_def.undeclared) self.variables.set(name, new_def);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
|
||||||
var globals = this.globals, name = node.name;
|
|
||||||
if (globals.has(name)) {
|
|
||||||
return globals.get(name);
|
|
||||||
} else {
|
|
||||||
var g = new SymbolDef(this, node);
|
|
||||||
g.undeclared = true;
|
|
||||||
g.global = true;
|
|
||||||
globals.set(name, g);
|
|
||||||
return g;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope) {
|
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
|
||||||
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
|
||||||
this.parent_scope = parent_scope; // the parent scope
|
|
||||||
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
|
||||||
this.cname = -1; // the current index for mangling functions/variables
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function() {
|
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
|
||||||
this.uses_arguments = false;
|
|
||||||
this.def_variable(new AST_SymbolFunarg({
|
|
||||||
name: "arguments",
|
|
||||||
start: this.start,
|
|
||||||
end: this.end
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
|
||||||
var def = this.definition();
|
|
||||||
for (var s = this.scope; s; s = s.parent_scope) {
|
|
||||||
push_uniq(s.enclosed, def);
|
|
||||||
if (options.keep_fnames) {
|
|
||||||
s.functions.each(function(d) {
|
|
||||||
push_uniq(def.scope.enclosed, d);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (s === def.scope) break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("reference", function(options) {
|
|
||||||
this.definition().references.push(this);
|
|
||||||
this.mark_enclosed(options);
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name) {
|
|
||||||
if (name instanceof AST_Symbol) name = name.name;
|
|
||||||
return this.variables.get(name)
|
|
||||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_function", function(symbol, init) {
|
|
||||||
var def = this.def_variable(symbol, init);
|
|
||||||
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
|
||||||
this.functions.set(symbol.name, def);
|
|
||||||
return def;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
|
||||||
var def = this.variables.get(symbol.name);
|
|
||||||
if (def) {
|
|
||||||
def.orig.push(symbol);
|
|
||||||
if (def.init instanceof AST_Function) def.init = init;
|
|
||||||
} else {
|
|
||||||
def = new SymbolDef(this, symbol, init);
|
|
||||||
this.variables.set(symbol.name, def);
|
|
||||||
def.global = !this.parent_scope;
|
|
||||||
}
|
|
||||||
return symbol.thedef = def;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("resolve", return_this);
|
|
||||||
AST_Scope.DEFMETHOD("resolve", function() {
|
|
||||||
return this.parent_scope.resolve();
|
|
||||||
});
|
|
||||||
AST_Toplevel.DEFMETHOD("resolve", return_this);
|
|
||||||
|
|
||||||
function names_in_use(scope, options) {
|
|
||||||
var names = scope.names_in_use;
|
|
||||||
if (!names) {
|
|
||||||
scope.names_in_use = names = Object.create(scope.mangled_names || null);
|
|
||||||
scope.cname_holes = [];
|
|
||||||
var cache = options.cache && options.cache.props;
|
|
||||||
scope.enclosed.forEach(function(def) {
|
|
||||||
if (def.unmangleable(options)) names[def.name] = true;
|
|
||||||
if (def.global && cache && cache.has(def.name)) {
|
|
||||||
names[cache.get(def.name)] = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
function next_mangled_name(scope, options, def) {
|
|
||||||
var in_use = names_in_use(scope, options);
|
|
||||||
var holes = scope.cname_holes;
|
|
||||||
var names = Object.create(null);
|
|
||||||
var scopes = [ scope ];
|
|
||||||
def.references.forEach(function(sym) {
|
|
||||||
var scope = sym.scope;
|
|
||||||
do {
|
|
||||||
if (scopes.indexOf(scope) < 0) {
|
|
||||||
for (var name in names_in_use(scope, options)) {
|
|
||||||
names[name] = true;
|
|
||||||
}
|
|
||||||
scopes.push(scope);
|
|
||||||
} else break;
|
|
||||||
} while (scope = scope.parent_scope);
|
|
||||||
});
|
|
||||||
var name;
|
|
||||||
for (var i = 0; i < holes.length; i++) {
|
|
||||||
name = base54(holes[i]);
|
|
||||||
if (names[name]) continue;
|
|
||||||
holes.splice(i, 1);
|
|
||||||
scope.names_in_use[name] = true;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
while (true) {
|
|
||||||
name = base54(++scope.cname);
|
|
||||||
if (in_use[name] || RESERVED_WORDS[name] || options.reserved.has[name]) continue;
|
|
||||||
if (!names[name]) break;
|
|
||||||
holes.push(scope.cname);
|
|
||||||
}
|
|
||||||
scope.names_in_use[name] = true;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options) {
|
|
||||||
var def = this.definition();
|
|
||||||
return !def || def.unmangleable(options);
|
|
||||||
});
|
|
||||||
|
|
||||||
// labels are always mangleable
|
|
||||||
AST_Label.DEFMETHOD("unmangleable", return_false);
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function() {
|
|
||||||
return !this.definition().references.length && !this.scope.pinned();
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function() {
|
|
||||||
return this.thedef;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("global", function() {
|
|
||||||
return this.definition().global;
|
|
||||||
});
|
|
||||||
|
|
||||||
function _default_mangler_options(options) {
|
|
||||||
options = defaults(options, {
|
|
||||||
eval : false,
|
|
||||||
ie8 : false,
|
|
||||||
keep_fnames : false,
|
|
||||||
reserved : [],
|
|
||||||
toplevel : false,
|
|
||||||
});
|
|
||||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
|
||||||
// Never mangle arguments
|
|
||||||
push_uniq(options.reserved, "arguments");
|
|
||||||
options.reserved.has = makePredicate(options.reserved);
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
|
||||||
options = _default_mangler_options(options);
|
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
|
||||||
// into the code generator will display the mangled name if it's
|
|
||||||
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
|
||||||
// the AST_SymbolDeclaration that it points to).
|
|
||||||
var lname = -1;
|
|
||||||
|
|
||||||
if (options.cache && options.cache.props) {
|
|
||||||
var mangled_names = this.mangled_names = Object.create(null);
|
|
||||||
options.cache.props.each(function(mangled_name) {
|
|
||||||
mangled_names[mangled_name] = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var redefined = [];
|
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
|
||||||
if (node instanceof AST_LabeledStatement) {
|
|
||||||
// lname is incremented when we get to the AST_Label
|
|
||||||
var save_nesting = lname;
|
|
||||||
descend();
|
|
||||||
lname = save_nesting;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Scope) {
|
|
||||||
descend();
|
|
||||||
if (options.cache && node instanceof AST_Toplevel) {
|
|
||||||
node.globals.each(mangle);
|
|
||||||
}
|
|
||||||
node.variables.each(function(def) {
|
|
||||||
if (!defer_redef(def)) mangle(def);
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_Label) {
|
|
||||||
var name;
|
|
||||||
do {
|
|
||||||
name = base54(++lname);
|
|
||||||
} while (RESERVED_WORDS[name]);
|
|
||||||
node.mangled_name = name;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!options.ie8 && node instanceof AST_Catch) {
|
|
||||||
var def = node.argname.definition();
|
|
||||||
var redef = defer_redef(def, node.argname);
|
|
||||||
descend();
|
|
||||||
if (!redef) mangle(def);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.walk(tw);
|
|
||||||
redefined.forEach(mangle);
|
|
||||||
|
|
||||||
function mangle(def) {
|
|
||||||
if (options.reserved.has[def.name]) return;
|
|
||||||
def.mangle(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
function defer_redef(def, node) {
|
|
||||||
var redef = def.redefined();
|
|
||||||
if (!redef) return false;
|
|
||||||
redefined.push(def);
|
|
||||||
def.references.forEach(reference);
|
|
||||||
if (node) reference(node);
|
|
||||||
return true;
|
|
||||||
|
|
||||||
function reference(sym) {
|
|
||||||
sym.thedef = redef;
|
|
||||||
sym.reference(options);
|
|
||||||
sym.thedef = def;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
|
||||||
var cache = options.cache && options.cache.props;
|
|
||||||
var avoid = Object.create(null);
|
|
||||||
options.reserved.forEach(to_avoid);
|
|
||||||
this.globals.each(add_def);
|
|
||||||
this.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Scope) node.variables.each(add_def);
|
|
||||||
if (node instanceof AST_SymbolCatch) add_def(node.definition());
|
|
||||||
}));
|
|
||||||
return avoid;
|
|
||||||
|
|
||||||
function to_avoid(name) {
|
|
||||||
avoid[name] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function add_def(def) {
|
|
||||||
var name = def.name;
|
|
||||||
if (def.global && cache && cache.has(name)) name = cache.get(name);
|
|
||||||
else if (!def.unmangleable(options)) return;
|
|
||||||
to_avoid(name);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
|
||||||
base54.reset();
|
|
||||||
base54.sort();
|
|
||||||
options = _default_mangler_options(options);
|
|
||||||
var avoid = this.find_colliding_names(options);
|
|
||||||
var cname = 0;
|
|
||||||
this.globals.each(rename);
|
|
||||||
this.walk(new TreeWalker(function(node) {
|
|
||||||
if (node instanceof AST_Scope) node.variables.each(rename);
|
|
||||||
if (node instanceof AST_SymbolCatch) rename(node.definition());
|
|
||||||
}));
|
|
||||||
|
|
||||||
function next_name() {
|
|
||||||
var name;
|
|
||||||
do {
|
|
||||||
name = base54(cname++);
|
|
||||||
} while (avoid[name] || RESERVED_WORDS[name]);
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
function rename(def) {
|
|
||||||
if (def.global && options.cache) return;
|
|
||||||
if (def.unmangleable(options)) return;
|
|
||||||
if (options.reserved.has[def.name]) return;
|
|
||||||
var redef = def.redefined();
|
|
||||||
var name = redef ? redef.rename || redef.name : next_name();
|
|
||||||
def.rename = name;
|
|
||||||
def.orig.forEach(function(sym) {
|
|
||||||
sym.name = name;
|
|
||||||
});
|
|
||||||
def.references.forEach(function(sym) {
|
|
||||||
sym.name = name;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("tail_node", return_this);
|
|
||||||
AST_Sequence.DEFMETHOD("tail_node", function() {
|
|
||||||
return this.expressions[this.expressions.length - 1];
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
|
|
||||||
options = _default_mangler_options(options);
|
|
||||||
base54.reset();
|
|
||||||
try {
|
|
||||||
AST_Node.prototype.print = function(stream, force_parens) {
|
|
||||||
this._print(stream, force_parens);
|
|
||||||
if (this instanceof AST_Symbol && !this.unmangleable(options)) {
|
|
||||||
base54.consider(this.name, -1);
|
|
||||||
} else if (options.properties) {
|
|
||||||
if (this instanceof AST_Dot) {
|
|
||||||
base54.consider(this.property, -1);
|
|
||||||
} else if (this instanceof AST_Sub) {
|
|
||||||
skip_string(this.property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
base54.consider(this.print_to_string(), 1);
|
|
||||||
} finally {
|
|
||||||
AST_Node.prototype.print = AST_Node.prototype._print;
|
|
||||||
}
|
|
||||||
base54.sort();
|
|
||||||
|
|
||||||
function skip_string(node) {
|
|
||||||
if (node instanceof AST_String) {
|
|
||||||
base54.consider(node.value, -1);
|
|
||||||
} else if (node instanceof AST_Conditional) {
|
|
||||||
skip_string(node.consequent);
|
|
||||||
skip_string(node.alternative);
|
|
||||||
} else if (node instanceof AST_Sequence) {
|
|
||||||
skip_string(node.tail_node());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var base54 = (function() {
|
|
||||||
var freq = Object.create(null);
|
|
||||||
function init(chars) {
|
|
||||||
var array = [];
|
|
||||||
for (var i = 0; i < chars.length; i++) {
|
|
||||||
var ch = chars[i];
|
|
||||||
array.push(ch);
|
|
||||||
freq[ch] = -1e-2 * i;
|
|
||||||
}
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
var digits = init("0123456789");
|
|
||||||
var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
|
|
||||||
var chars, frequency;
|
|
||||||
function reset() {
|
|
||||||
frequency = Object.create(freq);
|
|
||||||
}
|
|
||||||
base54.consider = function(str, delta) {
|
|
||||||
for (var i = str.length; --i >= 0;) {
|
|
||||||
frequency[str[i]] += delta;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
function compare(a, b) {
|
|
||||||
return frequency[b] - frequency[a];
|
|
||||||
}
|
|
||||||
base54.sort = function() {
|
|
||||||
chars = leading.sort(compare).concat(digits.sort(compare));
|
|
||||||
};
|
|
||||||
base54.reset = reset;
|
|
||||||
reset();
|
|
||||||
function base54(num) {
|
|
||||||
var ret = "", base = 54;
|
|
||||||
num++;
|
|
||||||
do {
|
|
||||||
num--;
|
|
||||||
ret += chars[num % base];
|
|
||||||
num = Math.floor(num / base);
|
|
||||||
base = 64;
|
|
||||||
} while (num > 0);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return base54;
|
|
||||||
})();
|
|
104
node_modules/uglify-js/lib/sourcemap.js
generated
vendored
104
node_modules/uglify-js/lib/sourcemap.js
generated
vendored
|
@ -1,104 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// a small wrapper around fitzgen's source-map library
|
|
||||||
function SourceMap(options) {
|
|
||||||
options = defaults(options, {
|
|
||||||
file: null,
|
|
||||||
root: null,
|
|
||||||
orig: null,
|
|
||||||
orig_line_diff: 0,
|
|
||||||
dest_line_diff: 0,
|
|
||||||
}, true);
|
|
||||||
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
|
||||||
file: options.file,
|
|
||||||
sourceRoot: options.root
|
|
||||||
});
|
|
||||||
var maps = options.orig && Object.create(null);
|
|
||||||
if (maps) for (var source in options.orig) {
|
|
||||||
var map = new MOZ_SourceMap.SourceMapConsumer(options.orig[source]);
|
|
||||||
if (Array.isArray(options.orig[source].sources)) {
|
|
||||||
map._sources.toArray().forEach(function(source) {
|
|
||||||
var sourceContent = map.sourceContentFor(source, true);
|
|
||||||
if (sourceContent) generator.setSourceContent(source, sourceContent);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
maps[source] = map;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
add: function(source, gen_line, gen_col, orig_line, orig_col, name) {
|
|
||||||
var map = maps && maps[source];
|
|
||||||
if (map) {
|
|
||||||
var info = map.originalPositionFor({
|
|
||||||
line: orig_line,
|
|
||||||
column: orig_col
|
|
||||||
});
|
|
||||||
if (info.source === null) return;
|
|
||||||
source = info.source;
|
|
||||||
orig_line = info.line;
|
|
||||||
orig_col = info.column;
|
|
||||||
name = info.name || name;
|
|
||||||
}
|
|
||||||
generator.addMapping({
|
|
||||||
name: name,
|
|
||||||
source: source,
|
|
||||||
generated: {
|
|
||||||
line: gen_line + options.dest_line_diff,
|
|
||||||
column: gen_col
|
|
||||||
},
|
|
||||||
original: {
|
|
||||||
line: orig_line + options.orig_line_diff,
|
|
||||||
column: orig_col
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
get: function() {
|
|
||||||
return generator;
|
|
||||||
},
|
|
||||||
toString: function() {
|
|
||||||
return JSON.stringify(generator.toJSON());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
185
node_modules/uglify-js/lib/transform.js
generated
vendored
185
node_modules/uglify-js/lib/transform.js
generated
vendored
|
@ -1,185 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function TreeTransformer(before, after) {
|
|
||||||
TreeWalker.call(this);
|
|
||||||
this.before = before;
|
|
||||||
this.after = after;
|
|
||||||
}
|
|
||||||
TreeTransformer.prototype = new TreeWalker;
|
|
||||||
|
|
||||||
(function(DEF) {
|
|
||||||
function do_list(list, tw) {
|
|
||||||
return MAP(list, function(node) {
|
|
||||||
return node.transform(tw, true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
DEF(AST_Node, noop);
|
|
||||||
DEF(AST_LabeledStatement, function(self, tw) {
|
|
||||||
self.label = self.label.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_SimpleStatement, function(self, tw) {
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Block, function(self, tw) {
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Do, function(self, tw) {
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
self.condition = self.condition.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_While, function(self, tw) {
|
|
||||||
self.condition = self.condition.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_For, function(self, tw) {
|
|
||||||
if (self.init) self.init = self.init.transform(tw);
|
|
||||||
if (self.condition) self.condition = self.condition.transform(tw);
|
|
||||||
if (self.step) self.step = self.step.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_ForIn, function(self, tw) {
|
|
||||||
self.init = self.init.transform(tw);
|
|
||||||
self.object = self.object.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_With, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Exit, function(self, tw) {
|
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_LoopControl, function(self, tw) {
|
|
||||||
if (self.label) self.label = self.label.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_If, function(self, tw) {
|
|
||||||
self.condition = self.condition.transform(tw);
|
|
||||||
self.body = self.body.transform(tw);
|
|
||||||
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Switch, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Case, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Try, function(self, tw) {
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
|
||||||
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Catch, function(self, tw) {
|
|
||||||
self.argname = self.argname.transform(tw);
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Definitions, function(self, tw) {
|
|
||||||
self.definitions = do_list(self.definitions, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_VarDef, function(self, tw) {
|
|
||||||
self.name = self.name.transform(tw);
|
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Lambda, function(self, tw) {
|
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
|
||||||
self.argnames = do_list(self.argnames, tw);
|
|
||||||
self.body = do_list(self.body, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Call, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
self.args = do_list(self.args, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Sequence, function(self, tw) {
|
|
||||||
self.expressions = do_list(self.expressions, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Dot, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Sub, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
self.property = self.property.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Unary, function(self, tw) {
|
|
||||||
self.expression = self.expression.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Binary, function(self, tw) {
|
|
||||||
self.left = self.left.transform(tw);
|
|
||||||
self.right = self.right.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Conditional, function(self, tw) {
|
|
||||||
self.condition = self.condition.transform(tw);
|
|
||||||
self.consequent = self.consequent.transform(tw);
|
|
||||||
self.alternative = self.alternative.transform(tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Array, function(self, tw) {
|
|
||||||
self.elements = do_list(self.elements, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_Object, function(self, tw) {
|
|
||||||
self.properties = do_list(self.properties, tw);
|
|
||||||
});
|
|
||||||
DEF(AST_ObjectProperty, function(self, tw) {
|
|
||||||
self.value = self.value.transform(tw);
|
|
||||||
});
|
|
||||||
})(function(node, descend) {
|
|
||||||
node.DEFMETHOD("transform", function(tw, in_list) {
|
|
||||||
var x, y;
|
|
||||||
tw.push(this);
|
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
|
||||||
if (typeof x === "undefined") {
|
|
||||||
x = this;
|
|
||||||
descend(x, tw);
|
|
||||||
if (tw.after) {
|
|
||||||
y = tw.after(x, in_list);
|
|
||||||
if (typeof y !== "undefined") x = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tw.pop();
|
|
||||||
return x;
|
|
||||||
});
|
|
||||||
});
|
|
275
node_modules/uglify-js/lib/utils.js
generated
vendored
275
node_modules/uglify-js/lib/utils.js
generated
vendored
|
@ -1,275 +0,0 @@
|
||||||
/***********************************************************************
|
|
||||||
|
|
||||||
A JavaScript tokenizer / parser / beautifier / compressor.
|
|
||||||
https://github.com/mishoo/UglifyJS2
|
|
||||||
|
|
||||||
-------------------------------- (C) ---------------------------------
|
|
||||||
|
|
||||||
Author: Mihai Bazon
|
|
||||||
<mihai.bazon@gmail.com>
|
|
||||||
http://mihai.bazon.net/blog
|
|
||||||
|
|
||||||
Distributed under the BSD license:
|
|
||||||
|
|
||||||
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following
|
|
||||||
disclaimer in the documentation and/or other materials
|
|
||||||
provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
|
||||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
|
||||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
||||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGE.
|
|
||||||
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function characters(str) {
|
|
||||||
return str.split("");
|
|
||||||
}
|
|
||||||
|
|
||||||
function member(name, array) {
|
|
||||||
return array.indexOf(name) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function find_if(func, array) {
|
|
||||||
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
function repeat_string(str, i) {
|
|
||||||
if (i <= 0) return "";
|
|
||||||
if (i == 1) return str;
|
|
||||||
var d = repeat_string(str, i >> 1);
|
|
||||||
d += d;
|
|
||||||
return i & 1 ? d + str : d;
|
|
||||||
}
|
|
||||||
|
|
||||||
function configure_error_stack(fn) {
|
|
||||||
Object.defineProperty(fn.prototype, "stack", {
|
|
||||||
get: function() {
|
|
||||||
var err = new Error(this.message);
|
|
||||||
err.name = this.name;
|
|
||||||
try {
|
|
||||||
throw err;
|
|
||||||
} catch (e) {
|
|
||||||
return e.stack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function DefaultsError(msg, defs) {
|
|
||||||
this.message = msg;
|
|
||||||
this.defs = defs;
|
|
||||||
}
|
|
||||||
DefaultsError.prototype = Object.create(Error.prototype);
|
|
||||||
DefaultsError.prototype.constructor = DefaultsError;
|
|
||||||
DefaultsError.prototype.name = "DefaultsError";
|
|
||||||
configure_error_stack(DefaultsError);
|
|
||||||
|
|
||||||
function defaults(args, defs, croak) {
|
|
||||||
if (args === true) args = {};
|
|
||||||
var ret = args || {};
|
|
||||||
if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i)) {
|
|
||||||
throw new DefaultsError("`" + i + "` is not a supported option", defs);
|
|
||||||
}
|
|
||||||
for (var i in defs) if (HOP(defs, i)) {
|
|
||||||
ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function merge(obj, ext) {
|
|
||||||
var count = 0;
|
|
||||||
for (var i in ext) if (HOP(ext, i)) {
|
|
||||||
obj[i] = ext[i];
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
function noop() {}
|
|
||||||
function return_false() { return false; }
|
|
||||||
function return_true() { return true; }
|
|
||||||
function return_this() { return this; }
|
|
||||||
function return_null() { return null; }
|
|
||||||
|
|
||||||
var MAP = (function() {
|
|
||||||
function MAP(a, f, backwards) {
|
|
||||||
var ret = [], top = [], i;
|
|
||||||
function doit() {
|
|
||||||
var val = f(a[i], i);
|
|
||||||
var is_last = val instanceof Last;
|
|
||||||
if (is_last) val = val.v;
|
|
||||||
if (val instanceof AtTop) {
|
|
||||||
val = val.v;
|
|
||||||
if (val instanceof Splice) {
|
|
||||||
top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
|
|
||||||
} else {
|
|
||||||
top.push(val);
|
|
||||||
}
|
|
||||||
} else if (val !== skip) {
|
|
||||||
if (val instanceof Splice) {
|
|
||||||
ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
|
|
||||||
} else {
|
|
||||||
ret.push(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return is_last;
|
|
||||||
}
|
|
||||||
if (Array.isArray(a)) {
|
|
||||||
if (backwards) {
|
|
||||||
for (i = a.length; --i >= 0;) if (doit()) break;
|
|
||||||
ret.reverse();
|
|
||||||
top.reverse();
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < a.length; ++i) if (doit()) break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i in a) if (HOP(a, i)) if (doit()) break;
|
|
||||||
}
|
|
||||||
return top.concat(ret);
|
|
||||||
}
|
|
||||||
MAP.at_top = function(val) { return new AtTop(val) };
|
|
||||||
MAP.splice = function(val) { return new Splice(val) };
|
|
||||||
MAP.last = function(val) { return new Last(val) };
|
|
||||||
var skip = MAP.skip = {};
|
|
||||||
function AtTop(val) { this.v = val }
|
|
||||||
function Splice(val) { this.v = val }
|
|
||||||
function Last(val) { this.v = val }
|
|
||||||
return MAP;
|
|
||||||
})();
|
|
||||||
|
|
||||||
function push_uniq(array, el) {
|
|
||||||
if (array.indexOf(el) < 0) return array.push(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
function string_template(text, props) {
|
|
||||||
return text.replace(/\{(.+?)\}/g, function(str, p) {
|
|
||||||
return props && props[p];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove(array, el) {
|
|
||||||
var index = array.indexOf(el);
|
|
||||||
if (index >= 0) array.splice(index, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function makePredicate(words) {
|
|
||||||
if (!Array.isArray(words)) words = words.split(" ");
|
|
||||||
var map = Object.create(null);
|
|
||||||
words.forEach(function(word) {
|
|
||||||
map[word] = true;
|
|
||||||
});
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
function all(array, predicate) {
|
|
||||||
for (var i = array.length; --i >= 0;)
|
|
||||||
if (!predicate(array[i]))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Dictionary() {
|
|
||||||
this._values = Object.create(null);
|
|
||||||
this._size = 0;
|
|
||||||
}
|
|
||||||
Dictionary.prototype = {
|
|
||||||
set: function(key, val) {
|
|
||||||
if (!this.has(key)) ++this._size;
|
|
||||||
this._values["$" + key] = val;
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
add: function(key, val) {
|
|
||||||
if (this.has(key)) {
|
|
||||||
this.get(key).push(val);
|
|
||||||
} else {
|
|
||||||
this.set(key, [ val ]);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
get: function(key) { return this._values["$" + key] },
|
|
||||||
del: function(key) {
|
|
||||||
if (this.has(key)) {
|
|
||||||
--this._size;
|
|
||||||
delete this._values["$" + key];
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
has: function(key) { return ("$" + key) in this._values },
|
|
||||||
each: function(f) {
|
|
||||||
for (var i in this._values)
|
|
||||||
f(this._values[i], i.substr(1));
|
|
||||||
},
|
|
||||||
size: function() {
|
|
||||||
return this._size;
|
|
||||||
},
|
|
||||||
map: function(f) {
|
|
||||||
var ret = [];
|
|
||||||
for (var i in this._values)
|
|
||||||
ret.push(f(this._values[i], i.substr(1)));
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
clone: function() {
|
|
||||||
var ret = new Dictionary();
|
|
||||||
for (var i in this._values)
|
|
||||||
ret._values[i] = this._values[i];
|
|
||||||
ret._size = this._size;
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
toObject: function() { return this._values }
|
|
||||||
};
|
|
||||||
Dictionary.fromObject = function(obj) {
|
|
||||||
var dict = new Dictionary();
|
|
||||||
dict._size = merge(dict._values, obj);
|
|
||||||
return dict;
|
|
||||||
};
|
|
||||||
|
|
||||||
function HOP(obj, prop) {
|
|
||||||
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
||||||
}
|
|
||||||
|
|
||||||
// return true if the node at the top of the stack (that means the
|
|
||||||
// innermost node in the current output) is lexically the first in
|
|
||||||
// a statement.
|
|
||||||
function first_in_statement(stack) {
|
|
||||||
var node = stack.parent(-1);
|
|
||||||
for (var i = 0, p; p = stack.parent(i++); node = p) {
|
|
||||||
if (p.TYPE == "Call") {
|
|
||||||
if (p.expression === node) continue;
|
|
||||||
} else if (p instanceof AST_Binary) {
|
|
||||||
if (p.left === node) continue;
|
|
||||||
} else if (p instanceof AST_Conditional) {
|
|
||||||
if (p.condition === node) continue;
|
|
||||||
} else if (p instanceof AST_PropAccess) {
|
|
||||||
if (p.expression === node) continue;
|
|
||||||
} else if (p instanceof AST_Sequence) {
|
|
||||||
if (p.expressions[0] === node) continue;
|
|
||||||
} else if (p instanceof AST_Statement) {
|
|
||||||
return p.body === node;
|
|
||||||
} else if (p instanceof AST_UnaryPostfix) {
|
|
||||||
if (p.expression === node) continue;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
104
node_modules/uglify-js/package.json
generated
vendored
104
node_modules/uglify-js/package.json
generated
vendored
|
@ -1,104 +0,0 @@
|
||||||
{
|
|
||||||
"_from": "uglify-js",
|
|
||||||
"_id": "uglify-js@3.6.9",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==",
|
|
||||||
"_location": "/uglify-js",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "uglify-js",
|
|
||||||
"name": "uglify-js",
|
|
||||||
"escapedName": "uglify-js",
|
|
||||||
"rawSpec": "",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz",
|
|
||||||
"_shasum": "85d353edb6ddfb62a9d798f36e91792249320611",
|
|
||||||
"_spec": "uglify-js",
|
|
||||||
"_where": "/home/nilix/lib/planetaryGears",
|
|
||||||
"author": {
|
|
||||||
"name": "Mihai Bazon",
|
|
||||||
"email": "mihai.bazon@gmail.com",
|
|
||||||
"url": "http://lisperator.net/"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"uglifyjs": "bin/uglifyjs"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/mishoo/UglifyJS2/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"commander": "~2.20.3",
|
|
||||||
"source-map": "~0.6.1"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
|
||||||
"devDependencies": {
|
|
||||||
"acorn": "~7.1.0",
|
|
||||||
"semver": "~6.3.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"bin",
|
|
||||||
"lib",
|
|
||||||
"tools",
|
|
||||||
"LICENSE"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/mishoo/UglifyJS2#readme",
|
|
||||||
"keywords": [
|
|
||||||
"cli",
|
|
||||||
"compress",
|
|
||||||
"compressor",
|
|
||||||
"ecma",
|
|
||||||
"ecmascript",
|
|
||||||
"es",
|
|
||||||
"es5",
|
|
||||||
"javascript",
|
|
||||||
"js",
|
|
||||||
"jsmin",
|
|
||||||
"min",
|
|
||||||
"minification",
|
|
||||||
"minifier",
|
|
||||||
"minify",
|
|
||||||
"optimize",
|
|
||||||
"optimizer",
|
|
||||||
"pack",
|
|
||||||
"packer",
|
|
||||||
"parse",
|
|
||||||
"parser",
|
|
||||||
"uglifier",
|
|
||||||
"uglify"
|
|
||||||
],
|
|
||||||
"license": "BSD-2-Clause",
|
|
||||||
"main": "tools/node.js",
|
|
||||||
"maintainers": [
|
|
||||||
{
|
|
||||||
"name": "Alex Lam",
|
|
||||||
"email": "alexlamsl@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mihai Bazon",
|
|
||||||
"email": "mihai.bazon@gmail.com",
|
|
||||||
"url": "http://lisperator.net/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "uglify-js",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/mishoo/UglifyJS2.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "node test/compress.js && node test/mocha.js"
|
|
||||||
},
|
|
||||||
"version": "3.6.9"
|
|
||||||
}
|
|
6850
node_modules/uglify-js/tools/domprops.json
generated
vendored
6850
node_modules/uglify-js/tools/domprops.json
generated
vendored
File diff suppressed because it is too large
Load diff
15
node_modules/uglify-js/tools/exit.js
generated
vendored
15
node_modules/uglify-js/tools/exit.js
generated
vendored
|
@ -1,15 +0,0 @@
|
||||||
// workaround for tty output truncation upon process.exit()
|
|
||||||
var exit = process.exit;
|
|
||||||
process.exit = function() {
|
|
||||||
var args = [].slice.call(arguments);
|
|
||||||
process.once("uncaughtException", function() {
|
|
||||||
(function callback() {
|
|
||||||
if (process.stdout.bufferSize || process.stderr.bufferSize) {
|
|
||||||
setImmediate(callback);
|
|
||||||
} else {
|
|
||||||
exit.apply(process, args);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
});
|
|
||||||
throw exit;
|
|
||||||
};
|
|
6
node_modules/uglify-js/tools/exports.js
generated
vendored
6
node_modules/uglify-js/tools/exports.js
generated
vendored
|
@ -1,6 +0,0 @@
|
||||||
exports["Dictionary"] = Dictionary;
|
|
||||||
exports["minify"] = minify;
|
|
||||||
exports["parse"] = parse;
|
|
||||||
exports["push_uniq"] = push_uniq;
|
|
||||||
exports["TreeTransformer"] = TreeTransformer;
|
|
||||||
exports["TreeWalker"] = TreeWalker;
|
|
78
node_modules/uglify-js/tools/node.js
generated
vendored
78
node_modules/uglify-js/tools/node.js
generated
vendored
|
@ -1,78 +0,0 @@
|
||||||
var fs = require("fs");
|
|
||||||
|
|
||||||
exports.FILES = [
|
|
||||||
require.resolve("../lib/utils.js"),
|
|
||||||
require.resolve("../lib/ast.js"),
|
|
||||||
require.resolve("../lib/parse.js"),
|
|
||||||
require.resolve("../lib/transform.js"),
|
|
||||||
require.resolve("../lib/scope.js"),
|
|
||||||
require.resolve("../lib/output.js"),
|
|
||||||
require.resolve("../lib/compress.js"),
|
|
||||||
require.resolve("../lib/sourcemap.js"),
|
|
||||||
require.resolve("../lib/mozilla-ast.js"),
|
|
||||||
require.resolve("../lib/propmangle.js"),
|
|
||||||
require.resolve("../lib/minify.js"),
|
|
||||||
require.resolve("./exports.js"),
|
|
||||||
];
|
|
||||||
|
|
||||||
new Function("MOZ_SourceMap", "exports", function() {
|
|
||||||
var code = exports.FILES.map(function(file) {
|
|
||||||
return fs.readFileSync(file, "utf8");
|
|
||||||
});
|
|
||||||
code.push("exports.describe_ast = " + describe_ast.toString());
|
|
||||||
return code.join("\n\n");
|
|
||||||
}())(require("source-map"), exports);
|
|
||||||
|
|
||||||
function describe_ast() {
|
|
||||||
var out = OutputStream({ beautify: true });
|
|
||||||
function doitem(ctor) {
|
|
||||||
out.print("AST_" + ctor.TYPE);
|
|
||||||
var props = ctor.SELF_PROPS.filter(function(prop) {
|
|
||||||
return !/^\$/.test(prop);
|
|
||||||
});
|
|
||||||
if (props.length > 0) {
|
|
||||||
out.space();
|
|
||||||
out.with_parens(function() {
|
|
||||||
props.forEach(function(prop, i) {
|
|
||||||
if (i) out.space();
|
|
||||||
out.print(prop);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (ctor.documentation) {
|
|
||||||
out.space();
|
|
||||||
out.print_string(ctor.documentation);
|
|
||||||
}
|
|
||||||
if (ctor.SUBCLASSES.length > 0) {
|
|
||||||
out.space();
|
|
||||||
out.with_block(function() {
|
|
||||||
ctor.SUBCLASSES.sort(function(a, b) {
|
|
||||||
return a.TYPE < b.TYPE ? -1 : 1;
|
|
||||||
}).forEach(function(ctor, i) {
|
|
||||||
out.indent();
|
|
||||||
doitem(ctor);
|
|
||||||
out.newline();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
doitem(AST_Node);
|
|
||||||
return out + "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
function infer_options(options) {
|
|
||||||
var result = exports.minify("", options);
|
|
||||||
return result.error && result.error.defs;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.default_options = function() {
|
|
||||||
var defs = {};
|
|
||||||
Object.keys(infer_options({ 0: 0 })).forEach(function(component) {
|
|
||||||
var options = {};
|
|
||||||
options[component] = { 0: 0 };
|
|
||||||
if (options = infer_options(options)) {
|
|
||||||
defs[component] = options;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return defs;
|
|
||||||
};
|
|
540
node_modules/uglify-js/tools/props.html
generated
vendored
540
node_modules/uglify-js/tools/props.html
generated
vendored
|
@ -1,540 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<body>
|
|
||||||
<script>
|
|
||||||
!function() {
|
|
||||||
var names = [];
|
|
||||||
var scanned = [];
|
|
||||||
var to_scan = [];
|
|
||||||
|
|
||||||
function scan(obj) {
|
|
||||||
if (obj && typeof obj == "object" && !~scanned.indexOf(obj)) {
|
|
||||||
scanned.push(obj);
|
|
||||||
to_scan.push(obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scan(self);
|
|
||||||
[
|
|
||||||
"a",
|
|
||||||
"abbr",
|
|
||||||
"acronym",
|
|
||||||
"address",
|
|
||||||
"applet",
|
|
||||||
"area",
|
|
||||||
"article",
|
|
||||||
"aside",
|
|
||||||
"audio",
|
|
||||||
"b",
|
|
||||||
"base",
|
|
||||||
"basefont",
|
|
||||||
"bdi",
|
|
||||||
"bdo",
|
|
||||||
"bgsound",
|
|
||||||
"big",
|
|
||||||
"blink",
|
|
||||||
"blockquote",
|
|
||||||
"body",
|
|
||||||
"br",
|
|
||||||
"button",
|
|
||||||
"canvas",
|
|
||||||
"caption",
|
|
||||||
"center",
|
|
||||||
"checked",
|
|
||||||
"cite",
|
|
||||||
"code",
|
|
||||||
"col",
|
|
||||||
"colgroup",
|
|
||||||
"command",
|
|
||||||
"comment",
|
|
||||||
"compact",
|
|
||||||
"content",
|
|
||||||
"data",
|
|
||||||
"datalist",
|
|
||||||
"dd",
|
|
||||||
"declare",
|
|
||||||
"defer",
|
|
||||||
"del",
|
|
||||||
"details",
|
|
||||||
"dfn",
|
|
||||||
"dialog",
|
|
||||||
"dir",
|
|
||||||
"disabled",
|
|
||||||
"div",
|
|
||||||
"dl",
|
|
||||||
"dt",
|
|
||||||
"element",
|
|
||||||
"em",
|
|
||||||
"embed",
|
|
||||||
"fieldset",
|
|
||||||
"figcaption",
|
|
||||||
"figure",
|
|
||||||
"font",
|
|
||||||
"footer",
|
|
||||||
"form",
|
|
||||||
"frame",
|
|
||||||
"frameset",
|
|
||||||
"h1",
|
|
||||||
"h2",
|
|
||||||
"h3",
|
|
||||||
"h4",
|
|
||||||
"h5",
|
|
||||||
"h6",
|
|
||||||
"head",
|
|
||||||
"header",
|
|
||||||
"hgroup",
|
|
||||||
"hr",
|
|
||||||
"html",
|
|
||||||
"i",
|
|
||||||
"iframe",
|
|
||||||
"image",
|
|
||||||
"img",
|
|
||||||
"input",
|
|
||||||
"ins",
|
|
||||||
"isindex",
|
|
||||||
"ismap",
|
|
||||||
"kbd",
|
|
||||||
"keygen",
|
|
||||||
"label",
|
|
||||||
"legend",
|
|
||||||
"li",
|
|
||||||
"link",
|
|
||||||
"listing",
|
|
||||||
"main",
|
|
||||||
"map",
|
|
||||||
"mark",
|
|
||||||
"marquee",
|
|
||||||
"math",
|
|
||||||
"menu",
|
|
||||||
"menuitem",
|
|
||||||
"meta",
|
|
||||||
"meter",
|
|
||||||
"multicol",
|
|
||||||
"multiple",
|
|
||||||
"nav",
|
|
||||||
"nobr",
|
|
||||||
"noembed",
|
|
||||||
"noframes",
|
|
||||||
"nohref",
|
|
||||||
"noresize",
|
|
||||||
"noscript",
|
|
||||||
"noshade",
|
|
||||||
"nowrap",
|
|
||||||
"object",
|
|
||||||
"ol",
|
|
||||||
"optgroup",
|
|
||||||
"option",
|
|
||||||
"output",
|
|
||||||
"p",
|
|
||||||
"param",
|
|
||||||
"picture",
|
|
||||||
"plaintext",
|
|
||||||
"pre",
|
|
||||||
"progress",
|
|
||||||
"q",
|
|
||||||
"rb",
|
|
||||||
"readonly",
|
|
||||||
"rp",
|
|
||||||
"rt",
|
|
||||||
"rtc",
|
|
||||||
"ruby",
|
|
||||||
"s",
|
|
||||||
"samp",
|
|
||||||
"script",
|
|
||||||
"section",
|
|
||||||
"select",
|
|
||||||
"selected",
|
|
||||||
"shadow",
|
|
||||||
"small",
|
|
||||||
"source",
|
|
||||||
"spacer",
|
|
||||||
"span",
|
|
||||||
"strike",
|
|
||||||
"strong",
|
|
||||||
"style",
|
|
||||||
"sub",
|
|
||||||
"summary",
|
|
||||||
"sup",
|
|
||||||
"svg",
|
|
||||||
"table",
|
|
||||||
"tbody",
|
|
||||||
"td",
|
|
||||||
"template",
|
|
||||||
"textarea",
|
|
||||||
"tfoot",
|
|
||||||
"th",
|
|
||||||
"thead",
|
|
||||||
"time",
|
|
||||||
"title",
|
|
||||||
"tr",
|
|
||||||
"track",
|
|
||||||
"tt",
|
|
||||||
"u",
|
|
||||||
"ul",
|
|
||||||
"var",
|
|
||||||
"video",
|
|
||||||
"wbr",
|
|
||||||
"xmp",
|
|
||||||
"XXX",
|
|
||||||
].forEach(function(tag) {
|
|
||||||
scan(document.createElement(tag));
|
|
||||||
});
|
|
||||||
[
|
|
||||||
"abort",
|
|
||||||
"absolutedeviceorientation",
|
|
||||||
"activate",
|
|
||||||
"active",
|
|
||||||
"addsourcebuffer",
|
|
||||||
"addstream",
|
|
||||||
"addtrack",
|
|
||||||
"afterprint",
|
|
||||||
"afterscriptexecute",
|
|
||||||
"afterupdate",
|
|
||||||
"animationcancel",
|
|
||||||
"animationend",
|
|
||||||
"animationiteration",
|
|
||||||
"animationstart",
|
|
||||||
"appinstalled",
|
|
||||||
"audioend",
|
|
||||||
"audioprocess",
|
|
||||||
"audiostart",
|
|
||||||
"autocomplete",
|
|
||||||
"autocompleteerror",
|
|
||||||
"auxclick",
|
|
||||||
"beforeactivate",
|
|
||||||
"beforecopy",
|
|
||||||
"beforecut",
|
|
||||||
"beforedeactivate",
|
|
||||||
"beforeeditfocus",
|
|
||||||
"beforeinstallprompt",
|
|
||||||
"beforepaste",
|
|
||||||
"beforeprint",
|
|
||||||
"beforescriptexecute",
|
|
||||||
"beforeunload",
|
|
||||||
"beforeupdate",
|
|
||||||
"blocked",
|
|
||||||
"blur",
|
|
||||||
"bounce",
|
|
||||||
"boundary",
|
|
||||||
"cached",
|
|
||||||
"cancel",
|
|
||||||
"candidatewindowhide",
|
|
||||||
"candidatewindowshow",
|
|
||||||
"candidatewindowupdate",
|
|
||||||
"canplay",
|
|
||||||
"canplaythrough",
|
|
||||||
"cellchange",
|
|
||||||
"change",
|
|
||||||
"chargingchange",
|
|
||||||
"chargingtimechange",
|
|
||||||
"checking",
|
|
||||||
"click",
|
|
||||||
"close",
|
|
||||||
"compassneedscalibration",
|
|
||||||
"complete",
|
|
||||||
"connect",
|
|
||||||
"connecting",
|
|
||||||
"connectionstatechange",
|
|
||||||
"contextmenu",
|
|
||||||
"controllerchange",
|
|
||||||
"controlselect",
|
|
||||||
"copy",
|
|
||||||
"cuechange",
|
|
||||||
"cut",
|
|
||||||
"dataavailable",
|
|
||||||
"datachannel",
|
|
||||||
"datasetchanged",
|
|
||||||
"datasetcomplete",
|
|
||||||
"dblclick",
|
|
||||||
"deactivate",
|
|
||||||
"devicechange",
|
|
||||||
"devicelight",
|
|
||||||
"devicemotion",
|
|
||||||
"deviceorientation",
|
|
||||||
"deviceorientationabsolute",
|
|
||||||
"deviceproximity",
|
|
||||||
"dischargingtimechange",
|
|
||||||
"disconnect",
|
|
||||||
"display",
|
|
||||||
"downloading",
|
|
||||||
"drag",
|
|
||||||
"dragend",
|
|
||||||
"dragenter",
|
|
||||||
"dragexit",
|
|
||||||
"dragleave",
|
|
||||||
"dragover",
|
|
||||||
"dragstart",
|
|
||||||
"drop",
|
|
||||||
"durationchange",
|
|
||||||
"emptied",
|
|
||||||
"encrypted",
|
|
||||||
"end",
|
|
||||||
"ended",
|
|
||||||
"enter",
|
|
||||||
"enterpictureinpicture",
|
|
||||||
"error",
|
|
||||||
"errorupdate",
|
|
||||||
"exit",
|
|
||||||
"filterchange",
|
|
||||||
"finish",
|
|
||||||
"focus",
|
|
||||||
"focusin",
|
|
||||||
"focusout",
|
|
||||||
"freeze",
|
|
||||||
"fullscreenchange",
|
|
||||||
"fullscreenerror",
|
|
||||||
"gesturechange",
|
|
||||||
"gestureend",
|
|
||||||
"gesturestart",
|
|
||||||
"gotpointercapture",
|
|
||||||
"hashchange",
|
|
||||||
"help",
|
|
||||||
"icecandidate",
|
|
||||||
"iceconnectionstatechange",
|
|
||||||
"icegatheringstatechange",
|
|
||||||
"inactive",
|
|
||||||
"input",
|
|
||||||
"invalid",
|
|
||||||
"keydown",
|
|
||||||
"keypress",
|
|
||||||
"keyup",
|
|
||||||
"languagechange",
|
|
||||||
"layoutcomplete",
|
|
||||||
"leavepictureinpicture",
|
|
||||||
"levelchange",
|
|
||||||
"load",
|
|
||||||
"loadeddata",
|
|
||||||
"loadedmetadata",
|
|
||||||
"loadend",
|
|
||||||
"loading",
|
|
||||||
"loadingdone",
|
|
||||||
"loadingerror",
|
|
||||||
"loadstart",
|
|
||||||
"losecapture",
|
|
||||||
"lostpointercapture",
|
|
||||||
"mark",
|
|
||||||
"message",
|
|
||||||
"messageerror",
|
|
||||||
"mousedown",
|
|
||||||
"mouseenter",
|
|
||||||
"mouseleave",
|
|
||||||
"mousemove",
|
|
||||||
"mouseout",
|
|
||||||
"mouseover",
|
|
||||||
"mouseup",
|
|
||||||
"mousewheel",
|
|
||||||
"move",
|
|
||||||
"moveend",
|
|
||||||
"movestart",
|
|
||||||
"mozfullscreenchange",
|
|
||||||
"mozfullscreenerror",
|
|
||||||
"mozorientationchange",
|
|
||||||
"mozpointerlockchange",
|
|
||||||
"mozpointerlockerror",
|
|
||||||
"mscontentzoom",
|
|
||||||
"msfullscreenchange",
|
|
||||||
"msfullscreenerror",
|
|
||||||
"msgesturechange",
|
|
||||||
"msgesturedoubletap",
|
|
||||||
"msgestureend",
|
|
||||||
"msgesturehold",
|
|
||||||
"msgesturestart",
|
|
||||||
"msgesturetap",
|
|
||||||
"msgotpointercapture",
|
|
||||||
"msinertiastart",
|
|
||||||
"mslostpointercapture",
|
|
||||||
"msmanipulationstatechanged",
|
|
||||||
"msneedkey",
|
|
||||||
"msorientationchange",
|
|
||||||
"mspointercancel",
|
|
||||||
"mspointerdown",
|
|
||||||
"mspointerenter",
|
|
||||||
"mspointerhover",
|
|
||||||
"mspointerleave",
|
|
||||||
"mspointermove",
|
|
||||||
"mspointerout",
|
|
||||||
"mspointerover",
|
|
||||||
"mspointerup",
|
|
||||||
"mssitemodejumplistitemremoved",
|
|
||||||
"msthumbnailclick",
|
|
||||||
"negotiationneeded",
|
|
||||||
"nomatch",
|
|
||||||
"noupdate",
|
|
||||||
"obsolete",
|
|
||||||
"offline",
|
|
||||||
"online",
|
|
||||||
"open",
|
|
||||||
"orientationchange",
|
|
||||||
"pagechange",
|
|
||||||
"pagehide",
|
|
||||||
"pageshow",
|
|
||||||
"paste",
|
|
||||||
"pause",
|
|
||||||
"play",
|
|
||||||
"playing",
|
|
||||||
"pluginstreamstart",
|
|
||||||
"pointercancel",
|
|
||||||
"pointerdown",
|
|
||||||
"pointerenter",
|
|
||||||
"pointerleave",
|
|
||||||
"pointerlockchange",
|
|
||||||
"pointerlockerror",
|
|
||||||
"pointermove",
|
|
||||||
"pointerout",
|
|
||||||
"pointerover",
|
|
||||||
"pointerup",
|
|
||||||
"popstate",
|
|
||||||
"progress",
|
|
||||||
"propertychange",
|
|
||||||
"ratechange",
|
|
||||||
"reading",
|
|
||||||
"readystatechange",
|
|
||||||
"rejectionhandled",
|
|
||||||
"removesourcebuffer",
|
|
||||||
"removestream",
|
|
||||||
"removetrack",
|
|
||||||
"reset",
|
|
||||||
"resize",
|
|
||||||
"resizeend",
|
|
||||||
"resizestart",
|
|
||||||
"resourcetimingbufferfull",
|
|
||||||
"result",
|
|
||||||
"resume",
|
|
||||||
"rowenter",
|
|
||||||
"rowexit",
|
|
||||||
"rowsdelete",
|
|
||||||
"rowsinserted",
|
|
||||||
"scroll",
|
|
||||||
"search",
|
|
||||||
"seeked",
|
|
||||||
"seeking",
|
|
||||||
"select",
|
|
||||||
"selectionchange",
|
|
||||||
"selectstart",
|
|
||||||
"show",
|
|
||||||
"signalingstatechange",
|
|
||||||
"soundend",
|
|
||||||
"soundstart",
|
|
||||||
"sourceclose",
|
|
||||||
"sourceclosed",
|
|
||||||
"sourceended",
|
|
||||||
"sourceopen",
|
|
||||||
"speechend",
|
|
||||||
"speechstart",
|
|
||||||
"stalled",
|
|
||||||
"start",
|
|
||||||
"statechange",
|
|
||||||
"stop",
|
|
||||||
"storage",
|
|
||||||
"storagecommit",
|
|
||||||
"submit",
|
|
||||||
"success",
|
|
||||||
"suspend",
|
|
||||||
"textinput",
|
|
||||||
"timeout",
|
|
||||||
"timeupdate",
|
|
||||||
"toggle",
|
|
||||||
"touchcancel",
|
|
||||||
"touchend",
|
|
||||||
"touchmove",
|
|
||||||
"touchstart",
|
|
||||||
"track",
|
|
||||||
"transitioncancel",
|
|
||||||
"transitionend",
|
|
||||||
"transitionrun",
|
|
||||||
"transitionstart",
|
|
||||||
"unhandledrejection",
|
|
||||||
"unload",
|
|
||||||
"updateready",
|
|
||||||
"upgradeneeded",
|
|
||||||
"userproximity",
|
|
||||||
"versionchange",
|
|
||||||
"visibilitychange",
|
|
||||||
"voiceschanged",
|
|
||||||
"volumechange",
|
|
||||||
"vrdisplayactivate",
|
|
||||||
"vrdisplayconnect",
|
|
||||||
"vrdisplaydeactivate",
|
|
||||||
"vrdisplaydisconnect",
|
|
||||||
"vrdisplaypresentchange",
|
|
||||||
"waiting",
|
|
||||||
"waitingforkey",
|
|
||||||
"warning",
|
|
||||||
"webkitanimationend",
|
|
||||||
"webkitanimationiteration",
|
|
||||||
"webkitanimationstart",
|
|
||||||
"webkitcurrentplaybacktargetiswirelesschanged",
|
|
||||||
"webkitfullscreenchange",
|
|
||||||
"webkitfullscreenerror",
|
|
||||||
"webkitkeyadded",
|
|
||||||
"webkitkeyerror",
|
|
||||||
"webkitkeymessage",
|
|
||||||
"webkitneedkey",
|
|
||||||
"webkitorientationchange",
|
|
||||||
"webkitplaybacktargetavailabilitychanged",
|
|
||||||
"webkitpointerlockchange",
|
|
||||||
"webkitpointerlockerror",
|
|
||||||
"webkitresourcetimingbufferfull",
|
|
||||||
"webkittransitionend",
|
|
||||||
"wheel",
|
|
||||||
"zoom",
|
|
||||||
].forEach(function(type) {
|
|
||||||
[
|
|
||||||
"beforeunloadevent",
|
|
||||||
"compositionevent",
|
|
||||||
"customevent",
|
|
||||||
"devicemotionevent",
|
|
||||||
"deviceorientationevent",
|
|
||||||
"dragevent",
|
|
||||||
"event",
|
|
||||||
"events",
|
|
||||||
"focusevent",
|
|
||||||
"hashchangeevent",
|
|
||||||
"htmlevents",
|
|
||||||
"keyboardevent",
|
|
||||||
"messageevent",
|
|
||||||
"mouseevent",
|
|
||||||
"mouseevents",
|
|
||||||
"storageevent",
|
|
||||||
"svgevents",
|
|
||||||
"textevent",
|
|
||||||
"touchevent",
|
|
||||||
"uievent",
|
|
||||||
"uievents",
|
|
||||||
].forEach(function(interface) {
|
|
||||||
try {
|
|
||||||
var event = document.createEvent(interface);
|
|
||||||
event.initEvent(type, true, true);
|
|
||||||
scan(event);
|
|
||||||
} catch (e) {}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
var obj;
|
|
||||||
while (obj = to_scan.shift()) {
|
|
||||||
var proto = obj;
|
|
||||||
do {
|
|
||||||
Object.getOwnPropertyNames(proto).forEach(function(name) {
|
|
||||||
var visited = ~names.indexOf(name);
|
|
||||||
if (!visited) names.push(name);
|
|
||||||
try {
|
|
||||||
scan(obj[name]);
|
|
||||||
if (visited) return;
|
|
||||||
if (/^create/.test(name)) {
|
|
||||||
scan(obj[name]());
|
|
||||||
}
|
|
||||||
if (/^[A-Z]/.test(name)) {
|
|
||||||
scan(new obj[name]());
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
});
|
|
||||||
} while (proto = Object.getPrototypeOf(proto));
|
|
||||||
}
|
|
||||||
names.sort();
|
|
||||||
document.write('<pre>[\n "');
|
|
||||||
document.write(names.join('",\n "'));
|
|
||||||
document.write('"\n]</pre>');
|
|
||||||
}();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in a new issue