diff --git a/.gitattributes b/.gitattributes index 391f0a4..6313b56 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1 @@ -* text=auto -*.js text eol=lf +* text=auto eol=lf diff --git a/.travis.yml b/.travis.yml index e0cc348..2ae9d62 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: node_js node_js: + - '10' - '8' - '6' diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..5586d78 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,4 @@ +/** +[FNV-1a](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) non-cryptographic hash function. +*/ +export default function fnv1a(string: string): number; diff --git a/index.js b/index.js index 1c3bdf8..8d49b95 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ 'use strict'; const OFFSET_BASIS_32 = 2166136261; -module.exports = string => { +const fnv1a = string => { let hash = OFFSET_BASIS_32; for (let i = 0; i < string.length; i++) { @@ -14,3 +14,6 @@ module.exports = string => { return hash >>> 0; }; + +module.exports = fnv1a; +module.exports.default = fnv1a; diff --git a/index.test-d.ts b/index.test-d.ts new file mode 100644 index 0000000..1cd86e8 --- /dev/null +++ b/index.test-d.ts @@ -0,0 +1,4 @@ +import {expectType} from 'tsd-check'; +import fnv1a from '.'; + +expectType(fnv1a('🦄🌈')); diff --git a/package.json b/package.json index fb67d95..0877646 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,11 @@ "node": ">=6" }, "scripts": { - "test": "xo && ava" + "test": "xo && ava && tsd-check" }, "files": [ - "index.js" + "index.js", + "index.d.ts" ], "keywords": [ "fnv1a", @@ -35,7 +36,8 @@ "vo" ], "devDependencies": { - "ava": "*", - "xo": "*" + "ava": "^1.3.1", + "tsd-check": "^0.5.0", + "xo": "^0.24.0" } } diff --git a/test.js b/test.js index 1bc1618..25918e5 100644 --- a/test.js +++ b/test.js @@ -1,21 +1,21 @@ import test from 'ava'; -import m from '.'; +import fnv1a from '.'; -test(t => { - t.is(m(''), 2166136261); - t.is(m('🦄🌈'), 582881315); +test('main', t => { + t.is(fnv1a(''), 2166136261); + t.is(fnv1a('🦄🌈'), 582881315); - t.is(m('h'), 3977000791); - t.is(m('he'), 1547363254); - t.is(m('hel'), 179613742); - t.is(m('hell'), 477198310); - t.is(m('hello'), 1335831723); - t.is(m('hello '), 3801292497); - t.is(m('hello w'), 1402552146); - t.is(m('hello wo'), 3611200775); - t.is(m('hello wor'), 1282977583); - t.is(m('hello worl'), 2767971961); - t.is(m('hello world'), 3582672807); + t.is(fnv1a('h'), 3977000791); + t.is(fnv1a('he'), 1547363254); + t.is(fnv1a('hel'), 179613742); + t.is(fnv1a('hell'), 477198310); + t.is(fnv1a('hello'), 1335831723); + t.is(fnv1a('hello '), 3801292497); + t.is(fnv1a('hello w'), 1402552146); + t.is(fnv1a('hello wo'), 3611200775); + t.is(fnv1a('hello wor'), 1282977583); + t.is(fnv1a('hello worl'), 2767971961); + t.is(fnv1a('hello world'), 3582672807); - t.is(m('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.'), 2964896417); + t.is(fnv1a('Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.'), 2964896417); });