levenshtein-edit-distance
Advanced tools
Comparing version 2.0.5 to 3.0.0
52
cli.js
#!/usr/bin/env node | ||
'use strict' | ||
import fs from 'fs' | ||
import {URL} from 'url' | ||
import {levenshteinEditDistance} from './index.js' | ||
var pack = require('./package.json') | ||
var levenshtein = require('.') | ||
/** @type {Object.<string, unknown>} */ | ||
var pack = JSON.parse( | ||
String(fs.readFileSync(new URL('./package.json', import.meta.url))) | ||
) | ||
var argv = process.argv.slice(2) | ||
var insensitives = ['--insensitive', '-i'] | ||
var insensitive = false | ||
var pos = argv.indexOf('--insensitive') | ||
insensitives.forEach(function(flag) { | ||
var pos = argv.indexOf(flag) | ||
if (pos !== -1) { | ||
argv.splice(pos, 1) | ||
insensitive = true | ||
} | ||
}) | ||
if (pos !== -1) { | ||
argv.splice(pos, 1) | ||
insensitive = true | ||
} | ||
if (argv.indexOf('--help') !== -1 || argv.indexOf('-h') !== -1) { | ||
pos = argv.indexOf('-i') | ||
if (pos !== -1) { | ||
argv.splice(pos, 1) | ||
insensitive = true | ||
} | ||
if (argv.includes('--help') || argv.includes('-h')) { | ||
console.log(help()) | ||
} else if (argv.indexOf('--version') !== -1 || argv.indexOf('-v') !== -1) { | ||
} else if (argv.includes('--version') || argv.includes('-v')) { | ||
console.log(pack.version) | ||
@@ -26,4 +33,4 @@ } else if (argv.length === 0) { | ||
process.stdin.setEncoding('utf8') | ||
process.stdin.on('data', function(data) { | ||
getDistance(data.trim()) | ||
process.stdin.on('data', function (data) { | ||
getDistance(String(data).trim()) | ||
}) | ||
@@ -59,9 +66,10 @@ } else { | ||
/** | ||
* @param {string} value | ||
*/ | ||
function getDistance(value) { | ||
var values = value | ||
.split(',') | ||
.join(' ') | ||
.split(/\s+/) | ||
var values = value.split(',').join(' ').split(/\s+/) | ||
if (values.length === 2) { | ||
// @ts-ignore yes, the length is 2. | ||
console.log(distance(values)) | ||
@@ -74,4 +82,8 @@ } else { | ||
/** | ||
* @param {[string, string]} values | ||
* @return {number} | ||
*/ | ||
function distance(values) { | ||
return levenshtein(values[0], values[1], insensitive) | ||
return levenshteinEditDistance(values[0], values[1], insensitive) | ||
} |
41
index.js
@@ -1,16 +0,24 @@ | ||
'use strict' | ||
module.exports = levenshtein | ||
/** @type {Array.<number>} */ | ||
var codes = [] | ||
/** @type {Array.<number>} */ | ||
var cache = [] | ||
var codes = [] | ||
function levenshtein(value, other, insensitive) { | ||
var length | ||
var lengthOther | ||
/** | ||
* @param {string} value | ||
* @param {string} other | ||
* @param {boolean} [insensitive] | ||
* @returns {number} | ||
*/ | ||
export function levenshteinEditDistance(value, other, insensitive) { | ||
/** @type {number} */ | ||
var code | ||
/** @type {number} */ | ||
var result | ||
/** @type {number} */ | ||
var distance | ||
/** @type {number} */ | ||
var distanceOther | ||
/** @type {number} */ | ||
var index | ||
/** @type {number} */ | ||
var indexOther | ||
@@ -22,11 +30,8 @@ | ||
length = value.length | ||
lengthOther = other.length | ||
if (length === 0) { | ||
return lengthOther | ||
if (value.length === 0) { | ||
return other.length | ||
} | ||
if (lengthOther === 0) { | ||
return length | ||
if (other.length === 0) { | ||
return value.length | ||
} | ||
@@ -41,3 +46,3 @@ | ||
while (index < length) { | ||
while (index < value.length) { | ||
codes[index] = value.charCodeAt(index) | ||
@@ -49,3 +54,3 @@ cache[index] = ++index | ||
while (indexOther < lengthOther) { | ||
while (indexOther < other.length) { | ||
code = other.charCodeAt(indexOther) | ||
@@ -55,3 +60,3 @@ result = distance = indexOther++ | ||
while (++index < length) { | ||
while (++index < value.length) { | ||
distanceOther = code === codes[index] ? distance : distance + 1 | ||
@@ -58,0 +63,0 @@ distance = cache[index] |
{ | ||
"name": "levenshtein-edit-distance", | ||
"version": "2.0.5", | ||
"version": "3.0.0", | ||
"description": "Levenshtein edit distance. No cruft. Real fast.", | ||
@@ -25,33 +25,32 @@ "license": "MIT", | ||
], | ||
"sideEffects": false, | ||
"type": "module", | ||
"bin": "cli.js", | ||
"main": "index.js", | ||
"types": "index.d.ts", | ||
"files": [ | ||
"index.js", | ||
"cli.js" | ||
"cli.js", | ||
"index.d.ts", | ||
"index.js" | ||
], | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"browserify": "^16.0.0", | ||
"nyc": "^15.0.0", | ||
"prettier": "^1.0.0", | ||
"remark-cli": "^7.0.0", | ||
"remark-preset-wooorm": "^6.0.0", | ||
"tape": "^4.0.0", | ||
"tinyify": "^2.0.0", | ||
"xo": "^0.25.0" | ||
"@types/tape": "^4.0.0", | ||
"c8": "^7.0.0", | ||
"prettier": "^2.0.0", | ||
"remark-cli": "^9.0.0", | ||
"remark-preset-wooorm": "^8.0.0", | ||
"rimraf": "^3.0.0", | ||
"tape": "^5.0.0", | ||
"type-coverage": "^2.0.0", | ||
"typescript": "^4.0.0", | ||
"xo": "^0.38.0" | ||
}, | ||
"scripts": { | ||
"format": "remark . -qfo && prettier --write \"**/*.js\" && xo --fix", | ||
"build-bundle": "browserify . -s levenshteinEditDistance -o levenshtein-edit-distance.js", | ||
"build-mangle": "browserify . -s levenshteinEditDistance -p tinyify -o levenshtein-edit-distance.min.js", | ||
"build": "npm run build-bundle && npm run build-mangle", | ||
"test-api": "node test", | ||
"test-coverage": "nyc --reporter lcov tape test.js", | ||
"test": "npm run format && npm run build && npm run test-coverage" | ||
"prepack": "npm run build && npm run format", | ||
"build": "rimraf \"*.d.ts\" && tsc && type-coverage", | ||
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", | ||
"test-api": "node test.js", | ||
"test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov node test.js", | ||
"test": "npm run build && npm run format && npm run test-coverage" | ||
}, | ||
"nyc": { | ||
"check-coverage": true, | ||
"lines": 100, | ||
"functions": 100, | ||
"branches": 100 | ||
}, | ||
"prettier": { | ||
@@ -67,10 +66,7 @@ "tabWidth": 2, | ||
"prettier": true, | ||
"esnext": false, | ||
"rules": { | ||
"unicorn/prefer-includes": "off", | ||
"no-multi-assign": "off" | ||
}, | ||
"ignores": [ | ||
"levenshtein-edit-distance.js" | ||
] | ||
"no-multi-assign": "off", | ||
"no-var": "off", | ||
"prefer-arrow-callback": "off" | ||
} | ||
}, | ||
@@ -81,3 +77,8 @@ "remarkConfig": { | ||
] | ||
}, | ||
"typeCoverage": { | ||
"atLeast": 100, | ||
"detail": true, | ||
"strict": true | ||
} | ||
} |
@@ -14,2 +14,5 @@ # levenshtein-edit-distance | ||
This package is ESM only: Node 12+ is needed to use it and it must be `import`ed | ||
instead of `require`d. | ||
[npm][]: | ||
@@ -23,18 +26,21 @@ | ||
This package exports the following identifiers: `levenshteinEditDistance`. | ||
There is no default export. | ||
```js | ||
var levenshtein = require('levenshtein-edit-distance') | ||
import {levenshteinEditDistance} from 'levenshtein-edit-distance' | ||
levenshtein('levenshtein', 'levenshtein') // => 0 | ||
levenshtein('sitting', 'kitten') // => 3 | ||
levenshtein('gumbo', 'gambol') // => 2 | ||
levenshtein('saturday', 'sunday') // => 3 | ||
levenshteinEditDistance('levenshtein', 'levenshtein') // => 0 | ||
levenshteinEditDistance('sitting', 'kitten') // => 3 | ||
levenshteinEditDistance('gumbo', 'gambol') // => 2 | ||
levenshteinEditDistance('saturday', 'sunday') // => 3 | ||
// Case sensitive! | ||
levenshtein('DwAyNE', 'DUANE') !== levenshtein('dwayne', 'DuAnE') // => true | ||
levenshteinEditDistance('DwAyNE', 'DUANE') !== levenshtein('dwayne', 'DuAnE') // => true | ||
// Insensitive | ||
levenshtein('DwAyNE', 'DUANE', true) === levenshtein('dwayne', 'DuAnE', true) // => true | ||
levenshteinEditDistance('DwAyNE', 'DUANE', true) === levenshtein('dwayne', 'DuAnE', true) // => true | ||
// Order insensitive | ||
levenshtein('aarrgh', 'aargh') === levenshtein('aargh', 'aarrgh') // => true | ||
levenshteinEditDistance('aarrgh', 'aargh') === levenshtein('aargh', 'aarrgh') // => true | ||
``` | ||
@@ -93,5 +99,5 @@ | ||
[build-badge]: https://img.shields.io/travis/words/levenshtein-edit-distance.svg | ||
[build-badge]: https://github.com/words/levenshtein-edit-distance/workflows/main/badge.svg | ||
[build]: https://travis-ci.org/words/levenshtein-edit-distance | ||
[build]: https://github.com/words/levenshtein-edit-distance/actions | ||
@@ -98,0 +104,0 @@ [coverage-badge]: https://img.shields.io/codecov/c/github/words/levenshtein-edit-distance.svg |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
10150
6
149
122
Yes
10
2