pax_global_header00006660000000000000000000000064127533534510014522gustar00rootroot0000000000000052 comment=714189c8e0d75b64cf7c52a29481baa7143dd267 esniff-1.1.0/000077500000000000000000000000001275335345100127735ustar00rootroot00000000000000esniff-1.1.0/.gitignore000066400000000000000000000000631275335345100147620ustar00rootroot00000000000000.DS_Store /node_modules /npm-debug.log /.lintcache esniff-1.1.0/.lint000066400000000000000000000001371275335345100137430ustar00rootroot00000000000000@root module tabs indent 2 maxlen 100 ass continue nomen plusplus ./test predef+ __dirname esniff-1.1.0/.lintignore000066400000000000000000000000501275335345100151410ustar00rootroot00000000000000/is-var-name-valid.js /test/__playgroundesniff-1.1.0/.travis.yml000066400000000000000000000003511275335345100151030ustar00rootroot00000000000000sudo: false # http://docs.travis-ci.com/user/workers/container-based-infrastructure/ language: node_js node_js: - 0.12 - 4 - 5 - 6 notifications: email: - medikoo+esniff@medikoo.com script: "npm test && npm run lint" esniff-1.1.0/CHANGES000066400000000000000000000017671275335345100140010ustar00rootroot00000000000000v1.1.0 -- 2016.08.12 * Add isVarNameValid utility v1.0.0 -- 2015.09.03 * Support methods in function resolver * Allow operator chars as triggers * `resolveSeparated` utility * `resolveArguments` utility * `isStringLiteral` utility * `ensureStringLiteral` utility * `stripComments` utility * `resolveConcat` utility * Fix bug in multiline comments handling * Optimise and improve internal algorithms * Simplify internal algorithm with cost of invalid `{} /regexp/` handling * Improve arguments validation * Reorganise private modules into lib folder * Improve tests * Fix spelling of LICENSE * Update Travis CI configuration v0.1.1 -- 2014.08.08 * Fix support for one character named functions in `function` utility. Thanks @kamsi for picking this up * Add lint configuration * Update dependencies configuration v0.1.0 -- 2014.04.28 * Assure strictly npm hosted dependencies * Add accessedProperties resolver * Expose whitespace maps as individual modules v0.0.0 -- 2013.11.06 Initial (dev version) esniff-1.1.0/LICENSE000066400000000000000000000020631275335345100140010ustar00rootroot00000000000000Copyright (C) 2013 Mariusz Nowak (www.medikoo.com) 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. esniff-1.1.0/README.md000066400000000000000000000102531275335345100142530ustar00rootroot00000000000000# esniff ## Low footprint JavaScript source code parser Low footprint, fast source code parser, which allows you to find all code fragment occurrences with respect to all syntax rules that cannot be handled with plain regular expression search. It aims at use cases where we need to quickly find usage of given function, property etc. in syntactically valid code. ### Installation #### npm $ npm install esniff To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/) ### Usage Using main module you can configure sophisticated parser on your own. However, first, __see preprared [API utilities](#API) that may already address use cases you have__. #### esniff(code, triggerChar, callback) * `code` Code to parse * `triggerChar` Character which is expected to trigger custom handling via `callback` * `callback` To detect and eventually handle case we're after Example: Find all `require(..)` calls: ```javascript var esniff = require('esniff'); var result = esniff('var x = require(\'foo/bar\')', 'r', function (index, previous, nest) { if (previous === '.') return next(); // Ignore x.require calls if (code.indexOf('require', index) !== index) return esniff.next(); // Not really `require` call next('require'.length); // Move after `require` and skip any following whitespace index = esniff.index; // Update index if (code[i] !== '(') return resume(); // Not `require(` return collectNest(); // Collect all code between parenthesis }); console.log(result); [{ point: 17, column: 17, line: 1, raw: '\'foo/bar\'' }] ``` #### API #### accessedProperties(objName) _(esniff/accessed-properties)_ Returns function which allows us to find all accessed property names on given object name ```javascript var findProperties = require('esniff/accessed-properties'); var findContextProperties = findProperties('this'); var result = findContextProperties('var foo = "0"; this.bar = foo; this.someMethod(); otherFunction()'); console.log(result); // [ { name: 'bar', start: 20, end: 23 }, { name: 'someMethod', start: 36, end: 46 } ] ``` #### function(name[, options]) _(esniff/function)_ Returns function which allows us to find all occurrences of given function (or method) being invoked Through options we can restrict cases which we're after: * `asProperty` (default: `false`), on true will allow `x.name()` when we search for `name` calls * `asPlain` (default: `true`), on true it allows plain calls e.g. `name()` when we search for `name`. Should be set to `false` if we're strictly about method calls. Setting both `asProperty` and `asPlain` to false, will always produce empty result ```javascript var findRequires = require('esniff/function')('require'); findRequires('var x = require(\'foo/bar\')'); // [{ point: 17, column: 17, line: 1, raw: '\'foo/bar\'' }] ``` #### resolveArguments(code[, limit]) _(esniff/resolve-arguments)_ Resolves expressions separated with commas, with additional `limit` you can specify after which number of arguments resolver should stop ```javascript var resolveArgs = require('esniff/resolve-arguments'); var result = resolveArgs('"raz", "dwa", [\'raz\', \'dwa\'], "trzy"', 3)); console.log(result); // ['"raz"', ' "dwa"', ' [\'raz\', \'dwa\']'] ``` ### Limitations * _esniff_ assumes code that you pass is syntactically correct, it won't inform you about any syntax errors and may produce unexpected and nonsense results when such code is used. * There's single case of syntactically correct code, which will make _esniff_ produce incorrect results, it's division made directly on object literal (e.g. `x = { foo: 'bar' } / 14`, esniff in that case will assume that `/` starts regular expression). Still there's not known use case where such code may make any sense, and many popular JS source code parsers share very same vulnerability. * _esniff_ may work with new syntax introduced by ECMAScript 6 but it has not been fully revised in that matter yet. Pull requests are welcome. ## Tests [![Build Status](https://travis-ci.org/medikoo/esniff.svg)](https://travis-ci.org/medikoo/esniff) $ npm test esniff-1.1.0/accessed-properties.js000066400000000000000000000206271275335345100173040ustar00rootroot00000000000000'use strict'; var value = require('es5-ext/object/valid-value') , esniff = require('./') , next = esniff.next , resume = esniff.resume // Stolen from excellent work by Mathias Bynens, see: // http://mathiasbynens.be/notes/javascript-properties // https://github.com/mathiasbynens/mothereff.in/blob/master/ // js-properties/eff.js#L16 , identStart = '$A-Z_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-' + '\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d' + '\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-' + '\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-' + '\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc' + '\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5' + '\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac' + '\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-' + '\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd' + '\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13' + '-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c' + '\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0' + '\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10' + '\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d' + '\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99' + '\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0' + '\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d' + '\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-' + '\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e' + '-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96' + '\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33' + '\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97' + '\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2' + '\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-' + '\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061' + '\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd' + '\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d' + '\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0' + '\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-' + '\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea' + '\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-' + '\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8' + '\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab' + '\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b' + '\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-' + '\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15' + '\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d' + '\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc' + '\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071' + '\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124' + '\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e' + '\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2' + '\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-' + '\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce' + '\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035' + '\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-' + '\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc' + '\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-' + '\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e' + '\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-' + '\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-' + '\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-' + '\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd' + '\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-' + '\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3' + '\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-' + '\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41' + '\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-' + '\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe' + '\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc' , identNext = '0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1' + '\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc' + '\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a' + '\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-' + '\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c' + '\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc' + '\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef' + '\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-' + '\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd' + '\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48' + '\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2' + '\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44' + '\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82' + '\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2' + '\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d' + '\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6' + '\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59' + '\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19' + '\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87' + '\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059' + '\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-' + '\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773' + '\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-' + '\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9' + '\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-' + '\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad' + '\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-' + '\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c' + '\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1' + '\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-' + '\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4' + '-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953' + '\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d' + '\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1' + '\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e' + '\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f' , reIdentStart = new RegExp('[' + identStart + ']') , reIdentNext = new RegExp('[' + identStart + identNext + ']'); module.exports = function (objName) { var l; objName = String(value(objName)); l = objName.length; if (!l) throw new TypeError(objName + " is not valid object name"); return function (code) { var data = []; code = String(value(code)); esniff(code, objName[0], function (i, previous) { var name, startIndex, char; if (previous === '.') return next(); if (code.indexOf(objName, i) !== i) return next(); next(l); i = esniff.index; if (code[i] !== '.') return resume(); next(); startIndex = i = esniff.index; name = ''; if (!reIdentStart.test(char = code[i])) return resume(); name += char; while ((char = code[++i]) && reIdentNext.test(char)) name += char; data.push({ name: name, start: startIndex, end: i }); return next(i - startIndex); }); return data; }; }; esniff-1.1.0/ensure-string-literal.js000066400000000000000000000003241275335345100175670ustar00rootroot00000000000000'use strict'; var isStringLiteral = require('./is-string-literal'); module.exports = function (arg) { if (isStringLiteral(arg)) return arg; throw new TypeError(arg + " does not represent string literal"); }; esniff-1.1.0/function.js000066400000000000000000000023131275335345100151550ustar00rootroot00000000000000'use strict'; var value = require('es5-ext/object/valid-value') , esniff = require('./') , next = esniff.next , resume = esniff.resume , collectNest = esniff.collectNest; module.exports = function (name/*, options*/) { var l, names, options = Object(arguments[1]), asProperty = false, asPlain = true; name = String(value(name)); names = name.split('.').map(function (prop) { prop = prop.trim(); if (!prop) throw new TypeError(name + " is not valid function name"); return prop; }); l = names.length; if (options.asProperty != null) asProperty = options.asProperty; if (options.asPlain != null) asPlain = options.asPlain; return function (code) { code = String(value(code)); return esniff(code, names[0][0], function (i, previous) { var j = 0, prop; if (previous === '.') { if (!asProperty) return next(); } else if (!asPlain) { return next(); } while (j < l) { prop = names[j]; if (code.indexOf(prop, i) !== i) return next(); next(prop.length); i = esniff.index; ++j; if (j < l) { if (code[i] !== '.') return resume(); next(); i = esniff.index; } } if (code[i] !== '(') return resume(); return collectNest(); }); }; }; esniff-1.1.0/index.js000066400000000000000000000120741275335345100144440ustar00rootroot00000000000000'use strict'; var from = require('es5-ext/array/from') , primitiveSet = require('es5-ext/object/primitive-set') , value = require('es5-ext/object/valid-value') , callable = require('es5-ext/object/valid-callable') , d = require('d') , eolSet = require('./lib/ws-eol') , wsSet = require('./lib/ws') , hasOwnProperty = Object.prototype.hasOwnProperty , preRegExpSet = primitiveSet.apply(null, from(';{=([,<>+-*/%&|^!~?:}')) , nonNameSet = primitiveSet.apply(null, from(';{=([,<>+-*/%&|^!~?:})].')) , move, startCollect, endCollect, collectNest , $ws, $common, $string, $comment, $multiComment, $regExp , i, char, line, columnIndex, afterWs, previousChar , nest, nestedTokens, results , userCode, userTriggerChar, isUserTriggerOperatorChar, userCallback , quote , collectIndex, data, nestRelease; move = function (j) { if (!char) return; if (i >= j) return; while (i !== j) { if (!char) return; if (hasOwnProperty.call(wsSet, char)) { if (hasOwnProperty.call(eolSet, char)) { columnIndex = i; ++line; } } else { previousChar = char; } char = userCode[++i]; } }; startCollect = function (oldNestRelease) { if (collectIndex != null) nestedTokens.push([data, collectIndex, oldNestRelease]); data = { point: i + 1, line: line, column: i + 1 - columnIndex }; collectIndex = i; }; endCollect = function () { var previous; data.raw = userCode.slice(collectIndex, i); results.push(data); if (nestedTokens.length) { previous = nestedTokens.pop(); data = previous[0]; collectIndex = previous[1]; nestRelease = previous[2]; return; } data = null; collectIndex = null; nestRelease = null; }; collectNest = function () { var old = nestRelease; nestRelease = nest; ++nest; move(i + 1); startCollect(old); return $ws; }; $common = function () { if ((char === '\'') || (char === '"')) { quote = char; char = userCode[++i]; return $string; } if ((char === '(') || (char === '{') || (char === '[')) { ++nest; } else if ((char === ')') || (char === '}') || (char === ']')) { if (nestRelease === --nest) endCollect(); } else if (char === '/') { if (hasOwnProperty.call(preRegExpSet, previousChar)) { char = userCode[++i]; return $regExp; } } if ((char !== userTriggerChar) || (!isUserTriggerOperatorChar && previousChar && !afterWs && !hasOwnProperty.call(nonNameSet, previousChar))) { previousChar = char; char = userCode[++i]; return $ws; } return userCallback(i, previousChar, nest); }; $comment = function () { while (true) { if (!char) return; if (hasOwnProperty.call(eolSet, char)) { columnIndex = i + 1; ++line; return; } char = userCode[++i]; } }; $multiComment = function () { while (true) { if (!char) return; if (char === '*') { char = userCode[++i]; if (char === '/') return; continue; } if (hasOwnProperty.call(eolSet, char)) { columnIndex = i + 1; ++line; } char = userCode[++i]; } }; $ws = function () { var next; afterWs = false; while (true) { if (!char) return; if (hasOwnProperty.call(wsSet, char)) { afterWs = true; if (hasOwnProperty.call(eolSet, char)) { columnIndex = i + 1; ++line; } } else if (char === '/') { next = userCode[i + 1]; if (next === '/') { char = userCode[i += 2]; afterWs = true; $comment(); } else if (next === '*') { char = userCode[i += 2]; afterWs = true; $multiComment(); } else { break; } } else { break; } char = userCode[++i]; } return $common; }; $string = function () { while (true) { if (!char) return; if (char === quote) { char = userCode[++i]; previousChar = quote; return $ws; } if (char === '\\') { if (hasOwnProperty.call(eolSet, userCode[++i])) { columnIndex = i + 1; ++line; } } char = userCode[++i]; } }; $regExp = function () { while (true) { if (!char) return; if (char === '/') { previousChar = '/'; char = userCode[++i]; return $ws; } if (char === '\\') ++i; char = userCode[++i]; } }; module.exports = exports = function (code, triggerChar, callback) { var state; userCode = String(value(code)); userTriggerChar = String(value(triggerChar)); if (userTriggerChar.length !== 1) { throw new TypeError(userTriggerChar + " should be one character long string"); } userCallback = callable(callback); isUserTriggerOperatorChar = hasOwnProperty.call(nonNameSet, userTriggerChar); i = 0; char = userCode[i]; line = 1; columnIndex = 0; afterWs = false; previousChar = null; nest = 0; nestedTokens = []; results = []; exports.forceStop = false; state = $ws; while (state) state = state(); return results; }; Object.defineProperties(exports, { $ws: d($ws), $common: d($common), collectNest: d(collectNest), move: d(move), index: d.gs(function () { return i; }), line: d.gs(function () { return line; }), nest: d.gs(function () { return nest; }), columnIndex: d.gs(function () { return columnIndex; }), next: d(function (step) { if (!char) return; move(i + (step || 1)); return $ws(); }), resume: d(function () { return $common; }) }); esniff-1.1.0/is-string-literal.js000066400000000000000000000005761275335345100167120ustar00rootroot00000000000000'use strict'; var value = require('es5-ext/object/valid-value'); module.exports = function (str) { var quote, i, char; str = String(value(str)); quote = str[0]; if ((quote !== '\'') && (quote !== '"')) return false; i = 0; char = str[++i]; while (char) { if (char === quote) break; if (char === '\\') ++i; char = str[++i]; } return Boolean(char && !str[i + 1]); }; esniff-1.1.0/is-var-name-valid.js000066400000000000000000000365421275335345100165570ustar00rootroot00000000000000// Credit: Mathias Bynens -> https://mathiasbynens.be/demo/javascript-identifier-regex 'use strict'; module.exports = RegExp.prototype.test.bind(/^(?!(?:do|if|in|for|let|new|try|var|case|else|enum|eval|null|this|true|void|with|await|break|catch|class|const|false|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$)(?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])*$/); esniff-1.1.0/lib/000077500000000000000000000000001275335345100135415ustar00rootroot00000000000000esniff-1.1.0/lib/parse-comments.js000066400000000000000000000043421275335345100170370ustar00rootroot00000000000000'use strict'; var from = require('es5-ext/array/from') , primitiveSet = require('es5-ext/object/primitive-set') , eolSet = require('./ws-eol') , wsSet = require('./ws') , hasOwnProperty = Object.prototype.hasOwnProperty , preRegExpSet = primitiveSet.apply(null, from(';{=([,<>+-*/%&|^!~?:}')) , $ws, $common, $string, $comment, $multiComment, $regExp , userCode, comments, previousChar, i, char, quote; $common = function () { if ((char === '\'') || (char === '"')) { quote = char; char = userCode[++i]; return $string; } if (char === '/') { if (hasOwnProperty.call(preRegExpSet, previousChar)) { char = userCode[++i]; return $regExp; } } char = userCode[++i]; return $ws; }; $comment = function () { while (true) { if (!char) return; if (hasOwnProperty.call(eolSet, char)) return; char = userCode[++i]; } }; $multiComment = function () { while (true) { if (!char) return; if (char === '*') { char = userCode[++i]; if (!char) return; if (char === '/') return; } char = userCode[++i]; } }; $ws = function () { var next, commentRange; while (true) { if (!char) return; if (char === '/') { next = userCode[i + 1]; if (next === '/') { commentRange = [i]; char = userCode[i += 2]; comments.push(commentRange); $comment(); commentRange[1] = i; } else if (next === '*') { commentRange = [i]; char = userCode[i += 2]; comments.push(commentRange); $multiComment(); commentRange[1] = i + 1; } else { break; } } else if (!hasOwnProperty.call(wsSet, char)) { break; } char = userCode[++i]; } return $common; }; $string = function () { while (true) { if (!char) return; if (char === quote) { char = userCode[++i]; previousChar = quote; return $ws; } if (char === '\\') ++i; char = userCode[++i]; } }; $regExp = function () { while (true) { if (!char) return; if (char === '/') { previousChar = '/'; char = userCode[++i]; return $ws; } if (char === '\\') ++i; char = userCode[++i]; } }; module.exports = exports = function (code) { var state; userCode = code; comments = []; i = 0; char = userCode[i]; state = $ws; while (state) state = state(); return comments; }; esniff-1.1.0/lib/ws-eol.js000066400000000000000000000003021275335345100153000ustar00rootroot00000000000000'use strict'; var from = require('es5-ext/array/from') , primitiveSet = require('es5-ext/object/primitive-set'); module.exports = primitiveSet.apply(null, from('\n\r\u2028\u2029')); esniff-1.1.0/lib/ws-inline.js000066400000000000000000000005141275335345100160040ustar00rootroot00000000000000'use strict'; var from = require('es5-ext/array/from') , primitiveSet = require('es5-ext/object/primitive-set'); module.exports = primitiveSet.apply(null, from(' \f\t\v​\u00a0\u1680​\u180e' + '\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a' + '​​​\u202f\u205f​\u3000')); esniff-1.1.0/lib/ws.js000066400000000000000000000003671275335345100145360ustar00rootroot00000000000000'use strict'; var primitiveSet = require('es5-ext/object/primitive-set') , eol = require('./ws-eol') , inline = require('./ws-inline'); module.exports = primitiveSet.apply(null, Object.keys(eol).concat(Object.keys(inline))); esniff-1.1.0/package.json000066400000000000000000000017311275335345100152630ustar00rootroot00000000000000{ "name": "esniff", "version": "1.1.0", "description": "Low footprint ECMAScript source code parser", "author": "Mariusz Nowak (http://www.medikoo.com/)", "keywords": [ "sniff", "analyze", "ast", "parse", "syntax", "sniffer", "detective", "detect", "find", "search", "source", "code" ], "repository": { "type": "git", "url": "git://github.com/medikoo/esniff.git" }, "dependencies": { "d": "1", "es5-ext": "^0.10.12" }, "devDependencies": { "esprima": "^2.7.2", "tad": "^0.2.4", "xlint": "^0.2.2", "xlint-jslint-medikoo": "^0.1.4" }, "scripts": { "lint": "node node_modules/xlint/bin/xlint --linter=node_modules/xlint-jslint-medikoo/index.js --no-cache --no-stream", "lint-console": "node node_modules/xlint/bin/xlint --linter=node_modules/xlint-jslint-medikoo/index.js --watch", "test": "node ./node_modules/tad/bin/tad" }, "license": "MIT" } esniff-1.1.0/resolve-arguments.js000066400000000000000000000002541275335345100170140ustar00rootroot00000000000000'use strict'; var resolveSeparated = require('./resolve-separated'); module.exports = function (code/*, limit*/) { return resolveSeparated(code, ',', arguments[1]); }; esniff-1.1.0/resolve-concat.js000066400000000000000000000002541275335345100162560ustar00rootroot00000000000000'use strict'; var resolveSeparated = require('./resolve-separated'); module.exports = function (code/*, limit*/) { return resolveSeparated(code, '+', arguments[1]); }; esniff-1.1.0/resolve-separated.js000066400000000000000000000015621275335345100167620ustar00rootroot00000000000000'use strict'; var from = require('es5-ext/array/from') , value = require('es5-ext/object/valid-value') , primitiveSet = require('es5-ext/object/primitive-set') , esniff = require('./') , allowedSeparators = primitiveSet.apply(null, from('.+-*/,&|;')) , next = esniff.next; module.exports = function (code, sep/*, limit*/) { var expressions, fromIndex, limit = arguments[2] || Infinity; code = String(value(code)); sep = String(value(sep)); if (!allowedSeparators[sep]) throw new Error(sep + ' is not supported separator'); expressions = []; fromIndex = 0; esniff(code, sep, function (i, previous, nest) { if (nest) return next(); if (expressions.push(code.slice(fromIndex, i)) === limit) return; fromIndex = i + 1; return next(); }); if (expressions.length < limit) expressions.push(code.slice(fromIndex)); return expressions; }; esniff-1.1.0/strip-comments.js000066400000000000000000000011661275335345100163210ustar00rootroot00000000000000'use strict'; var value = require('es5-ext/object/valid-value') , repeat = require('es5-ext/string/#/repeat') , parse = require('./lib/parse-comments'); module.exports = exports = function (code/*, options*/) { var options = Object(arguments[1]), result, comments, i; code = String(value(code)); comments = parse(code); if (!comments.length) return code; i = 0; result = ''; comments.forEach(function (range) { result += code.slice(i, range[0]); if (options.preserveLocation) result += repeat.call(' ', range[1] - range[0]); i = range[1]; }); result += code.slice(i); return result; }; esniff-1.1.0/test/000077500000000000000000000000001275335345100137525ustar00rootroot00000000000000esniff-1.1.0/test/__playground/000077500000000000000000000000001275335345100164345ustar00rootroot00000000000000esniff-1.1.0/test/__playground/accessed-properties.js000066400000000000000000000034451275335345100227440ustar00rootroot00000000000000foo.bar1('on\u0065') foo.bar2(12) var foo = foo.bar3('thr/ee').b.c.d().e.f().g if (foobar) { var bla = function() { switch (baz) { default: foo.bar4("fo\\ur")()()()() } } qux(1, 3, quux(foo.bar5('five').bar.foo, 4), 2) } function func() { return } foo.barąć6(baz); var str = "raz; foo.bar('string'); "; var str2 = 'raz; foo.bar("string2");'; var a = b /foo.bar7("six")/g; a['raz'] /foo.bar8("seven")/g var c = d; /foo.bar9('regexp');/g foo.bar10() if (a) { } /foo.bar11("reqexp2")/ var x = { raz: 'dwa' } /** comment **/ obj.foo.bar13('object'); obj. foo.bar14("object2"); // foo.bar15('comment'); var raz = 4; // foo.bar16('comment2') /* foo.bar17('mlcomment'); */ function test() { return foo.bar18('nine'); } /* comment foo.bar19('mlcomment2'); */ if (foo) { } foo.bar20('ten'); foo.bar21('eleven' + 'split' + 'path'); foo.bar22(true ? "twelve" : "bar"); foo.bar23("object3" + { foo: bar25() }); foo.bar24.foo; function test() { a();return foo.bar26; } function test() { return foo.bar27('fifteen'); } (foo.bar28)('donottake') function test() { a(); return (foo.bar29); } switch (foo.bar30('seventeen')) { case 1: foo.bar31("'eighteen'"); break; case 2: foo.bar32; break; default: foo.bar33('twenty'); } if (foo.bar34('twenty/one')) { } else if (foo.bar35('twenty/two')) { i = (foo.bar36('twenty/three')); } for (var i, j = foo.bar37('/twenty/two/2/'); foo.bar38('twenty/three/2/'); foo.bar39('twenty/four/2/\'')) { foo.bar40("twenty/five/2/\""); } for (i in foo.bar41('\'twenty/seven\'')) { foo.bar42("\"twenty/eight"); } with (a, foo.bar43("\"twenty/nine\"")) { foo.bar44('"thirty"'); } isNaN();foo.bar45('mid-thirty') foo.bar46('inner' + foo.bar47(foo.bar48('marko')) + 'elo') foo.bar49('thirty\ break-line \ one'); module.exports = foo.bar50esniff-1.1.0/test/__playground/function-one-char.js000066400000000000000000000030411275335345100223070ustar00rootroot00000000000000_('on\u0065') _(12) var foo = _('thr/ee').b.c.d().e.f().g if (foobar) { var bla = function() { switch (baz) { default: _("fo\\ur")()()()() } } qux(1, 3, quux(_('five').bar.foo, 4), 2) } function func() { return } _(baz); /** comment **/ var str = "raz; _('string'); "; var str2 = 'raz; _("string2");'; var a = b /_("six")/g; a['raz'] /_("seven")/g var c = d; /_('regexp');/g _() if (a) { } /_("reqexp2")/ var x = { raz: 'dwa', marko: { tile: _("nested-one") }, biurko: { elos: _("nested-one2") } } obj._('object'); obj. _("object2"); // _('comment'); var raz = 4; // _('comment2') /* _('mlcomment'); */ function test() { return _('nine'); } /* comment _('mlcomment2'); */ if (foo) { } _('ten'); _('eleven' + 'split' + 'path'); _(true ? "twelve" : "bar"); _("object3" + { foo: bar() }); _.foo; function test() { a();return _(('four') + 'teen'); } function test() { return _('fifteen'); } (_)('donottake') function test() { a(); return (_('sixteen')); } switch (_('seventeen')) { case 1: _("'eighteen'"); break; case 2: _('nineteen'); break; default: _('twenty'); } if (_('twenty/one')) { } else if (_('twenty/two')) { i = (_('twenty/three')); } for (var i, j = _('/twenty/two/2/'); _('twenty/three/2/'); _('twenty/four/2/\'')) { _("twenty/five/2/\""); } for (i in _('\'twenty/seven\'')) { _("\"twenty/eight"); } with (a, _("\"twenty/nine\"")) { _('"thirty"'); } isNaN();_('mid-thirty') _('inner' + _(_('marko')) + 'elo') _('thirty\ break-line \ one'); module.exports = /"/, _('thirty\two')esniff-1.1.0/test/__playground/function.js000066400000000000000000000035711275335345100206250ustar00rootroot00000000000000require('on\u0065') require(12) var foo = require('thr/ee').b.c.d().e.f().g if (foobar) { var bla = function() { switch (baz) { default: require("fo\\ur")()()()() } } qux(1, 3, quux(require('five').bar.foo, 4), 2) } function func() { return } require(baz); var str = "raz; require('string'); "; var str2 = 'raz; require("string2");'; var a = b /require("six")/g; a['raz'] /require("seven")/g var c = d; /require('regexp');/g require() if (a) { } /require("reqexp2")/ var x = { raz: 'dwa', marko: { tile: require('nested-one') }, biurko: { elos: require('nested-one2') } } /** comment **/ obj.require('object'); obj. require("object2"); // require('comment'); var raz = 4; // require('comment2') /* require('mlcomment'); */ function test() { return require('nine'); } /* comment require('mlcomment2'); */ if (foo) { } require('ten'); otheRrequire('marko'); require('eleven' + 'split' + 'path'); require(true ? "twelve" : "bar"); require("object3" + { foo: bar() }); require.foo; function test() { a();return require(('four') + 'teen'); } function test() { return require/* raz */('fifteen'); } (require)('donottake') function test() { a(); return (require('sixteen')); } switch (require('seventeen')) { case 1: require("'eighteen'"); break; case 2: require('nineteen'); break; default: require('twenty'); } if (require('twenty/one')) { } else if (require('twenty/two')) { i = (require('twenty/three')); } for (var i, j = require('/twenty/two/2/'); require('twenty/three/2/'); require('twenty/four/2/\'')) { require("twenty/five/2/\""); } for (i in require('\'twenty/seven\'')) { require("\"twenty/eight"); } with (a, require("\"twenty/nine\"")) { require('"thirty"'); } isNaN();require('mid-thirty') require('inner' + require(require('marko')) + 'elo') require('thirty\ break-line \ one'); module.exports = /"/, require('thirty\two')esniff-1.1.0/test/__playground/index.js000066400000000000000000000032701275335345100201030ustar00rootroot00000000000000foo.bar('on\u0065') foo.bar(12) var foo = foo.bar('thr/ee').b.c.d().e.f().g if (foobar) { var bla = function() { switch (baz) { default: foo.bar("fo\\ur")()()()() } } qux(1, 3, quux(foo.bar('five').bar.foo, 4), 2) } function func() { return } foo.bar(baz); var str = "raz; foo.bar('string'); "; var str2 = 'raz; foo.bar("string2");'; var a = b /foo.bar("six")/g; a['raz'] /foo.bar("seven")/g var c = d; /foo.bar('regexp');/g foo.bar() if (a) { } /foo.bar("reqexp2")/ var x = { raz: 'dwa' } obj.foo.bar('object'); obj. foo.bar("object2"); // foo.bar('comment'); var raz = 4; // foo.bar('comment2') /* foo.bar('mlcomment'); */ function test() { return foo.bar('nine'); } /* comment foo.bar('mlcomment2'); */ if (foo) { } foo.bar('ten'); foo.bar('eleven' + 'split' + 'path'); foo.bar(true ? "twelve" : "bar"); foo.bar("object3" + { foo: bar() }); foo.bar.foo; function test() { a();return foo.bar(('four') + 'teen'); } function test() { return foo.bar('fifteen'); } foo.bar('donottake') function test() { a(); return (foo.bar('sixteen')); } switch (foo.bar('seventeen')) { case 1: foo.bar("'eighteen'"); break; case 2: foo.bar('nineteen'); break; default: foo.bar('twenty'); } if (foo.bar('twenty/one')) { } else if (foo.bar('twenty/two')) { i = (foo.bar('twenty/three')); } for (var i, j = foo.bar('/twenty/two/2/'); foo.bar('twenty/three/2/'); foo.bar('twenty/four/2/\'')) { foo.bar("twenty/five/2/\""); } for (i in foo.bar('\'twenty/seven\'')) { foo.bar("\"twenty/eight"); } with (a, foo.bar("\"twenty/nine\"")) { foo.bar('"thirty"'); } isNaN();foo.bar('mid-thirty') foo.bar('thirty\ break-line \ one'); module.exports = foo.bar('thirty\two')esniff-1.1.0/test/__playground/method.js000066400000000000000000000035621275335345100202600ustar00rootroot00000000000000i18n.bind('on\u0065') i18n.bind(12) var foo = i18n.bind('thr/ee').b.c.d().e.f().g if (foobar) { var bla = function() { switch (baz) { default: i18n.bind("fo\\ur")()()()() } } qux(1, 3, quux(i18n.bind('five').bar.foo, 4), 2) } function func() { return } /** comment **/ i18n.bind(baz); var str = "raz; i18n.bind('string'); "; var str2 = 'raz; i18n.bind("string2");'; var a = b /i18n.bind("six")/g; a['raz'] /i18n.bind("seven")/g var c = d; /i18n.bind('regexp');/g i18n.bind() if (a) { } /i18n.bind("reqexp2")/ var x = { raz: 'dwa' } obj.i18n.bind('object'); obj. i18n.bind("object2"); // i18n.bind('comment'); var raz = 4; // i18n.bind('comment2') /* i18n.bind('mlcomment'); */ function test() { return i18n.bind('nine'); } /* comment i18n.bind('mlcomment2'); */ if (foo) { } i18n.bind('ten'); i18n.bind('eleven' + 'split' + 'path'); i18n.bind(true ? "twelve" : "bar"); i18n.bind("object3" + { foo: bar() }); i18n.bind.foo; function test() { a();return i18n.bind(('four') + 'teen'); } function test() { return i18n.bind/* raz */('fifteen'); } (i18n.bind)('donottake') function test() { a(); return (i18n.bind('sixteen')); } switch (i18n.bind('seventeen')) { case 1: i18n.bind("'eighteen'"); break; case 2: i18n.bind('nineteen'); break; default: i18n.bind('twenty'); } if (i18n.bind('twenty/one')) { } else if (i18n.bind('twenty/two')) { i = (i18n.bind('twenty/three')); } for (var i, j = i18n.bind('/twenty/two/2/'); i18n.bind('twenty/three/2/'); i18n.bind('twenty/four/2/\'')) { i18n.bind("twenty/five/2/\""); } for (i in i18n.bind('\'twenty/seven\'')) { i18n.bind("\"twenty/eight"); } with (a, i18n.bind("\"twenty/nine\"")) { i18n.bind('"thirty"'); } isNaN();i18n.bind('mid-thirty') i18n.bind('inner' + i18n.bind(i18n.bind('marko')) + 'elo') i18n.bind('thirty\ break-line \ one'); module.exports = /"/, i18n.bind('thirty\two')esniff-1.1.0/test/_ast-accessed-properties.js000066400000000000000000000013221275335345100211760ustar00rootroot00000000000000'use strict'; var esprima = require('esprima') , isArray = Array.isArray, keys = Object.keys , walker; walker = function (ast) { if (!ast || (typeof ast !== 'object')) return; if (isArray(ast)) { ast.forEach(walker, this); return; } keys(ast).forEach(function (key) { if (key !== 'range') walker.call(this, ast[key]); }, this); if (!ast.type) return; if ((ast.type === 'MemberExpression') && (ast.object.name === 'foo')) { this.deps.push({ name: ast.property.name, start: ast.property.range[0], end: ast.property.range[1] }); } }; module.exports = function (code) { var ctx = { code: code, deps: [] }; walker.call(ctx, esprima.parse(code, { range: true, loc: true })); return ctx.deps; }; esniff-1.1.0/test/_ast-function.js000066400000000000000000000041671275335345100170710ustar00rootroot00000000000000'use strict'; var last = require('es5-ext/array/#/last') , esprima = require('esprima') , isArray = Array.isArray, keys = Object.keys , walker, eolRe , fnName, objName , asProperty; eolRe = /(?:\r\n|[\n\r\u2028\u2029])/; walker = function (ast) { var dep, lines, object; if (!ast || (typeof ast !== 'object')) return; if (isArray(ast)) { ast.forEach(walker, this); return; } keys(ast).forEach(function (key) { if (key !== 'range') walker.call(this, ast[key]); }, this); if (ast.type !== 'CallExpression') return; if (objName) { if (ast.callee.type !== 'MemberExpression') return false; object = ast.callee.object; if (object.type === 'MemberExpression') { if (!asProperty) return; if (object.property.name !== objName) return; } else if (object.name !== objName) { return; } if (ast.callee.property.name !== fnName) return; if (this.code[ast.range[0]] === '(') return; dep = { point: this.code.indexOf('(', ast.range[0]) + 2 }; dep.raw = this.code.slice(dep.point - 1, ast.range[1] - 1); lines = this.code.slice(ast.range[0], dep.point).split(eolRe); dep.line = ast.loc.start.line + lines.length - 1; dep.column = (lines.length > 1) ? last.call(lines).length : ast.loc.start.column + lines[0].length; this.deps.push(dep); } else { if ((ast.type === 'CallExpression') && (ast.callee.type === 'Identifier') && (ast.callee.name === fnName) && (this.code[ast.range[0]] !== '(')) { dep = { point: this.code.indexOf('(', ast.range[0]) + 2 }; dep.raw = this.code.slice(dep.point - 1, ast.range[1] - 1); lines = this.code.slice(ast.range[0], dep.point).split(eolRe); dep.line = ast.loc.start.line + lines.length - 1; dep.column = (lines.length > 1) ? last.call(lines).length : ast.loc.start.column + lines[0].length; this.deps.push(dep); } } }; module.exports = function (code, name, method, options) { var ctx = { code: code, deps: [] }; options = Object(options); if (method) { fnName = method; objName = name; } else { fnName = name; } asProperty = options.asProperty; walker.call(ctx, esprima.parse(code, { range: true, loc: true })); return ctx.deps; }; esniff-1.1.0/test/_ast-index.js000066400000000000000000000021461275335345100163460ustar00rootroot00000000000000'use strict'; var last = require('es5-ext/array/#/last') , esprima = require('esprima') , isArray = Array.isArray, keys = Object.keys , walker, eolRe; eolRe = /(?:\r\n|[\n\r\u2028\u2029])/; walker = function (ast) { var dep, lines; if (!ast || (typeof ast !== 'object')) return; if (isArray(ast)) { ast.forEach(walker, this); return; } keys(ast).forEach(function (key) { if (key !== 'range') walker.call(this, ast[key]); }, this); if (!ast.type) return; if ((ast.type === 'CallExpression') && (ast.callee.type === 'MemberExpression') && (ast.callee.object.name === 'foo') && (ast.callee.property.name === 'bar')) { dep = { point: this.code.indexOf('(', ast.range[0]) + 2 }; lines = this.code.slice(ast.range[0], dep.point).split(eolRe); dep.line = ast.loc.start.line + lines.length - 1; dep.column = (lines.length > 1) ? last.call(lines).length : ast.loc.start.column + lines[0].length; this.deps.push(dep); } }; module.exports = function (code) { var ctx = { code: code, deps: [] }; walker.call(ctx, esprima.parse(code, { range: true, loc: true })); return ctx.deps; }; esniff-1.1.0/test/accessed-properties.js000066400000000000000000000007451275335345100202620ustar00rootroot00000000000000'use strict'; var readFile = require('fs').readFile , ast = require('./_ast-accessed-properties') , pg = __dirname + '/__playground'; module.exports = function (t, a, d) { readFile(pg + '/accessed-properties.js', 'utf-8', function (err, str) { var plainR, astR; if (err) { d(err); return; } plainR = t('foo')(str); astR = ast(str); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); }; esniff-1.1.0/test/ensure-string-literal.js000066400000000000000000000020121275335345100205420ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { var str; a.throws(function () { t(); }, TypeError, "Undefined"); a.throws(function () { t(null); }, TypeError, "Null"); a.throws(function () { t({}); }, TypeError, "Object"); a.throws(function () { t(''); }, TypeError, "Empty code"); a(t('""'), '""', "Empty \" string"); a(t('\'\''), '\'\'', "Empty ' string"); a.throws(function () { t('"sdfsdf'); }, TypeError, "Not finished \" string"); a.throws(function () { t('\'sdfsdf'); }, TypeError, "Not finished ' string"); str = '\'sdf\\\'fefeefe\\\\efefe\\n\\\\\\\'\\\'efef"" "sdfdfsdf\''; a(t(str), str, "' string"); str = '"sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf"'; a(t(str), str, "Messy \" string"); a.throws(function () { t(' "sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf"'); }, TypeError, "Starts with ws"); a.throws(function () { t('"sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf" '); }, TypeError, "Ends with ws"); a.throws(function () { t('34'); }, TypeError, "Number"); }; esniff-1.1.0/test/function.js000066400000000000000000000032421275335345100161360ustar00rootroot00000000000000'use strict'; var readFile = require('fs').readFile , ast = require('./_ast-function') , pg = __dirname + '/__playground'; module.exports = function (t) { return { Normal: function (a, d) { readFile(pg + '/function.js', 'utf-8', function (err, str) { var plainR, astR; if (err) { d(err); return; } plainR = t('require')(str); astR = ast(str, 'require'); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); }, "One character name": function (a, d) { readFile(pg + '/function-one-char.js', 'utf-8', function (err, str) { var plainR, astR; if (err) { d(err); return; } plainR = t('_')(str); astR = ast(str, '_'); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); }, Method: function (a, d) { readFile(pg + '/method.js', 'utf-8', function (err, str) { var plainR, astR; if (err) { d(err); return; } plainR = t('i18n.bind')(str); astR = ast(str, 'i18n', 'bind'); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); }, "Method as property": function (a, d) { readFile(pg + '/method.js', 'utf-8', function (err, str) { var plainR, astR; if (err) { d(err); return; } plainR = t('i18n.bind', { asProperty: true })(str); astR = ast(str, 'i18n', 'bind', { asProperty: true }); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); } }; }; esniff-1.1.0/test/index.js000066400000000000000000000016111275335345100154160ustar00rootroot00000000000000'use strict'; var readFile = require('fs').readFile , ast = require('./_ast-index') , pg = __dirname + '/__playground'; module.exports = function (t, a, d) { readFile(pg + '/index.js', 'utf-8', function (err, str) { var plainR = [], astR; if (err) { d(err); return; } t(str, 'f', function (i, previous) { if (previous === '.') return t.next(); if (str.indexOf('foo', i) !== i) return t.next(); t.next(3); i = t.index; if (str[i] !== '.') return t.resume(); t.next(); i = t.index; if (str.indexOf('bar', i) !== i) return t.resume(); t.next(3); i = t.index; if (str[i] !== '(') return t.resume(); plainR.push({ point: i + 2, line: t.line, column: i + 2 - t.columnIndex }); return t.resume(); }); astR = ast(str); a(plainR.length, astR.length, "Length"); astR.forEach(function (val, i) { a.deep(plainR[i], val, i); }); d(); }); }; esniff-1.1.0/test/is-string-literal.js000066400000000000000000000012151275335345100176600ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a(t(''), false, "Empty code"); a(t('""'), true, "Empty \" string"); a(t('\'\''), true, "Empty ' string"); a(t('"sdfsdf'), false, "Not finished \" string"); a(t('\'sdfsdf'), false, "Not finished ' string"); a(t('\'sdf\\\'fefeefe\\\\efefe\\n\\\\\\\'\\\'efef"" "sdfdfsdf\''), true, "' string"); a(t('"sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf"'), true, "\" string"); a(t(' "sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf"'), false, "Starts with ws"); a(t('"sdf\\"fefeefe\\\\efefe\\n\\\\\\"\\"efef\'\' \'sdfdfsdf" '), false, "Ends with ws"); a(t('34'), false, "Number"); }; esniff-1.1.0/test/is-var-name-valid.js000066400000000000000000000002061275335345100175220ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a(t('foo'), true); a(t('if'), false); a(t('_if'), true); a(t('-if'), false); }; esniff-1.1.0/test/lib/000077500000000000000000000000001275335345100145205ustar00rootroot00000000000000esniff-1.1.0/test/lib/parse-comments.js000066400000000000000000000004451275335345100200160ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { var code = '/* raz */ var foo = 4; // fefe\nmasfdf()/* fefe */ fefe()/* bak */', result = t(code); a.deep(result.map(function (range) { return code.slice(range[0], range[1]); }), [ '/* raz */', '// fefe', '/* fefe */', '/* bak */' ]); }; esniff-1.1.0/test/lib/ws-eol.js000066400000000000000000000001501275335345100162600ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a(t.a, undefined, "Mismatch"); a(t['\n'], true); }; esniff-1.1.0/test/lib/ws-inline.js000066400000000000000000000001531275335345100167620ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a(t['\n'], undefined, "Mismatch"); a(t[' '], true); }; esniff-1.1.0/test/lib/ws.js000066400000000000000000000001501275335345100155030ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a(t.a, undefined, "Mismatch"); a(t['\n'], true); }; esniff-1.1.0/test/resolve-arguments.js000066400000000000000000000005121275335345100177700ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a.deep(t('"raz", "dwa", [\'raz\', \'dwa\'], "trzy"'), ['"raz"', ' "dwa"', ' [\'raz\', \'dwa\']', ' "trzy"']); a.deep(t('"raz", "dwa", [\'raz\', \'dwa\'], "trzy"', 3), ['"raz"', ' "dwa"', ' [\'raz\', \'dwa\']'], "Limit"); a.deep(t('"trzy"'), ['"trzy"'], "One argument"); }; esniff-1.1.0/test/resolve-concat.js000066400000000000000000000005261275335345100172370ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a.deep(t('"raz" + "dwa" + [\'raz\', \'dwa\'] + "trzy"'), ['"raz" ', ' "dwa" ', ' [\'raz\', \'dwa\'] ', ' "trzy"']); a.deep(t('"raz" + "dwa" + [\'raz\', \'dwa\'] + "trzy"', 3), ['"raz" ', ' "dwa" ', ' [\'raz\', \'dwa\'] '], "Limit"); a.deep(t('"trzy"'), ['"trzy"'], "One argument"); }; esniff-1.1.0/test/resolve-separated.js000066400000000000000000000005311275335345100177340ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { a.deep(t('"raz", "dwa", [\'raz\', \'dwa\'], "trzy"', ','), ['"raz"', ' "dwa"', ' [\'raz\', \'dwa\']', ' "trzy"']); a.deep(t('"raz", "dwa", [\'raz\', \'dwa\'], "trzy"', ',', 3), ['"raz"', ' "dwa"', ' [\'raz\', \'dwa\']'], "Limit"); a.deep(t('"trzy"', ','), ['"trzy"'], "One argument"); }; esniff-1.1.0/test/strip-comments.js000066400000000000000000000005071275335345100172760ustar00rootroot00000000000000'use strict'; module.exports = function (t, a) { var code = '/* raz */ var foo = 4; // fefe\nmasfdf()/* fefe */ fefe()/* bak */'; a.deep(t(code), ' var foo = 4; \nmasfdf() fefe()'); a.deep(t(code, { preserveLocation: true }), ' var foo = 4; \nmasfdf() fefe() ', "Preserve location"); };