├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── ensure-array.js ├── package-lock.json ├── package.json └── test └── simple.mocha.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 4 4 | - 6 5 | - 8 6 | script: 7 | - npm test 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2011 Jeff Barczewski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ensure-array 2 | 3 | Simple convenience function which ensures that you are dealing with an array and you can 4 | eliminate noise from your code. 5 | 6 | [![Build Status](https://secure.travis-ci.org/jeffbski/ensure-array.png?branch=master)](http://travis-ci.org/jeffbski/ensure-array) 7 | 8 | For Example: 9 | 10 | ```javascript 11 | var array = require('ensure-array'); 12 | 13 | function foo(bar) { 14 | array(bar).forEach(function (x) { 15 | //do something with each item 16 | }); 17 | } 18 | ``` 19 | 20 | Instead of doing something like this: 21 | 22 | ```javascript 23 | function foo(bar) { 24 | if (bar === undefined) return; 25 | if (bar === null) return; 26 | if (!Array.isArray(bar)) bar = [bar]; 27 | bar.forEach(function (x) { 28 | //do something with each item 29 | }); 30 | } 31 | ``` 32 | 33 | ## Description 34 | 35 | It gets rid of the noise and coerces what is provided into an array, so you do not have to 36 | litter your code with a bunch of extraneous checks. 37 | 38 | Here is the logic behind the function: 39 | 40 | 1. if nothing passed to the function return empty array [] 41 | 2. if single argument passed is undefined or null return empty array [] 42 | 3. if single argument passed is already an array, return it unchanged 43 | 4. otherwise return array containing all of the arguments 44 | 45 | Here is the actual code which makes it happen 46 | 47 | ```javascript 48 | module.exports = function array(a, b, n) { 49 | if (arguments.length === 0) return []; //no args, ret [] 50 | if (arguments.length === 1) { //single argument 51 | if (a === undefined || a === null) return []; // undefined or null, ret [] 52 | if (Array.isArray(a)) return a; // isArray, return it 53 | } 54 | return Array.prototype.slice.call(arguments); //return array with copy of all arguments 55 | }; 56 | ``` 57 | 58 | ## Installation 59 | 60 | ```bash 61 | npm install ensure-array 62 | ``` 63 | 64 | 65 | ## Usage 66 | 67 | ```javascript 68 | var array = require('ensure-array'); // get handle to the function 69 | var foo = array(whatever); // foo will now safely be an array 70 | ``` 71 | 72 | 73 | ## Status 74 | 75 | - 2017-11-02 - 1.0.0 - Modernized by @Zertz 76 | - 2011-12-08 - 0.0.4 - Update tapr / tap versions 77 | - 2011-12-01 - 0.0.3 - Updated to support any version of Node.js 78 | 79 | 80 | ## License 81 | 82 | - [MIT license](http://github.com/jeffbski/ensure-array/raw/master/LICENSE) 83 | 84 | ## Contributors 85 | 86 | - Author: Jeff Barczewski (@jeffbski) 87 | - Modernized on 2017-11-02 by Pier-Luc Gendreau (@Zertz) 88 | 89 | ## Contributing 90 | 91 | - Source code repository: http://github.com/jeffbski/ensure-array 92 | - Ideas and pull requests are encouraged - http://github.com/jeffbski/ensure-array/issues 93 | - You may contact me at @jeffbski or through github at http://github.com/jeffbski 94 | -------------------------------------------------------------------------------- /ensure-array.js: -------------------------------------------------------------------------------- 1 | module.exports = function ensureArray(a, b, n) { 2 | if (arguments.length === 0) return []; // no args, ret [] 3 | if (arguments.length === 1) { // single argument 4 | if (a === undefined || a === null) return []; // undefined or null, ret [] 5 | if (Array.isArray(a)) return a; // isArray, return it 6 | } 7 | return Array.prototype.slice.call(arguments); // return array with copy of all arguments 8 | } 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ensure-array", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "assertion-error": { 8 | "version": "1.0.2", 9 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 10 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 11 | "dev": true 12 | }, 13 | "balanced-match": { 14 | "version": "1.0.0", 15 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 16 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 17 | "dev": true 18 | }, 19 | "brace-expansion": { 20 | "version": "1.1.8", 21 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 22 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 23 | "dev": true, 24 | "requires": { 25 | "balanced-match": "1.0.0", 26 | "concat-map": "0.0.1" 27 | } 28 | }, 29 | "browser-stdout": { 30 | "version": "1.3.0", 31 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 32 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 33 | "dev": true 34 | }, 35 | "chai": { 36 | "version": "4.1.2", 37 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 38 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 39 | "dev": true, 40 | "requires": { 41 | "assertion-error": "1.0.2", 42 | "check-error": "1.0.2", 43 | "deep-eql": "3.0.1", 44 | "get-func-name": "2.0.0", 45 | "pathval": "1.1.0", 46 | "type-detect": "4.0.3" 47 | } 48 | }, 49 | "check-error": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 52 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 53 | "dev": true 54 | }, 55 | "commander": { 56 | "version": "2.11.0", 57 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 58 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 59 | "dev": true 60 | }, 61 | "concat-map": { 62 | "version": "0.0.1", 63 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 64 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 65 | "dev": true 66 | }, 67 | "debug": { 68 | "version": "3.1.0", 69 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 70 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 71 | "dev": true, 72 | "requires": { 73 | "ms": "2.0.0" 74 | } 75 | }, 76 | "deep-eql": { 77 | "version": "3.0.1", 78 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 79 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 80 | "dev": true, 81 | "requires": { 82 | "type-detect": "4.0.3" 83 | } 84 | }, 85 | "diff": { 86 | "version": "3.3.1", 87 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 88 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 89 | "dev": true 90 | }, 91 | "escape-string-regexp": { 92 | "version": "1.0.5", 93 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 94 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 95 | "dev": true 96 | }, 97 | "fs.realpath": { 98 | "version": "1.0.0", 99 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 100 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 101 | "dev": true 102 | }, 103 | "get-func-name": { 104 | "version": "2.0.0", 105 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 106 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 107 | "dev": true 108 | }, 109 | "glob": { 110 | "version": "7.1.2", 111 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 112 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 113 | "dev": true, 114 | "requires": { 115 | "fs.realpath": "1.0.0", 116 | "inflight": "1.0.6", 117 | "inherits": "2.0.3", 118 | "minimatch": "3.0.4", 119 | "once": "1.4.0", 120 | "path-is-absolute": "1.0.1" 121 | } 122 | }, 123 | "growl": { 124 | "version": "1.10.3", 125 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 126 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 127 | "dev": true 128 | }, 129 | "has-flag": { 130 | "version": "2.0.0", 131 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 132 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 133 | "dev": true 134 | }, 135 | "he": { 136 | "version": "1.1.1", 137 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 138 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 139 | "dev": true 140 | }, 141 | "inflight": { 142 | "version": "1.0.6", 143 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 144 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 145 | "dev": true, 146 | "requires": { 147 | "once": "1.4.0", 148 | "wrappy": "1.0.2" 149 | } 150 | }, 151 | "inherits": { 152 | "version": "2.0.3", 153 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 154 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 155 | "dev": true 156 | }, 157 | "minimatch": { 158 | "version": "3.0.4", 159 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 160 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 161 | "dev": true, 162 | "requires": { 163 | "brace-expansion": "1.1.8" 164 | } 165 | }, 166 | "minimist": { 167 | "version": "0.0.8", 168 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 169 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 170 | "dev": true 171 | }, 172 | "mkdirp": { 173 | "version": "0.5.1", 174 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 175 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 176 | "dev": true, 177 | "requires": { 178 | "minimist": "0.0.8" 179 | } 180 | }, 181 | "mocha": { 182 | "version": "4.0.1", 183 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", 184 | "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", 185 | "dev": true, 186 | "requires": { 187 | "browser-stdout": "1.3.0", 188 | "commander": "2.11.0", 189 | "debug": "3.1.0", 190 | "diff": "3.3.1", 191 | "escape-string-regexp": "1.0.5", 192 | "glob": "7.1.2", 193 | "growl": "1.10.3", 194 | "he": "1.1.1", 195 | "mkdirp": "0.5.1", 196 | "supports-color": "4.4.0" 197 | } 198 | }, 199 | "ms": { 200 | "version": "2.0.0", 201 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 202 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 203 | "dev": true 204 | }, 205 | "once": { 206 | "version": "1.4.0", 207 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 208 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 209 | "dev": true, 210 | "requires": { 211 | "wrappy": "1.0.2" 212 | } 213 | }, 214 | "path-is-absolute": { 215 | "version": "1.0.1", 216 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 217 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 218 | "dev": true 219 | }, 220 | "pathval": { 221 | "version": "1.1.0", 222 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 223 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 224 | "dev": true 225 | }, 226 | "supports-color": { 227 | "version": "4.4.0", 228 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 229 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 230 | "dev": true, 231 | "requires": { 232 | "has-flag": "2.0.0" 233 | } 234 | }, 235 | "type-detect": { 236 | "version": "4.0.3", 237 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", 238 | "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", 239 | "dev": true 240 | }, 241 | "wrappy": { 242 | "version": "1.0.2", 243 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 244 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 245 | "dev": true 246 | } 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Jeff Barczewski ", 3 | "name": "ensure-array", 4 | "description": "Ensure that an object is an array. Moves error checking out of your code.", 5 | "version": "1.0.0", 6 | "license": "MIT", 7 | "repository": { 8 | "type": "git", 9 | "url": "http://github.com/jeffbski/ensure-array.git" 10 | }, 11 | "bugs": { 12 | "url": "http://github.com/jeffbski/ensure-array/issues" 13 | }, 14 | "main": "ensure-array.js", 15 | "devDependencies": { 16 | "mocha": "~4.0.0", 17 | "chai": "~4.1.0" 18 | }, 19 | "scripts": { 20 | "test": "./node_modules/mocha/bin/mocha ./test/*.mocha.js --reporter spec --ui qunit" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /test/simple.mocha.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var chai = require('chai'); 4 | var ensureArray = require('../ensure-array.js'); 5 | 6 | (function () { 7 | 8 | var t = chai.assert; 9 | 10 | suite('simple-tests'); 11 | 12 | test('empty arg list becomes empty array', function (done) { 13 | var result = ensureArray(); 14 | t.deepEqual(result, [], 'should be empty array'); 15 | done(); 16 | }); 17 | 18 | test('undefined single argument becomes empty array', function (done) { 19 | var result = ensureArray(undefined); 20 | t.deepEqual(result, [], 'should be empty array'); 21 | done(); 22 | }); 23 | 24 | test('null single argument becomes empty array', function (done) { 25 | var result = ensureArray(null); 26 | t.deepEqual(result, [], 'should be empty array'); 27 | done(); 28 | }); 29 | 30 | test('array single argument returns itself unchanged', function (done) { 31 | var result = ensureArray([1, 2, 3]); 32 | t.deepEqual(result, [1, 2, 3]); 33 | done(); 34 | }); 35 | 36 | test('single argument non-array becomes an array containing itself', function (done) { 37 | var result = ensureArray(10); 38 | t.deepEqual(result, [10]); 39 | done(); 40 | }); 41 | 42 | test('undefined argument as first of many arguments returns array of all args', function (done) { 43 | var result = ensureArray(undefined, 1, 'two'); 44 | t.deepEqual(result, [undefined, 1, 'two']); 45 | done(); 46 | }); 47 | 48 | test('null argument as first of many arguments returns array of all args', function (done) { 49 | var result = ensureArray(null, 1, 'two'); 50 | t.deepEqual(result, [null, 1, 'two']); 51 | done(); 52 | }); 53 | 54 | }()); 55 | 56 | --------------------------------------------------------------------------------