82224b90b25e2ce2912e51377777830344ed2dd16b11e45965ad613f8baafc3ed0e165019bdebe9160817e7c94d293f5a2411865cd9c0852bbed0193f0226f 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. # check-types.js
  2. [![Build status](https://gitlab.com/philbooth/check-types.js/badges/master/pipeline.svg)](https://gitlab.com/philbooth/check-types.js/pipelines)
  3. [![Package status](https://img.shields.io/npm/v/check-types.svg)](https://www.npmjs.com/package/check-types)
  4. [![Downloads](https://img.shields.io/npm/dm/check-types.svg)](https://www.npmjs.com/package/check-types)
  5. [![License](https://img.shields.io/npm/l/check-types.svg)](https://opensource.org/licenses/MIT)
  6. A little JavaScript library
  7. for asserting types
  8. and values.
  9. * [Why would I want that?](#why-would-i-want-that)
  10. * [How little is it?](#how-little-is-it)
  11. * [How do I install it?](#how-do-i-install-it)
  12. * [How do I use it?](#how-do-i-use-it)
  13. * [Loading the library](#loading-the-library)
  14. * [Calling the exported functions](#calling-the-exported-functions)
  15. * [General predicates](#general-predicates)
  16. * [String predicates](#string-predicates)
  17. * [Number predicates](#number-predicates)
  18. * [Boolean predicates](#boolean-predicates)
  19. * [Object predicates](#object-predicates)
  20. * [Array predicates](#array-predicates)
  21. * [Date predicates](#date-predicates)
  22. * [Function predicates](#function-predicates)
  23. * [Modifiers](#modifiers)
  24. * [Batch operations](#batch-operations)
  25. * [Some examples](#some-examples)
  26. * [Are there TypeScript definitions?](#are-there-typescript-definitions)
  27. * [Where can I use it?](#where-can-i-use-it)
  28. * [What changed from 7.x to 8.x?](#what-changed-from-7x-to-8x)
  29. * [What changed from 6.x to 7.x?](#what-changed-from-6x-to-7x)
  30. * [What changed from 5.x to 6.x?](#what-changed-from-5x-to-6x)
  31. * [What changed from 4.x to 5.x?](#what-changed-from-4x-to-5x)
  32. * [What changed from 3.x to 4.x?](#what-changed-from-3x-to-4x)
  33. * [What changed from 2.x to 3.x?](#what-changed-from-2x-to-3x)
  34. * [What changed from 1.x to 2.x?](#what-changed-from-1x-to-2x)
  35. * [What changed from 0.x to 1.x?](#what-changed-from-0x-to-1x)
  36. * [How do I set up the build environment?](#how-do-i-set-up-the-build-environment)
  37. * [What license is it released under?](#what-license-is-it-released-under)
  38. ## Why would I want that?
  39. Writing explicit conditions
  40. in your functions
  41. to check arguments
  42. and throw exceptions
  43. is a task that
  44. swiftly becomes tiresome
  45. and adds complexity
  46. to your codebase.
  47. The purpose of check-types.js
  48. is to remove this burden
  49. from JavaScript application developers
  50. in an efficient and robust manner,
  51. abstracted by a simple API.
  52. ## How little is it?
  53. 20 kb unminified with comments, 5.7 kb minified, 2.1 kb minified + gzipped.
  54. ## How do I install it?
  55. Via npm:
  56. ```
  57. npm i check-types --save
  58. ```
  59. Or if you just want the git repo:
  60. ```
  61. git clone git@gitlab.com:philbooth/check-types.js.git
  62. ```
  63. If you're into
  64. other package managers,
  65. it is also available
  66. from Bower, Component and Jam.
  67. ## How do I use it?
  68. ### Loading the library
  69. If you are running in
  70. Node.js,
  71. Browserify
  72. or another CommonJS-style
  73. environment,
  74. you can `require`
  75. check-types like so:
  76. ```javascript
  77. var check = require('check-types');
  78. ```
  79. It also the supports
  80. the AMD-style format
  81. preferred by Require.js.
  82. If you are
  83. including check-types.js
  84. with an HTML `<script>` tag,
  85. or neither of the above environments
  86. are detected,
  87. it will export the interface globally as `check`.
  88. ### Calling the exported functions
  89. Once you've loaded the library
  90. in your application,
  91. a whole bunch of functions are available
  92. to call.
  93. Most of the functions
  94. are predicates,
  95. which can be executed
  96. in a number of different contexts:
  97. * `check.xxx(thing)`:
  98. These functions are basic predicates,
  99. returning true or false
  100. depending on the type and value of `thing`.
  101. * `check.not.xxx(thing)`:
  102. The `not` modifier
  103. negates predicates,
  104. returning `true` if the predicate returns `false`
  105. and `false` if the predicate returns `true`.
  106. It is also itself a function,
  107. which simply returns
  108. the negation of
  109. its argument.
  110. * `check.maybe.xxx(thing)`:
  111. The `maybe` modifier
  112. tweaks predicates to
  113. return `true` if `thing` is `null` or `undefined`,
  114. otherwise their normal result
  115. is returned.
  116. It is also itself a function,
  117. which returns `true`
  118. when its argument is `null` or `undefined`,
  119. otherwise it returns its argument.
  120. * `check.assert.xxx(thing, message)`:
  121. The `assert` modifier
  122. changes predicates
  123. to throw when their result is `false`,
  124. otherwise it returns `thing`.
  125. It can be applied
  126. to the `not` and `maybe` modifiers
  127. using the forms
  128. `check.assert.not.xxx(thing, message)` and
  129. `check.assert.maybe.xxx(thing, message)`.
  130. It is also itself a function,
  131. which simply throws
  132. when its argument is false.
  133. * `check.array.of.xxx(thing)`:
  134. The `array.of` modifier
  135. first checks that
  136. it is operating on an array
  137. and then applies
  138. the modified predicate
  139. to each item
  140. of the array.
  141. If the predicate fails
  142. for any item,
  143. it returns `false`,
  144. otherwise it returns `true`.
  145. It can also be prefixed
  146. by other modifiers,
  147. so `check.maybe.array.of`,
  148. `check.not.array.of`,
  149. `check.assert.array.of`,
  150. `check.assert.maybe.array.of` and
  151. `check.assert.not.array.of`
  152. all work
  153. as you would expect
  154. them to.
  155. * `check.arrayLike.of.xxx(thing)`:
  156. The `arrayLike.of` modifier
  157. is synonymous with `array.of`,
  158. except it operates on array-like objects.
  159. * `check.iterable.of.xxx(thing)`:
  160. The `iterable.of` modifier
  161. is synonymous with `array.of`,
  162. except it operates on iterables.
  163. * `check.object.of.xxx(thing)`:
  164. The `object.of` modifier
  165. is synonymous with `array.of`,
  166. except it operates on an object's properties.
  167. Additionally, there are some batch operations
  168. to help you apply predicates
  169. to each value
  170. of an array or object.
  171. These are implemented by
  172. `check.map`,
  173. `check.any` and
  174. `check.all`.
  175. #### General predicates
  176. * `check.equal(thing, thang)`:
  177. Returns `true`
  178. if `thing === thang`,
  179. `false` otherwise.
  180. * `check.null(thing)`:
  181. Returns `true`
  182. if `thing` is `null`,
  183. `false` otherwise.
  184. * `check.undefined(thing)`:
  185. Returns `true`
  186. if `thing` is `undefined`,
  187. `false` otherwise.
  188. * `check.assigned(thing)`:
  189. Returns `true`
  190. if `thing` is not
  191. `null` or `undefined`,
  192. `false` otherwise.
  193. * `check.primitive(thing)`:
  194. Returns `true`
  195. if `thing` is a primitive type,
  196. `false` otherwise.
  197. Primitive types are
  198. `null`, `undefined`, booleans, numbers, strings and symbols.
  199. * `check.hasLength(thing, value)`:
  200. Returns `true`
  201. if `thing` has a length property
  202. that equals `value`,
  203. `false` otherwise.
  204. #### String predicates
  205. * `check.string(thing)`:
  206. Returns `true`
  207. if `thing` is a string,
  208. `false` otherwise.
  209. * `check.emptyString(thing)`:
  210. Returns `true`
  211. if `thing` is the empty string,
  212. `false` otherwise.
  213. * `check.nonEmptyString(thing)`:
  214. Returns `true`
  215. if `thing` is a non-empty string,
  216. `false` otherwise.
  217. * `check.contains(thing, substring)`:
  218. Returns `true`
  219. if `thing` is a string
  220. that contains `substring`,
  221. `false` otherwise.
  222. * `check.match(thing, regex)`:
  223. Returns `true`
  224. if `thing` is a string
  225. that matches `regex`,
  226. `false` otherwise.
  227. #### Number predicates
  228. * `check.number(thing)`:
  229. Returns `true`
  230. if `thing` is a number,
  231. `false` otherwise.
  232. Note that
  233. `NaN`,
  234. `Number.POSITIVE_INFINITY` and
  235. `Number.NEGATIVE_INFINITY`
  236. are not considered numbers here.
  237. * `check.integer(thing)`:
  238. Returns `true`
  239. if `thing` is an integer,
  240. `false` otherwise.
  241. * `check.zero(thing)`:
  242. Returns `true`
  243. if `thing` is zero,
  244. `false` otherwise.
  245. * `check.infinity(thing)`:
  246. Returns `true`
  247. if `thing` is positive or negative infinity,
  248. `false` otherwise.
  249. * `check.greater(thing, value)`:
  250. Returns `true` if `thing` is a number
  251. greater than `value`,
  252. `false` otherwise.
  253. * `check.greaterOrEqual(thing, value)`:
  254. Returns `true` if `thing` is a number
  255. greater than or equal to `value`,
  256. `false` otherwise.
  257. * `check.less(thing, value)`:
  258. Returns `true` if `thing` is a number
  259. less than `value`,
  260. `false` otherwise.
  261. * `check.lessOrEqual(thing, value)`:
  262. Returns `true` if `thing` is a number
  263. less than or equal to `value`,
  264. `false` otherwise.
  265. * `check.between(thing, a, b)`:
  266. Returns `true` if `thing` is a number
  267. between `a` and `b`
  268. (excluding `a` and `b`),
  269. `false` otherwise.
  270. The arguments `a` and `b`
  271. may be in any order,
  272. it doesn't matter
  273. which is greater.
  274. * `check.inRange(thing, a, b)`:
  275. Returns `true` if `thing` is a number
  276. in the range `a` .. `b`
  277. (including `a` and `b`),
  278. `false` otherwise.
  279. The arguments `a` and `b`
  280. may be in any order,
  281. it doesn't matter
  282. which is greater.
  283. * `check.positive(thing)`:
  284. Returns `true` if `thing` is a number
  285. greater than zero,
  286. `false` otherwise.
  287. * `check.negative(thing)`:
  288. Returns `true`
  289. if `thing` is a number
  290. less than zero,
  291. `false` otherwise.
  292. * `check.odd(thing)`:
  293. Returns `true`
  294. if `thing` is an odd number,
  295. `false` otherwise.
  296. * `check.even(thing)`:
  297. Returns `true`
  298. if `thing` is an even number,
  299. `false` otherwise.
  300. #### Boolean predicates
  301. * `check.boolean(thing)`:
  302. Returns `true`
  303. if `thing` is a boolean,
  304. `false` otherwise.
  305. #### Object predicates
  306. * `check.object(thing)`:
  307. Returns `true`
  308. if `thing` is a plain-old JavaScript object,
  309. `false` otherwise.
  310. * `check.emptyObject(thing)`:
  311. Returns `true`
  312. if `thing` is an empty object,
  313. `false` otherwise.
  314. * `check.nonEmptyObject(thing)`:
  315. Returns `true`
  316. if `thing` is a non-empty object,
  317. `false` otherwise.
  318. * `check.instanceStrict(thing, prototype)`:
  319. Returns `true`
  320. if `thing` is an instance of `prototype`,
  321. `false` otherwise.
  322. * `check.instance(thing, prototype)`:
  323. Returns `true`
  324. if `thing` is an instance of `prototype`,
  325. `false` otherwise.
  326. Falls back to testing
  327. `constructor.name` and `Object.prototype.toString`
  328. if the `instanceof` test fails.
  329. * `check.like(thing, duck)`:
  330. Duck-typing checker.
  331. Returns `true`
  332. if `thing` has all of the properties of `duck`,
  333. `false` otherwise.
  334. #### Array predicates
  335. * `check.array(thing)`:
  336. Returns `true`
  337. if `thing` is an array,
  338. `false` otherwise.
  339. * `check.emptyArray(thing)`:
  340. Returns `true`
  341. if `thing` is an empty array,
  342. `false` otherwise.
  343. * `check.nonEmptyArray(thing)`:
  344. Returns `true`
  345. if `thing` is a non-empty array,
  346. `false` otherwise.
  347. * `check.arrayLike(thing)`:
  348. Returns `true`
  349. if `thing` has a numeric length property,
  350. `false` otherwise.
  351. * `check.iterable(thing)`:
  352. Returns `true`
  353. if `thing` implements the iterable protocol,
  354. `false` otherwise.
  355. In pre-ES6 environments,
  356. this predicate falls back
  357. to `arrayLike` behaviour.
  358. * `check.includes(thing, value)`:
  359. Returns `true`
  360. if `thing` includes `value`,
  361. `false` otherwise.
  362. #### Date predicates
  363. * `check.date(thing)`:
  364. Returns `true`
  365. if `thing` is a valid date,
  366. `false` otherwise.
  367. #### Function predicates
  368. * `check.function(thing)`:
  369. Returns `true`
  370. if `thing` is a function,
  371. `false` otherwise.
  372. #### Modifiers
  373. * `check.not(value)`:
  374. Returns the negation
  375. of `value`.
  376. * `check.not.xxx(...)`:
  377. Returns the negation
  378. of the predicate.
  379. * `check.maybe(value)`:
  380. Returns `true`
  381. if `value` is `null` or `undefined`,
  382. otherwise it returns `value`.
  383. * `check.maybe.xxx(...)`:
  384. Returns `true`
  385. if `thing` is `null` or `undefined`,
  386. otherwise it propagates
  387. the return value
  388. from its predicate.
  389. * `check.array.of.xxx(value)`:
  390. Returns `true`
  391. if `value` is an array
  392. and the predicate is true
  393. for every item.
  394. Also works with the `not` and `maybe` modifiers.
  395. * `check.arrayLike.of.xxx(thing)`:
  396. The `arrayLike.of` modifier
  397. is synonymous with `array.of`,
  398. except it operates on array-like objects.
  399. * `check.iterable.of.xxx(thing)`:
  400. The `iterable.of` modifier
  401. is synonymous with `array.of`,
  402. except it operates on iterables.
  403. * `check.object.of.xxx(thing)`:
  404. The `object.of` modifier
  405. is synonymous with `array.of`,
  406. except it operates on an object's properties.
  407. * `check.assert(value, message, ErrorType)`:
  408. Throws a `TypeError`
  409. if `value` is *falsy*,
  410. otherwise it returns `value`.
  411. `message` and `ErrorType`
  412. are optional arguments
  413. that control
  414. the message and type
  415. of the thrown error object.
  416. * `check.assert.xxx(...)`:
  417. Throws a `TypeError`
  418. if the predicate returns false,
  419. otherwise it returns the subject value.
  420. The last two arguments
  421. are an optional message and error type
  422. that control
  423. the message and type
  424. of the thrown error object.
  425. Also works with the `not`, `maybe` and `...of` modifiers.
  426. #### Batch operations
  427. * `check.map(things, predicates)`:
  428. Maps each value from the `things` array or object
  429. to the corresponding predicate
  430. and returns the array or object of results.
  431. Passing a single predicate
  432. instead of an array or object
  433. maps all of the values
  434. to the same predicate.
  435. * `check.all(results)`:
  436. Returns `true`
  437. if all the result values are true
  438. in an array or object
  439. returned by `map`.
  440. * `check.any(results)`:
  441. Returns `true`
  442. if any result value is true
  443. in an array or object
  444. returned by `map`.
  445. #### Some examples
  446. ```javascript
  447. check.even(3);
  448. // Returns false
  449. ```
  450. ```javascript
  451. check.not.even(3);
  452. // Returns true
  453. ```
  454. ```javascript
  455. check.maybe.even(null);
  456. // Returns true
  457. ```
  458. ```javascript
  459. check.assert.like({ foo: 'bar' }, { baz: 'qux' });
  460. // Throws `new TypeError('Invalid type')`
  461. ```
  462. ```javascript
  463. check.assert.not.like({ foo: 'bar' }, { baz: 'qux' });
  464. // Doesn't throw, returns `{ foo: 'bar' }`
  465. ```
  466. ```javascript
  467. check.assert.maybe.like(undefined, { foo: 'bar' });
  468. // Doesn't throw, returns `undefined`
  469. ```
  470. ```javascript
  471. check.assert(myFunction(), 'Something went wrong', CustomError);
  472. // Throws `new CustomError('Something went wrong')` if myFunction returns `false`
  473. ```
  474. ```javascript
  475. check.map([ 'foo', 'bar', '' ], check.nonEmptyString);
  476. // Returns [ true, true, false ]
  477. ```
  478. ```javascript
  479. check.map({
  480. foo: 2,
  481. bar: { baz: 'qux' }
  482. }, {
  483. foo: check.odd,
  484. bar: { baz: check.nonEmptyString }
  485. });
  486. // Returns { foo: false, bar: { baz: true } }
  487. ```
  488. ```javascript
  489. check.all(
  490. check.map(
  491. { foo: 0, bar: '' },
  492. { foo: check.number, bar: check.string }
  493. )
  494. );
  495. // Returns true
  496. ```
  497. ```javascript
  498. check.any(
  499. check.map(
  500. [ 1, 2, 3, '' ],
  501. check.string
  502. )
  503. );
  504. // Returns true
  505. ```
  506. ## Are there TypeScript definitions?
  507. [Yes](https://www.npmjs.com/package/@types/check-types)!
  508. Thanks to [@idchlife](https://github.com/idchlife),
  509. type definitions [were added](https://github.com/DefinitelyTyped/DefinitelyTyped/commit/d19ddb855dea08105a3d7450a98696c7bcd62f60)
  510. to [DefinitelyTyped].
  511. You can add them to your project
  512. via npm:
  513. ```
  514. npm i @types/check-types --save-dev
  515. ```
  516. ## Where can I use it?
  517. As of version 2.0,
  518. this library no longer supports ES3.
  519. That means you can't use it
  520. in IE 7 or 8.
  521. Everywhere else should be fine.
  522. If those versions of IE
  523. are important to you,
  524. worry not!
  525. The 1.x versions
  526. all support old IE
  527. and any future 1.x versions
  528. will adhere to that too.
  529. See the [releases]
  530. for more information.
  531. ## What changed from 7.x to 8.x?
  532. Breaking changes
  533. were made to the API
  534. in version 8.0.0.
  535. Specifically,
  536. the `apply` batch operation was removed
  537. and `map` was instead changed
  538. to work with both arrays and objects,
  539. to simplify the API surface.
  540. See the [history][history8]
  541. for more details.
  542. ## What changed from 6.x to 7.x?
  543. Breaking changes
  544. were made to the API
  545. in version 7.0.0.
  546. Specifically,
  547. the `instance` predicate
  548. was renamed to `instanceStrict`
  549. and the `builtIn` and `userDefined` predicates
  550. were combined to form
  551. a new `instance` predicate.
  552. See the [history][history7]
  553. for more details.
  554. ## What changed from 5.x to 6.x?
  555. Breaking changes
  556. were made to the API
  557. in version 6.0.0.
  558. Specifically,
  559. the `either` modifier was removed.
  560. Instead,
  561. calling code can use
  562. the `any` function,
  563. or simply express the boolean logic
  564. in JS.
  565. See the [history][history6]
  566. for more details.
  567. ## What changed from 4.x to 5.x?
  568. Breaking changes
  569. were made to the API
  570. in version 5.0.0.
  571. Specifically,
  572. the predicates `isMap` and `error` were removed
  573. in favour of the new predicate `builtIn`,
  574. which can be used to test for
  575. all built-in objects.
  576. See the [history][history5]
  577. for more details.
  578. ## What changed from 3.x to 4.x?
  579. Breaking changes
  580. were made to the API
  581. in version 4.0.0.
  582. Specifically,
  583. the predicate `unemptyString`
  584. was renamed to `nonEmptyString`
  585. and the predicate `error`
  586. was changed to support
  587. derived Error objects.
  588. See the [history][history4]
  589. for more details.
  590. ## What changed from 2.x to 3.x?
  591. Breaking changes
  592. were made to the API
  593. in version 3.0.0.
  594. Specifically,
  595. the predicate `length`
  596. was renamed to `hasLength`
  597. and the predicate `webUrl`
  598. was removed.
  599. See the [history][history3]
  600. for more details.
  601. ## What changed from 1.x to 2.x?
  602. Breaking changes
  603. were made to the API
  604. in version 2.0.0.
  605. Specifically:
  606. * Support for ES3 was dropped
  607. * The predicates `gitUrl`, `email` and `floatNumber` were removed.
  608. * `verify` was renamed to `assert`.
  609. * `nulled` was renamed to `null`.
  610. * `oddNumber` was renamed to `odd`.
  611. * `evenNumber` was renamed to `even`.
  612. * `positiveNumber` was renamed to `positive`.
  613. * `negativeNumber` was renamed to `negative`.
  614. * `intNumber` was renamed to `integer`.
  615. * `bool` was renamed to `boolean`.
  616. * `defined` was swapped to become `undefined`.
  617. * `webUrl` was tightened to reject more cases.
  618. See the [history][history2]
  619. for more details.
  620. ## What changed from 0.x to 1.x?
  621. Breaking changes
  622. were made to the API
  623. in version 1.0.0.
  624. Specifically,
  625. all of the predicates
  626. were renamed
  627. from `check.isXxxx`
  628. to `check.xxx` and
  629. all of the verifiers
  630. were renamed
  631. from `check.verifyXxxx`
  632. to `check.verify.xxx`.
  633. See the [history][history1]
  634. for more details.
  635. ## How do I set up the build environment?
  636. The build environment relies on
  637. [Node.js][node],
  638. [NPM],
  639. [JSHint],
  640. [Mocha],
  641. [Chai],
  642. [UglifyJS] and
  643. [please-release-me].
  644. Assuming that you already have Node.js and NPM set up,
  645. you just need to run `npm install` to
  646. install all of the dependencies as listed in `package.json`.
  647. The unit tests are in `test/check-types.js`.
  648. You can run them with the command `npm test`.
  649. To run the tests in a web browser,
  650. open `test/check-types.html`.
  651. ## What license is it released under?
  652. [MIT][license]
  653. [definitelytyped]: https://github.com/DefinitelyTyped/DefinitelyTyped
  654. [releases]: https://gitlab.com/philbooth/check-types.js/tags
  655. [history8]: HISTORY.md#anchor-800
  656. [history7]: HISTORY.md#anchor-70
  657. [history6]: HISTORY.md#anchor-60
  658. [history5]: HISTORY.md#anchor-50
  659. [history4]: HISTORY.md#anchor-40
  660. [history3]: HISTORY.md#anchor-30
  661. [history2]: HISTORY.md#anchor-20
  662. [history1]: HISTORY.md#anchor-10
  663. [node]: http://nodejs.org/
  664. [npm]: https://npmjs.org/
  665. [jshint]: https://github.com/jshint/node-jshint
  666. [mocha]: http://mochajs.org/
  667. [chai]: http://chaijs.com/
  668. [uglifyjs]: https://github.com/mishoo/UglifyJS
  669. [please-release-me]: https://gitlab.com/philbooth/please-release-me
  670. [license]: https://gitlab.com/philbooth/check-types.js/blob/master/COPYING