├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── .jshintrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── index.d.ts ├── index.js ├── package-lock.json ├── package.json └── test ├── es6_test.js ├── test.js └── test_without_constructor.js /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [10.x, 12.x, 14.x, 15.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v1 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | - run: npm ci 29 | - run: npm test 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | bower_components/ 3 | npm-debug.log 4 | .idea/ 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "bitwise": true, 4 | "camelcase": true, 5 | "curly": true, 6 | "eqeqeq": true, 7 | "es3": true, 8 | "forin": true, 9 | "freeze": true, 10 | "immed": true, 11 | "indent": 4, 12 | "latedef": "nofunc", 13 | "newcap": true, 14 | "noarg": true, 15 | "noempty": true, 16 | "nonbsp": true, 17 | "nonew": true, 18 | "plusplus": true, 19 | "quotmark": "single", 20 | "undef": true, 21 | "unused": "vars", 22 | "strict": true, 23 | "trailing": true, 24 | "maxparams": 2, 25 | "maxdepth": 2, 26 | "maxstatements": 8, 27 | "maxcomplexity": 5, 28 | "maxlen": 80, 29 | "asi": false, 30 | "boss": false, 31 | "debug": false, 32 | "eqnull": false, 33 | "esnext": true, 34 | "evil": false, 35 | "expr": false, 36 | "funcscope": false, 37 | "gcl": false, 38 | "globalstrict": false, 39 | "iterator": false, 40 | "lastsemic": false, 41 | "laxbreak": false, 42 | "laxcomma": false, 43 | "loopfunc": false, 44 | "maxerr": 50, 45 | "moz": false, 46 | "multistr": false, 47 | "notypeof": false, 48 | "proto": false, 49 | "scripturl": false, 50 | "smarttabs": false, 51 | "shadow": false, 52 | "sub": false, 53 | "supernew": false, 54 | "validthis": false, 55 | "noyield": false 56 | } 57 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### [2.0.2](https://github.com/twada/type-name/releases/tag/v2.0.2) (2016-07-27) 2 | 3 | 4 | #### Bug Fixes 5 | 6 | * [Fix crash when called with an es6 anonymous class instance](https://github.com/twada/type-name/pull/11) (by [@inversion](https://github.com/inversion)) 7 | 8 | 9 | ### [2.0.1](https://github.com/twada/type-name/releases/tag/v2.0.1) (2016-03-20) 10 | 11 | 12 | * reduce package size (by [@dawsonbotsford](https://github.com/dawsonbotsford)) 13 | 14 | 15 | ## [2.0.0](https://github.com/twada/type-name/releases/tag/v2.0.0) (2016-01-06) 16 | 17 | 18 | #### Features 19 | 20 | * [return the actual Error constructor name](https://github.com/twada/type-name/pull/5), closes [#4](https://github.com/twada/type-name/issues/4) (by [@kgryte](https://github.com/kgryte)) 21 | 22 | 23 | #### Breaking Changes 24 | 25 | * `typeName(error)` returns actual error constructor name, not just `'Error'` ([c857cea3](https://github.com/twada/type-name/commit/c857cea3d79523105f3aa14552df8bd3267a88cb)) 26 | 27 | before: 28 | ```js 29 | typeName(new TypeError('type error!')) // => 'Error' 30 | ``` 31 | 32 | after 2.0.0: 33 | ```js 34 | typeName(new TypeError('type error!')) // => 'TypeError' 35 | ``` 36 | 37 | * component is no longer supported ([e6f17109](https://github.com/twada/type-name/commit/e6f17109b6aece2e6f535d2918794fd9094628f8)) 38 | 39 | 40 | ## [1.1.0](https://github.com/twada/type-name/releases/tag/v1.1.0) (2015-10-18) 41 | 42 | 43 | #### Features 44 | 45 | * ship bundle for browsers with npm module ([6f4eed8c](https://github.com/twada/type-name/commit/6f4eed8c2305b828c51c4dc655a6044047ace0da)) 46 | 47 | 48 | ### [1.0.1](https://github.com/twada/type-name/releases/tag/v1.0.1) (2014-12-16) 49 | 50 | 51 | #### Bug Fixes 52 | 53 | * [check constructor existence](https://github.com/twada/type-name/pull/3) (by [@yosuke-furukawa](https://github.com/yosuke-furukawa)) 54 | 55 | 56 | ## [1.0.0](https://github.com/twada/type-name/releases/tag/v1.0.0) (2014-06-24) 57 | 58 | 59 | #### Features 60 | 61 | * The first stable release 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2021 Takuto Wada, https://github.com/twada/type-name 4 | 5 | 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: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | 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. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | type-name 2 | ================================ 3 | 4 | Just a reasonable `typeof` 5 | 6 | [![Build Status][ci-image]][ci-url] 7 | [![NPM version][npm-image]][npm-url] 8 | [![License][license-image]][license-url] 9 | 10 | 11 | DESCRIPTION 12 | --------------------------------------- 13 | 14 | `typeName` function returns reasonable type name for input value. 15 | 16 | | description | input | result | 17 | |:---------------|:--------|:------------| 18 | | null literal | `null` | `'null'` | 19 | | undefined value | `undefined` | `'undefined'` | 20 | | string literal | `'foo'` | `'string'` | 21 | | number literal | `5` | `'number'` | 22 | | boolean literal | `false` | `'boolean'` | 23 | | regexp literal *(Android 4.1+)* | `/^not/` | `'RegExp'` | 24 | | array literal | `['foo', 4]` | `'Array'` | 25 | | object literal | `{name: 'bar'}` | `'Object'` *(be careful!)* | 26 | | function expression | `function () {}` | `'function'` | 27 | | String object | `new String('foo')` | `'String'` | 28 | | Number object | `new Number('3')` | `'Number'` | 29 | | Boolean object |`new Boolean('1')` | `'Boolean'` | 30 | | Date object | `new Date()` | `'Date'` | 31 | | RegExp object *(Android 4.1+)* | `new RegExp('^not', 'g')` | `'RegExp'` | 32 | | Array object | `new Array()` | `'Array'` | 33 | | Object object | `new Object()` | `'Object'` | 34 | | Function object | `new Function('x', 'y', 'return x + y')` | `'function'` *(be careful!)* | 35 | | Error object | `new Error('error!')` | `'Error'` | 36 | | TypeError object | `new TypeError('type error!')` | `'TypeError'` | 37 | | NaN | `NaN` | `'number'` | 38 | | Infinity | `Infinity` | `'number'` | 39 | | Math | `Math` | `'Math'` | 40 | | JSON *(IE8+)* | `JSON` | `'JSON'` | 41 | | arguments object *(IE9+)* | `(function(){ return arguments; })()` | `'Arguments'` | 42 | | User-defined constructor | `new Person('alice', 5)` | `'Person'` | 43 | | Anonymous constructor | `new AnonPerson('bob', 4)` | `''` | 44 | | Named class | `new(class Foo { constructor() {} })` | `'Foo'` | 45 | | Anonymous class | `new(class { constructor() {} })` | `''` | 46 | | Symbol | `Symbol("FOO")` | `'symbol'` | 47 | | Promise | `Promise.resolve(1)` | `'Promise'` | 48 | 49 | 50 | EXAMPLE 51 | --------------------------------------- 52 | 53 | ```javascript 54 | const typeName = require('type-name'); 55 | const assert = require('assert'); 56 | 57 | assert(typeName(null) === 'null'); 58 | assert(typeName(undefined) === 'undefined'); 59 | assert(typeName('foo') === 'string'); 60 | assert(typeName(5) === 'number'); 61 | assert(typeName(false) === 'boolean'); 62 | assert(typeName(/^not/) === 'RegExp'); 63 | assert(typeName(['foo', 4]) === 'Array'); 64 | assert(typeName({name: 'bar'}) === 'Object'); 65 | assert(typeName(function () {}) === 'function'); 66 | assert(typeName(new String('foo')) === 'String'); 67 | assert(typeName(new Number('3')) === 'Number'); 68 | assert(typeName(new Boolean('1')) === 'Boolean'); 69 | assert(typeName(new Date()) === 'Date'); 70 | assert(typeName(new RegExp('^not', 'g')) === 'RegExp'); 71 | assert(typeName(new Array()) === 'Array'); 72 | assert(typeName(new Object()) === 'Object'); 73 | assert(typeName(new Function('x', 'y', 'return x + y')) === 'function'); 74 | assert(typeName(new Error('error!')) === 'Error'); 75 | assert(typeName(new TypeError('type error!')) === 'TypeError'); 76 | assert(typeName(NaN) === 'number'); 77 | assert(typeName(Infinity) === 'number'); 78 | assert(typeName(Math) === 'Math'); 79 | assert(typeName(JSON) === 'JSON'); // IE8+ 80 | assert(typeName((function(){ return arguments; })()) === 'Arguments'); // IE9+ 81 | assert(typeName(Symbol("FOO")) === 'symbol'); 82 | assert(typeName(Promise.resolve(1)) === 'Promise'); 83 | 84 | function Person(name, age) { 85 | this.name = name; 86 | this.age = age; 87 | } 88 | 89 | const AnonPerson = function(name, age) { 90 | this.name = name; 91 | this.age = age; 92 | }; 93 | 94 | assert(typeName(new Person('alice', 5)) === 'Person'); 95 | assert(typeName(new AnonPerson('bob', 4)) === ''); 96 | 97 | assert(typeName(new(class Foo { constructor() {} })) === 'Foo'); 98 | assert(typeName(new(class { constructor() {} })) === ''); 99 | ``` 100 | 101 | 102 | INSTALL 103 | --------------------------------------- 104 | 105 | $ npm install --save type-name 106 | 107 | 108 | USAGE 109 | --------------------------------------- 110 | 111 | ```javascript 112 | const typeName = require('type-name'); 113 | console.log(typeName(anyVar)); 114 | ``` 115 | 116 | 117 | AUTHOR 118 | --------------------------------------- 119 | * [Takuto Wada](https://github.com/twada) 120 | 121 | 122 | CONTRIBUTORS 123 | --------------------------------------- 124 | * [azu](https://github.com/azu) 125 | * [Yosuke Furukawa](https://github.com/yosuke-furukawa) 126 | * [Athan](https://github.com/kgryte) 127 | * [Andrew Moss](https://github.com/inversion) 128 | 129 | 130 | LICENSE 131 | --------------------------------------- 132 | Licensed under the [MIT](https://github.com/twada/type-name/blob/master/LICENSE) license. 133 | 134 | 135 | [npm-url]: https://npmjs.org/package/type-name 136 | [npm-image]: https://badge.fury.io/js/type-name.svg 137 | 138 | [ci-image]: https://github.com/twada/type-name/workflows/Node.js%20CI/badge.svg 139 | [ci-url]: https://github.com/twada/type-name/actions?query=workflow%3A%22Node.js+CI%22 140 | 141 | [license-url]: https://github.com/twada/type-name/blob/master/LICENSE 142 | [license-image]: https://img.shields.io/badge/license-MIT-brightgreen.svg 143 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare function typeName (value: any): string; 2 | export = typeName; 3 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * type-name - Just a reasonable typeof 3 | * 4 | * https://github.com/twada/type-name 5 | * 6 | * Copyright (c) 2014-2021 Takuto Wada 7 | * Licensed under the MIT license. 8 | * https://github.com/twada/type-name/blob/master/LICENSE 9 | */ 10 | 'use strict'; 11 | 12 | var toStr = Object.prototype.toString; 13 | 14 | function funcName (f) { 15 | if (f.name) { 16 | return f.name; 17 | } 18 | var match = /^\s*function\s*([^\(\s]+)/i.exec(f.toString()); 19 | return match ? match[1] : ''; 20 | } 21 | 22 | function ctorName (obj) { 23 | var strName = toStr.call(obj).slice(8, -1); 24 | if ((strName === 'Object' || strName === 'Error') && obj.constructor) { 25 | return funcName(obj.constructor); 26 | } 27 | return strName; 28 | } 29 | 30 | function typeName (val) { 31 | var type; 32 | if (val === null) { 33 | return 'null'; 34 | } 35 | type = typeof val; 36 | if (type === 'object') { 37 | return ctorName(val); 38 | } 39 | return type; 40 | } 41 | 42 | module.exports = typeName; 43 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "type-name", 3 | "version": "2.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@ungap/promise-all-settled": { 8 | "version": "1.1.2", 9 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 10 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 11 | "dev": true 12 | }, 13 | "ansi-colors": { 14 | "version": "4.1.1", 15 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 16 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 17 | "dev": true 18 | }, 19 | "ansi-regex": { 20 | "version": "3.0.0", 21 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 22 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 23 | "dev": true 24 | }, 25 | "ansi-styles": { 26 | "version": "4.3.0", 27 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 28 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 29 | "dev": true, 30 | "requires": { 31 | "color-convert": "^2.0.1" 32 | } 33 | }, 34 | "anymatch": { 35 | "version": "3.1.1", 36 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 37 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 38 | "dev": true, 39 | "requires": { 40 | "normalize-path": "^3.0.0", 41 | "picomatch": "^2.0.4" 42 | } 43 | }, 44 | "argparse": { 45 | "version": "2.0.1", 46 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 47 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 48 | "dev": true 49 | }, 50 | "balanced-match": { 51 | "version": "1.0.0", 52 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 53 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 54 | "dev": true 55 | }, 56 | "binary-extensions": { 57 | "version": "2.2.0", 58 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 59 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 60 | "dev": true 61 | }, 62 | "brace-expansion": { 63 | "version": "1.1.11", 64 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 65 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 66 | "dev": true, 67 | "requires": { 68 | "balanced-match": "^1.0.0", 69 | "concat-map": "0.0.1" 70 | } 71 | }, 72 | "braces": { 73 | "version": "3.0.2", 74 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 75 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 76 | "dev": true, 77 | "requires": { 78 | "fill-range": "^7.0.1" 79 | } 80 | }, 81 | "browser-stdout": { 82 | "version": "1.3.1", 83 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 84 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 85 | "dev": true 86 | }, 87 | "camelcase": { 88 | "version": "6.2.0", 89 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 90 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 91 | "dev": true 92 | }, 93 | "chalk": { 94 | "version": "4.1.0", 95 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 96 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 97 | "dev": true, 98 | "requires": { 99 | "ansi-styles": "^4.1.0", 100 | "supports-color": "^7.1.0" 101 | }, 102 | "dependencies": { 103 | "supports-color": { 104 | "version": "7.2.0", 105 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 106 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 107 | "dev": true, 108 | "requires": { 109 | "has-flag": "^4.0.0" 110 | } 111 | } 112 | } 113 | }, 114 | "chokidar": { 115 | "version": "3.5.1", 116 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 117 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 118 | "dev": true, 119 | "requires": { 120 | "anymatch": "~3.1.1", 121 | "braces": "~3.0.2", 122 | "fsevents": "~2.3.1", 123 | "glob-parent": "~5.1.0", 124 | "is-binary-path": "~2.1.0", 125 | "is-glob": "~4.0.1", 126 | "normalize-path": "~3.0.0", 127 | "readdirp": "~3.5.0" 128 | } 129 | }, 130 | "cli": { 131 | "version": "1.0.1", 132 | "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", 133 | "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", 134 | "dev": true, 135 | "requires": { 136 | "exit": "0.1.2", 137 | "glob": "^7.1.1" 138 | } 139 | }, 140 | "cliui": { 141 | "version": "7.0.4", 142 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 143 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 144 | "dev": true, 145 | "requires": { 146 | "string-width": "^4.2.0", 147 | "strip-ansi": "^6.0.0", 148 | "wrap-ansi": "^7.0.0" 149 | }, 150 | "dependencies": { 151 | "ansi-regex": { 152 | "version": "5.0.0", 153 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 154 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 155 | "dev": true 156 | }, 157 | "is-fullwidth-code-point": { 158 | "version": "3.0.0", 159 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 160 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 161 | "dev": true 162 | }, 163 | "string-width": { 164 | "version": "4.2.2", 165 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 166 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 167 | "dev": true, 168 | "requires": { 169 | "emoji-regex": "^8.0.0", 170 | "is-fullwidth-code-point": "^3.0.0", 171 | "strip-ansi": "^6.0.0" 172 | } 173 | }, 174 | "strip-ansi": { 175 | "version": "6.0.0", 176 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 177 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 178 | "dev": true, 179 | "requires": { 180 | "ansi-regex": "^5.0.0" 181 | } 182 | } 183 | } 184 | }, 185 | "color-convert": { 186 | "version": "2.0.1", 187 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 188 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 189 | "dev": true, 190 | "requires": { 191 | "color-name": "~1.1.4" 192 | } 193 | }, 194 | "color-name": { 195 | "version": "1.1.4", 196 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 197 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 198 | "dev": true 199 | }, 200 | "concat-map": { 201 | "version": "0.0.1", 202 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 203 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 204 | "dev": true 205 | }, 206 | "console-browserify": { 207 | "version": "1.1.0", 208 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 209 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 210 | "dev": true, 211 | "requires": { 212 | "date-now": "^0.1.4" 213 | } 214 | }, 215 | "core-util-is": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 218 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 219 | "dev": true 220 | }, 221 | "date-now": { 222 | "version": "0.1.4", 223 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 224 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 225 | "dev": true 226 | }, 227 | "debug": { 228 | "version": "4.3.1", 229 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 230 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 231 | "dev": true, 232 | "requires": { 233 | "ms": "2.1.2" 234 | }, 235 | "dependencies": { 236 | "ms": { 237 | "version": "2.1.2", 238 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 239 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 240 | "dev": true 241 | } 242 | } 243 | }, 244 | "decamelize": { 245 | "version": "4.0.0", 246 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 247 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 248 | "dev": true 249 | }, 250 | "diff": { 251 | "version": "5.0.0", 252 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 253 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 254 | "dev": true 255 | }, 256 | "dom-serializer": { 257 | "version": "0.2.2", 258 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 259 | "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", 260 | "dev": true, 261 | "requires": { 262 | "domelementtype": "^2.0.1", 263 | "entities": "^2.0.0" 264 | }, 265 | "dependencies": { 266 | "domelementtype": { 267 | "version": "2.1.0", 268 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", 269 | "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", 270 | "dev": true 271 | }, 272 | "entities": { 273 | "version": "2.2.0", 274 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 275 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 276 | "dev": true 277 | } 278 | } 279 | }, 280 | "domelementtype": { 281 | "version": "1.3.1", 282 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 283 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", 284 | "dev": true 285 | }, 286 | "domhandler": { 287 | "version": "2.3.0", 288 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 289 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 290 | "dev": true, 291 | "requires": { 292 | "domelementtype": "1" 293 | } 294 | }, 295 | "domutils": { 296 | "version": "1.5.1", 297 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 298 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 299 | "dev": true, 300 | "requires": { 301 | "dom-serializer": "0", 302 | "domelementtype": "1" 303 | } 304 | }, 305 | "emoji-regex": { 306 | "version": "8.0.0", 307 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 308 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 309 | "dev": true 310 | }, 311 | "entities": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 314 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 315 | "dev": true 316 | }, 317 | "escalade": { 318 | "version": "3.1.1", 319 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 320 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 321 | "dev": true 322 | }, 323 | "escape-string-regexp": { 324 | "version": "4.0.0", 325 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 326 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 327 | "dev": true 328 | }, 329 | "exit": { 330 | "version": "0.1.2", 331 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 332 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 333 | "dev": true 334 | }, 335 | "fill-range": { 336 | "version": "7.0.1", 337 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 338 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 339 | "dev": true, 340 | "requires": { 341 | "to-regex-range": "^5.0.1" 342 | } 343 | }, 344 | "find-up": { 345 | "version": "5.0.0", 346 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 347 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 348 | "dev": true, 349 | "requires": { 350 | "locate-path": "^6.0.0", 351 | "path-exists": "^4.0.0" 352 | } 353 | }, 354 | "flat": { 355 | "version": "5.0.2", 356 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 357 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 358 | "dev": true 359 | }, 360 | "fs.realpath": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 363 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 364 | "dev": true 365 | }, 366 | "fsevents": { 367 | "version": "2.3.2", 368 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 369 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 370 | "dev": true, 371 | "optional": true 372 | }, 373 | "get-caller-file": { 374 | "version": "2.0.5", 375 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 376 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 377 | "dev": true 378 | }, 379 | "glob": { 380 | "version": "7.1.6", 381 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 382 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 383 | "dev": true, 384 | "requires": { 385 | "fs.realpath": "^1.0.0", 386 | "inflight": "^1.0.4", 387 | "inherits": "2", 388 | "minimatch": "^3.0.4", 389 | "once": "^1.3.0", 390 | "path-is-absolute": "^1.0.0" 391 | } 392 | }, 393 | "glob-parent": { 394 | "version": "5.1.2", 395 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 396 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 397 | "dev": true, 398 | "requires": { 399 | "is-glob": "^4.0.1" 400 | } 401 | }, 402 | "growl": { 403 | "version": "1.10.5", 404 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 405 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 406 | "dev": true 407 | }, 408 | "has-flag": { 409 | "version": "4.0.0", 410 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 411 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 412 | "dev": true 413 | }, 414 | "he": { 415 | "version": "1.2.0", 416 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 417 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 418 | "dev": true 419 | }, 420 | "htmlparser2": { 421 | "version": "3.8.3", 422 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 423 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 424 | "dev": true, 425 | "requires": { 426 | "domelementtype": "1", 427 | "domhandler": "2.3", 428 | "domutils": "1.5", 429 | "entities": "1.0", 430 | "readable-stream": "1.1" 431 | } 432 | }, 433 | "inflight": { 434 | "version": "1.0.6", 435 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 436 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 437 | "dev": true, 438 | "requires": { 439 | "once": "^1.3.0", 440 | "wrappy": "1" 441 | } 442 | }, 443 | "inherits": { 444 | "version": "2.0.4", 445 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 446 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 447 | "dev": true 448 | }, 449 | "is-binary-path": { 450 | "version": "2.1.0", 451 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 452 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 453 | "dev": true, 454 | "requires": { 455 | "binary-extensions": "^2.0.0" 456 | } 457 | }, 458 | "is-extglob": { 459 | "version": "2.1.1", 460 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 461 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 462 | "dev": true 463 | }, 464 | "is-fullwidth-code-point": { 465 | "version": "2.0.0", 466 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 467 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 468 | "dev": true 469 | }, 470 | "is-glob": { 471 | "version": "4.0.1", 472 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 473 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 474 | "dev": true, 475 | "requires": { 476 | "is-extglob": "^2.1.1" 477 | } 478 | }, 479 | "is-number": { 480 | "version": "7.0.0", 481 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 482 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 483 | "dev": true 484 | }, 485 | "is-plain-obj": { 486 | "version": "2.1.0", 487 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 488 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 489 | "dev": true 490 | }, 491 | "isarray": { 492 | "version": "0.0.1", 493 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 494 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 495 | "dev": true 496 | }, 497 | "isexe": { 498 | "version": "2.0.0", 499 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 500 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 501 | "dev": true 502 | }, 503 | "js-yaml": { 504 | "version": "4.0.0", 505 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", 506 | "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", 507 | "dev": true, 508 | "requires": { 509 | "argparse": "^2.0.1" 510 | } 511 | }, 512 | "jshint": { 513 | "version": "2.12.0", 514 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.12.0.tgz", 515 | "integrity": "sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==", 516 | "dev": true, 517 | "requires": { 518 | "cli": "~1.0.0", 519 | "console-browserify": "1.1.x", 520 | "exit": "0.1.x", 521 | "htmlparser2": "3.8.x", 522 | "lodash": "~4.17.19", 523 | "minimatch": "~3.0.2", 524 | "shelljs": "0.3.x", 525 | "strip-json-comments": "1.0.x" 526 | } 527 | }, 528 | "locate-path": { 529 | "version": "6.0.0", 530 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 531 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 532 | "dev": true, 533 | "requires": { 534 | "p-locate": "^5.0.0" 535 | } 536 | }, 537 | "lodash": { 538 | "version": "4.17.21", 539 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 540 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 541 | "dev": true 542 | }, 543 | "log-symbols": { 544 | "version": "4.0.0", 545 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 546 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 547 | "dev": true, 548 | "requires": { 549 | "chalk": "^4.0.0" 550 | } 551 | }, 552 | "minimatch": { 553 | "version": "3.0.4", 554 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 555 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 556 | "dev": true, 557 | "requires": { 558 | "brace-expansion": "^1.1.7" 559 | } 560 | }, 561 | "mocha": { 562 | "version": "8.3.2", 563 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", 564 | "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", 565 | "dev": true, 566 | "requires": { 567 | "@ungap/promise-all-settled": "1.1.2", 568 | "ansi-colors": "4.1.1", 569 | "browser-stdout": "1.3.1", 570 | "chokidar": "3.5.1", 571 | "debug": "4.3.1", 572 | "diff": "5.0.0", 573 | "escape-string-regexp": "4.0.0", 574 | "find-up": "5.0.0", 575 | "glob": "7.1.6", 576 | "growl": "1.10.5", 577 | "he": "1.2.0", 578 | "js-yaml": "4.0.0", 579 | "log-symbols": "4.0.0", 580 | "minimatch": "3.0.4", 581 | "ms": "2.1.3", 582 | "nanoid": "3.1.20", 583 | "serialize-javascript": "5.0.1", 584 | "strip-json-comments": "3.1.1", 585 | "supports-color": "8.1.1", 586 | "which": "2.0.2", 587 | "wide-align": "1.1.3", 588 | "workerpool": "6.1.0", 589 | "yargs": "16.2.0", 590 | "yargs-parser": "20.2.4", 591 | "yargs-unparser": "2.0.0" 592 | }, 593 | "dependencies": { 594 | "strip-json-comments": { 595 | "version": "3.1.1", 596 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 597 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 598 | "dev": true 599 | } 600 | } 601 | }, 602 | "ms": { 603 | "version": "2.1.3", 604 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 605 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 606 | "dev": true 607 | }, 608 | "nanoid": { 609 | "version": "3.1.20", 610 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", 611 | "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", 612 | "dev": true 613 | }, 614 | "normalize-path": { 615 | "version": "3.0.0", 616 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 617 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 618 | "dev": true 619 | }, 620 | "once": { 621 | "version": "1.4.0", 622 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 623 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 624 | "dev": true, 625 | "requires": { 626 | "wrappy": "1" 627 | } 628 | }, 629 | "p-limit": { 630 | "version": "3.1.0", 631 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 632 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 633 | "dev": true, 634 | "requires": { 635 | "yocto-queue": "^0.1.0" 636 | } 637 | }, 638 | "p-locate": { 639 | "version": "5.0.0", 640 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 641 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 642 | "dev": true, 643 | "requires": { 644 | "p-limit": "^3.0.2" 645 | } 646 | }, 647 | "path-exists": { 648 | "version": "4.0.0", 649 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 650 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 651 | "dev": true 652 | }, 653 | "path-is-absolute": { 654 | "version": "1.0.1", 655 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 656 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 657 | "dev": true 658 | }, 659 | "picomatch": { 660 | "version": "2.2.2", 661 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 662 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 663 | "dev": true 664 | }, 665 | "randombytes": { 666 | "version": "2.1.0", 667 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 668 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 669 | "dev": true, 670 | "requires": { 671 | "safe-buffer": "^5.1.0" 672 | } 673 | }, 674 | "readable-stream": { 675 | "version": "1.1.14", 676 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 677 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 678 | "dev": true, 679 | "requires": { 680 | "core-util-is": "~1.0.0", 681 | "inherits": "~2.0.1", 682 | "isarray": "0.0.1", 683 | "string_decoder": "~0.10.x" 684 | } 685 | }, 686 | "readdirp": { 687 | "version": "3.5.0", 688 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 689 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 690 | "dev": true, 691 | "requires": { 692 | "picomatch": "^2.2.1" 693 | } 694 | }, 695 | "require-directory": { 696 | "version": "2.1.1", 697 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 698 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 699 | "dev": true 700 | }, 701 | "safe-buffer": { 702 | "version": "5.2.1", 703 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 704 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 705 | "dev": true 706 | }, 707 | "serialize-javascript": { 708 | "version": "5.0.1", 709 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 710 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 711 | "dev": true, 712 | "requires": { 713 | "randombytes": "^2.1.0" 714 | } 715 | }, 716 | "shelljs": { 717 | "version": "0.3.0", 718 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 719 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 720 | "dev": true 721 | }, 722 | "string-width": { 723 | "version": "2.1.1", 724 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 725 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 726 | "dev": true, 727 | "requires": { 728 | "is-fullwidth-code-point": "^2.0.0", 729 | "strip-ansi": "^4.0.0" 730 | } 731 | }, 732 | "string_decoder": { 733 | "version": "0.10.31", 734 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 735 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 736 | "dev": true 737 | }, 738 | "strip-ansi": { 739 | "version": "4.0.0", 740 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 741 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 742 | "dev": true, 743 | "requires": { 744 | "ansi-regex": "^3.0.0" 745 | } 746 | }, 747 | "strip-json-comments": { 748 | "version": "1.0.4", 749 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 750 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 751 | "dev": true 752 | }, 753 | "supports-color": { 754 | "version": "8.1.1", 755 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 756 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 757 | "dev": true, 758 | "requires": { 759 | "has-flag": "^4.0.0" 760 | } 761 | }, 762 | "to-regex-range": { 763 | "version": "5.0.1", 764 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 765 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 766 | "dev": true, 767 | "requires": { 768 | "is-number": "^7.0.0" 769 | } 770 | }, 771 | "which": { 772 | "version": "2.0.2", 773 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 774 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 775 | "dev": true, 776 | "requires": { 777 | "isexe": "^2.0.0" 778 | } 779 | }, 780 | "wide-align": { 781 | "version": "1.1.3", 782 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 783 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 784 | "dev": true, 785 | "requires": { 786 | "string-width": "^1.0.2 || 2" 787 | } 788 | }, 789 | "workerpool": { 790 | "version": "6.1.0", 791 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", 792 | "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", 793 | "dev": true 794 | }, 795 | "wrap-ansi": { 796 | "version": "7.0.0", 797 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 798 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 799 | "dev": true, 800 | "requires": { 801 | "ansi-styles": "^4.0.0", 802 | "string-width": "^4.1.0", 803 | "strip-ansi": "^6.0.0" 804 | }, 805 | "dependencies": { 806 | "ansi-regex": { 807 | "version": "5.0.0", 808 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 809 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 810 | "dev": true 811 | }, 812 | "is-fullwidth-code-point": { 813 | "version": "3.0.0", 814 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 815 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 816 | "dev": true 817 | }, 818 | "string-width": { 819 | "version": "4.2.2", 820 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 821 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 822 | "dev": true, 823 | "requires": { 824 | "emoji-regex": "^8.0.0", 825 | "is-fullwidth-code-point": "^3.0.0", 826 | "strip-ansi": "^6.0.0" 827 | } 828 | }, 829 | "strip-ansi": { 830 | "version": "6.0.0", 831 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 832 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 833 | "dev": true, 834 | "requires": { 835 | "ansi-regex": "^5.0.0" 836 | } 837 | } 838 | } 839 | }, 840 | "wrappy": { 841 | "version": "1.0.2", 842 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 843 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 844 | "dev": true 845 | }, 846 | "y18n": { 847 | "version": "5.0.5", 848 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", 849 | "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", 850 | "dev": true 851 | }, 852 | "yargs": { 853 | "version": "16.2.0", 854 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 855 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 856 | "dev": true, 857 | "requires": { 858 | "cliui": "^7.0.2", 859 | "escalade": "^3.1.1", 860 | "get-caller-file": "^2.0.5", 861 | "require-directory": "^2.1.1", 862 | "string-width": "^4.2.0", 863 | "y18n": "^5.0.5", 864 | "yargs-parser": "^20.2.2" 865 | }, 866 | "dependencies": { 867 | "ansi-regex": { 868 | "version": "5.0.0", 869 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 870 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 871 | "dev": true 872 | }, 873 | "is-fullwidth-code-point": { 874 | "version": "3.0.0", 875 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 876 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 877 | "dev": true 878 | }, 879 | "string-width": { 880 | "version": "4.2.2", 881 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 882 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 883 | "dev": true, 884 | "requires": { 885 | "emoji-regex": "^8.0.0", 886 | "is-fullwidth-code-point": "^3.0.0", 887 | "strip-ansi": "^6.0.0" 888 | } 889 | }, 890 | "strip-ansi": { 891 | "version": "6.0.0", 892 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 893 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 894 | "dev": true, 895 | "requires": { 896 | "ansi-regex": "^5.0.0" 897 | } 898 | } 899 | } 900 | }, 901 | "yargs-parser": { 902 | "version": "20.2.4", 903 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 904 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 905 | "dev": true 906 | }, 907 | "yargs-unparser": { 908 | "version": "2.0.0", 909 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 910 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 911 | "dev": true, 912 | "requires": { 913 | "camelcase": "^6.0.0", 914 | "decamelize": "^4.0.0", 915 | "flat": "^5.0.2", 916 | "is-plain-obj": "^2.1.0" 917 | } 918 | }, 919 | "yocto-queue": { 920 | "version": "0.1.0", 921 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 922 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 923 | "dev": true 924 | } 925 | } 926 | } 927 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "type-name", 3 | "description": "Just a reasonable typeof", 4 | "version": "2.0.2", 5 | "author": { 6 | "name": "Takuto Wada", 7 | "email": "takuto.wada@gmail.com", 8 | "url": "https://github.com/twada" 9 | }, 10 | "bugs": "https://github.com/twada/type-name/issues", 11 | "contributors": [ 12 | { 13 | "name": "azu", 14 | "url": "https://github.com/azu" 15 | }, 16 | { 17 | "name": "Yosuke Furukawa", 18 | "url": "https://github.com/yosuke-furukawa" 19 | }, 20 | { 21 | "name": "Athan", 22 | "url": "https://github.com/kgryte" 23 | }, 24 | { 25 | "name": "Andrew Moss", 26 | "url": "https://github.com/inversion" 27 | } 28 | ], 29 | "devDependencies": { 30 | "jshint": "^2.8.0", 31 | "mocha": "^8.0.0" 32 | }, 33 | "directories": { 34 | "test": "test/" 35 | }, 36 | "files": [ 37 | "index.js", 38 | "index.d.ts" 39 | ], 40 | "homepage": "https://github.com/twada/type-name", 41 | "keywords": [ 42 | "type", 43 | "typeof" 44 | ], 45 | "license": "MIT", 46 | "main": "./index.js", 47 | "types": "./index.d.ts", 48 | "repository": { 49 | "type": "git", 50 | "url": "git://github.com/twada/type-name.git" 51 | }, 52 | "scripts": { 53 | "lint": "jshint index.js", 54 | "preversion": "npm test", 55 | "test": "npm run lint && mocha" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /test/es6_test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const assert = require('assert'); 4 | const typeName = require('..'); 5 | 6 | describe('ES6 features', () => { 7 | 8 | it('anonymous class', () => { 9 | const input = new(class { constructor() {} }); 10 | assert.equal(typeName(input), ''); 11 | }); 12 | 13 | it('named class', () => { 14 | const input = new(class Foo { constructor() {} }); 15 | assert.equal(typeName(input), 'Foo'); 16 | }); 17 | 18 | it('Symbol', () => { 19 | assert.equal(typeName(Symbol("FOO")), 'symbol'); 20 | }); 21 | 22 | it('Promise', () => { 23 | assert.equal(typeName(Promise.resolve(1)), 'Promise'); 24 | }); 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var typeName = require('..'); 3 | 4 | // use indirection to avoid name assignment in ES6 5 | function anon (fn) { 6 | assert(!fn.name); 7 | return fn; 8 | } 9 | 10 | function Person(name, age) { 11 | this.name = name; 12 | this.age = age; 13 | } 14 | 15 | var AnonymousPerson = anon(function(name, age) { 16 | this.name = name; 17 | this.age = age; 18 | }); 19 | 20 | var PseudonymousPerson = anon(function(name, age) { 21 | this.name = name; 22 | this.age = age; 23 | }); 24 | 25 | PseudonymousPerson.toString = function () { 26 | return 'function PseudonymousPerson () { }'; 27 | }; 28 | 29 | var fixtures = { 30 | 'string literal': 'foo', 31 | 'number literal': 5, 32 | 'boolean literal': false, 33 | 'regexp literal': /^not/, 34 | 'array literal': ['foo', 4], 35 | 'object literal': {name: 'bar'}, 36 | 'function expression': function () {}, 37 | 'String object': new String('foo'), 38 | 'Number object': new Number('3'), 39 | 'Boolean object':new Boolean('1'), 40 | 'Date object': new Date(), 41 | 'RegExp object': new RegExp('^not', 'g'), 42 | 'Array object': new Array(), 43 | 'Object object': new Object(), 44 | 'Function object': new Function('x', 'y', 'return x + y'), 45 | 'Error object': new Error('error!'), 46 | 'TypeError object': new TypeError('type error!'), 47 | 'RangeError object': new RangeError('range error!'), 48 | 'user-defined constructor': new Person('alice', 5), 49 | 'anonymous constructor': new AnonymousPerson('bob', 4), 50 | 'pseudonymous constructor': new PseudonymousPerson('nemo', 3), 51 | 'JSON': JSON, 52 | 'NaN': NaN, 53 | 'Infinity': Infinity, 54 | 'Math': Math, 55 | 'null literal': null, 56 | 'undefined value': undefined 57 | }; 58 | 59 | describe('typeName of', function () { 60 | var i, tests = [ 61 | ['string literal', 'string'], 62 | ['number literal', 'number'], 63 | ['boolean literal', 'boolean'], 64 | ['regexp literal', 'RegExp'], 65 | ['array literal', 'Array'], 66 | ['object literal', 'Object'], // be careful! 67 | ['function expression', 'function'], 68 | ['String object', 'String'], 69 | ['Number object', 'Number'], 70 | ['Boolean object', 'Boolean'], 71 | ['Date object', 'Date'], 72 | ['RegExp object', 'RegExp'], 73 | ['Array object', 'Array'], 74 | ['Object object', 'Object'], 75 | ['Function object', 'function'], // be careful! 76 | ['Error object', 'Error'], 77 | ['TypeError object', 'TypeError'], 78 | ['RangeError object', 'RangeError'], 79 | ['JSON', 'JSON'], 80 | ['NaN', 'number'], 81 | ['Infinity', 'number'], 82 | ['Math', 'Math'], 83 | ['user-defined constructor', 'Person'], 84 | ['anonymous constructor', ''], 85 | ['pseudonymous constructor', 'PseudonymousPerson'], 86 | ['null literal', 'null'], 87 | ['undefined value', 'undefined'] 88 | ]; 89 | 90 | for(i = 0; i < tests.length; i += 1) { 91 | (function(idx){ 92 | var sut = tests[idx][0], 93 | expected = tests[idx][1], 94 | input = fixtures[sut]; 95 | it(sut + ' is ' + expected, function () { 96 | assert.equal(typeName(input), expected); 97 | }); 98 | })(i); 99 | } 100 | }); 101 | -------------------------------------------------------------------------------- /test/test_without_constructor.js: -------------------------------------------------------------------------------- 1 | var NonConstructorPerson = { 2 | constructor: null 3 | }; 4 | 5 | var typeName = require('..'), 6 | assert = require('assert'), 7 | fixtures = { 8 | 'Object object': NonConstructorPerson 9 | }; 10 | 11 | describe('typeName of', function () { 12 | var i, tests = [ 13 | ['Object object', 'Object'] 14 | ]; 15 | 16 | for(i = 0; i < tests.length; i += 1) { 17 | (function(idx){ 18 | var sut = tests[idx][0], 19 | expected = tests[idx][1], 20 | input = fixtures[sut]; 21 | it(sut + ' is ' + expected, function () { 22 | assert.equal(typeName(input), expected); 23 | }); 24 | })(i); 25 | } 26 | }); 27 | --------------------------------------------------------------------------------