[READ-ONLY] Mirror of https://github.com/FoxxMD/string-sameness. Compare the sameness of two strings foxxmd.github.io/string-sameness/
compare cosine-similarity dice-coefficient levenshtein-distance sameness string text typescript
0

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit

FoxxMD (Apr 4, 2023, 1:32 PM EDT) c7095119 248a7c6d

+572
+29
.github/workflows/typedoc_deploy.yml
··· 1 + # https://github.com/TypeStrong/typedoc/issues/1485#issuecomment-889376169 2 + name: Typedoc Deploy 3 + 4 + on: [push, pull_request] 5 + 6 + jobs: 7 + build_and_deploy: 8 + runs-on: ubuntu-latest 9 + steps: 10 + - name: Checkout the repository 11 + uses: actions/checkout@v3 12 + 13 + - name: Setup Node.js 14 + uses: actions/setup-node@v3 15 + with: 16 + node-version: 18.x 17 + cache: 'yarn' 18 + 19 + - run: yarn install --frozen-lockfile 20 + - run: yarn run build 21 + 22 + - name: Create the docs directory locally in CI 23 + run: npx typedoc src/index.ts 24 + 25 + - name: Deploy 🚀 26 + uses: JamesIves/github-pages-deploy-action@4.1.4 27 + with: 28 + branch: gh-pages 29 + folder: docs
+5
.gitignore
··· 1 + **/src/**/*.map 2 + **/src/**/*.js 3 + node_modules/ 4 + /.idea 5 + /docs
+1
.nvmrc
··· 1 + lts/hydrogen
+15
dist/index.d.ts
··· 1 + export declare const defaultStrCompareTransformFuncs: ((str: string) => string)[]; 2 + export interface StringComparisonOptions { 3 + transforms?: ((str: string) => string)[]; 4 + } 5 + export interface StringSamenessResult { 6 + scores: { 7 + dice: number; 8 + cosine: number; 9 + leven: number; 10 + }; 11 + highScore: number; 12 + highScoreWeighted: number; 13 + } 14 + export declare const stringSameness: (valA: string, valB: string, options?: StringComparisonOptions) => StringSamenessResult; 15 + export default stringSameness;
+54
dist/index.js
··· 1 + "use strict"; 2 + var __importDefault = (this && this.__importDefault) || function (mod) { 3 + return (mod && mod.__esModule) ? mod : { "default": mod }; 4 + }; 5 + Object.defineProperty(exports, "__esModule", { value: true }); 6 + exports.stringSameness = exports.defaultStrCompareTransformFuncs = void 0; 7 + const cosineSimilarity_js_1 = __importDefault(require("./matchingStrategies/cosineSimilarity.js")); 8 + const levenSimilarity_js_1 = __importDefault(require("./matchingStrategies/levenSimilarity.js")); 9 + const string_similarity_1 = __importDefault(require("string-similarity")); 10 + const sentenceLengthWeight = (length) => { 11 + // thanks jordan :') 12 + // constants are black magic 13 + return (Math.log(length) / 0.20) - 5; 14 + }; 15 + exports.defaultStrCompareTransformFuncs = [ 16 + // lower case to remove case sensitivity 17 + (str) => str.toLocaleLowerCase(), 18 + // remove excess whitespace 19 + (str) => str.trim(), 20 + // remove non-alphanumeric characters so that differences in punctuation don't subtract from comparison score 21 + (str) => str.replace(/[^A-Za-z0-9 ]/g, ""), 22 + // replace all instances of 2 or more whitespace with one whitespace 23 + (str) => str.replace(/\s{2,}|\n/g, " ") 24 + ]; 25 + const stringSameness = (valA, valB, options) => { 26 + const { transforms = exports.defaultStrCompareTransformFuncs, } = options || {}; 27 + const cleanA = transforms.reduce((acc, curr) => curr(acc), valA); 28 + const cleanB = transforms.reduce((acc, curr) => curr(acc), valB); 29 + const shortest = cleanA.length > cleanB.length ? cleanB : cleanA; 30 + // Dice's Coefficient 31 + const dice = string_similarity_1.default.compareTwoStrings(cleanA, cleanB) * 100; 32 + // Cosine similarity 33 + const cosine = (0, cosineSimilarity_js_1.default)(cleanA, cleanB) * 100; 34 + // Levenshtein distance 35 + const ls = (0, levenSimilarity_js_1.default)(cleanA, cleanB); 36 + const levenSimilarPercent = ls[1]; 37 + // use shortest sentence for weight 38 + const weightScore = sentenceLengthWeight(shortest.length); 39 + // take average score 40 + const highScore = (dice + cosine + levenSimilarPercent) / 3; 41 + // weight score can be a max of 15 42 + const highScoreWeighted = highScore + Math.min(weightScore, 15); 43 + return { 44 + scores: { 45 + dice, 46 + cosine, 47 + leven: levenSimilarPercent 48 + }, 49 + highScore, 50 + highScoreWeighted, 51 + }; 52 + }; 53 + exports.stringSameness = stringSameness; 54 + exports.default = exports.stringSameness;
+2
dist/matchingStrategies/CosineSimilarity.d.ts
··· 1 + declare const calculateCosineSimilarity: (strA: string, strB: string) => number; 2 + export default calculateCosineSimilarity;
+52
dist/matchingStrategies/CosineSimilarity.js
··· 1 + "use strict"; 2 + // reproduced from https://github.com/sumn2u/string-comparison/blob/master/jscosine.js 3 + // https://sumn2u.medium.com/string-similarity-comparision-in-js-with-examples-4bae35f13968 4 + Object.defineProperty(exports, "__esModule", { value: true }); 5 + function termFreqMap(str) { 6 + var words = str.split(' '); 7 + var termFreq = {}; 8 + words.forEach(function (w) { 9 + termFreq[w] = (termFreq[w] || 0) + 1; 10 + }); 11 + return termFreq; 12 + } 13 + function addKeysToDict(map, dict) { 14 + for (var key in map) { 15 + dict[key] = true; 16 + } 17 + } 18 + function termFreqMapToVector(map, dict) { 19 + var termFreqVector = []; 20 + for (var term in dict) { 21 + termFreqVector.push(map[term] || 0); 22 + } 23 + return termFreqVector; 24 + } 25 + function vecDotProduct(vecA, vecB) { 26 + var product = 0; 27 + for (var i = 0; i < vecA.length; i++) { 28 + product += vecA[i] * vecB[i]; 29 + } 30 + return product; 31 + } 32 + function vecMagnitude(vec) { 33 + var sum = 0; 34 + for (var i = 0; i < vec.length; i++) { 35 + sum += vec[i] * vec[i]; 36 + } 37 + return Math.sqrt(sum); 38 + } 39 + function cosineSimilarity(vecA, vecB) { 40 + return vecDotProduct(vecA, vecB) / (vecMagnitude(vecA) * vecMagnitude(vecB)); 41 + } 42 + const calculateCosineSimilarity = function textCosineSimilarity(strA, strB) { 43 + var termFreqA = termFreqMap(strA); 44 + var termFreqB = termFreqMap(strB); 45 + var dict = {}; 46 + addKeysToDict(termFreqA, dict); 47 + addKeysToDict(termFreqB, dict); 48 + var termFreqVecA = termFreqMapToVector(termFreqA, dict); 49 + var termFreqVecB = termFreqMapToVector(termFreqB, dict); 50 + return cosineSimilarity(termFreqVecA, termFreqVecB); 51 + }; 52 + exports.default = calculateCosineSimilarity;
+2
dist/matchingStrategies/cosineSimilarity.d.ts
··· 1 + declare const calculateCosineSimilarity: (strA: string, strB: string) => number; 2 + export default calculateCosineSimilarity;
+52
dist/matchingStrategies/cosineSimilarity.js
··· 1 + "use strict"; 2 + // reproduced from https://github.com/sumn2u/string-comparison/blob/master/jscosine.js 3 + // https://sumn2u.medium.com/string-similarity-comparision-in-js-with-examples-4bae35f13968 4 + Object.defineProperty(exports, "__esModule", { value: true }); 5 + function termFreqMap(str) { 6 + var words = str.split(' '); 7 + var termFreq = {}; 8 + words.forEach(function (w) { 9 + termFreq[w] = (termFreq[w] || 0) + 1; 10 + }); 11 + return termFreq; 12 + } 13 + function addKeysToDict(map, dict) { 14 + for (var key in map) { 15 + dict[key] = true; 16 + } 17 + } 18 + function termFreqMapToVector(map, dict) { 19 + var termFreqVector = []; 20 + for (var term in dict) { 21 + termFreqVector.push(map[term] || 0); 22 + } 23 + return termFreqVector; 24 + } 25 + function vecDotProduct(vecA, vecB) { 26 + var product = 0; 27 + for (var i = 0; i < vecA.length; i++) { 28 + product += vecA[i] * vecB[i]; 29 + } 30 + return product; 31 + } 32 + function vecMagnitude(vec) { 33 + var sum = 0; 34 + for (var i = 0; i < vec.length; i++) { 35 + sum += vec[i] * vec[i]; 36 + } 37 + return Math.sqrt(sum); 38 + } 39 + function cosineSimilarity(vecA, vecB) { 40 + return vecDotProduct(vecA, vecB) / (vecMagnitude(vecA) * vecMagnitude(vecB)); 41 + } 42 + const calculateCosineSimilarity = function textCosineSimilarity(strA, strB) { 43 + var termFreqA = termFreqMap(strA); 44 + var termFreqB = termFreqMap(strB); 45 + var dict = {}; 46 + addKeysToDict(termFreqA, dict); 47 + addKeysToDict(termFreqB, dict); 48 + var termFreqVecA = termFreqMapToVector(termFreqA, dict); 49 + var termFreqVecB = termFreqMapToVector(termFreqB, dict); 50 + return cosineSimilarity(termFreqVecA, termFreqVecB); 51 + }; 52 + exports.default = calculateCosineSimilarity;
+2
dist/matchingStrategies/levenSimilarity.d.ts
··· 1 + declare const levenSimilarity: (valA: string, valB: string) => number[]; 2 + export default levenSimilarity;
+22
dist/matchingStrategies/levenSimilarity.js
··· 1 + "use strict"; 2 + var __importDefault = (this && this.__importDefault) || function (mod) { 3 + return (mod && mod.__esModule) ? mod : { "default": mod }; 4 + }; 5 + Object.defineProperty(exports, "__esModule", { value: true }); 6 + const leven_1 = __importDefault(require("leven")); 7 + const levenSimilarity = (valA, valB) => { 8 + let longer; 9 + let shorter; 10 + if (valA.length > valB.length) { 11 + longer = valA; 12 + shorter = valB; 13 + } 14 + else { 15 + longer = valB; 16 + shorter = valA; 17 + } 18 + const distance = (0, leven_1.default)(longer, shorter); 19 + const diff = (distance / longer.length) * 100; 20 + return [distance, 100 - diff]; 21 + }; 22 + exports.default = levenSimilarity;
+37
package.json
··· 1 + { 2 + "name": "@foxxmd/string-sameness", 3 + "version": "0.1.0", 4 + "description": "determine how closely the same two strings are", 5 + "repository": "https://github.com/foxxmd/string-sameness", 6 + "author": "FoxxMD", 7 + "license": "MIT", 8 + "private": false, 9 + "engines": { 10 + "node": ">=18.0.0", 11 + "npm": ">=9.3.0" 12 + }, 13 + "main": "dist/index.js", 14 + "types": "dist/index.d.ts", 15 + "files": [ 16 + "/dist" 17 + ], 18 + "scripts": { 19 + "typedoc": "typedoc", 20 + "build": "tsc" 21 + }, 22 + "exports": { 23 + ".": "./dist/index.js", 24 + "./strategies/cosine": "./dist/cosineSimilarity.js", 25 + "./strategies/leven": "./dist/levenSimilarity.js" 26 + }, 27 + "devDependencies": { 28 + "@tsconfig/node16": "^1.0.3", 29 + "@types/string-similarity": "^4.0.0", 30 + "typedoc": "^0.23.28", 31 + "typescript": "^4.9.5" 32 + }, 33 + "dependencies": { 34 + "leven": "^4.0.0", 35 + "string-similarity": "^4.0.4" 36 + } 37 + }
+73
src/index.ts
··· 1 + import calculateCosineSimilarity from "./matchingStrategies/cosineSimilarity.js"; 2 + import levenSimilarity from "./matchingStrategies/levenSimilarity.js"; 3 + import stringSimilarity from 'string-similarity'; 4 + const sentenceLengthWeight = (length: number) => { 5 + // thanks jordan :') 6 + // constants are black magic 7 + return (Math.log(length) / 0.20) - 5; 8 + } 9 + 10 + export const defaultStrCompareTransformFuncs = [ 11 + // lower case to remove case sensitivity 12 + (str: string) => str.toLocaleLowerCase(), 13 + // remove excess whitespace 14 + (str: string) => str.trim(), 15 + // remove non-alphanumeric characters so that differences in punctuation don't subtract from comparison score 16 + (str: string) => str.replace(/[^A-Za-z0-9 ]/g, ""), 17 + // replace all instances of 2 or more whitespace with one whitespace 18 + (str: string) => str.replace(/\s{2,}|\n/g, " ") 19 + ]; 20 + 21 + export interface StringComparisonOptions { 22 + transforms?: ((str: string) => string)[] 23 + } 24 + 25 + export interface StringSamenessResult { 26 + scores: { 27 + dice: number 28 + cosine: number 29 + leven: number 30 + }, 31 + highScore: number 32 + highScoreWeighted: number 33 + } 34 + 35 + 36 + export const stringSameness = (valA: string, valB: string, options?: StringComparisonOptions): StringSamenessResult => { 37 + 38 + const { 39 + transforms = defaultStrCompareTransformFuncs, 40 + } = options || {}; 41 + 42 + const cleanA = transforms.reduce((acc, curr) => curr(acc), valA); 43 + const cleanB = transforms.reduce((acc, curr) => curr(acc), valB); 44 + 45 + const shortest = cleanA.length > cleanB.length ? cleanB : cleanA; 46 + 47 + // Dice's Coefficient 48 + const dice = stringSimilarity.compareTwoStrings(cleanA, cleanB) * 100; 49 + // Cosine similarity 50 + const cosine = calculateCosineSimilarity(cleanA, cleanB) * 100; 51 + // Levenshtein distance 52 + const ls = levenSimilarity(cleanA, cleanB); 53 + const levenSimilarPercent = ls[1]; 54 + 55 + // use shortest sentence for weight 56 + const weightScore = sentenceLengthWeight(shortest.length); 57 + 58 + // take average score 59 + const highScore = (dice + cosine + levenSimilarPercent) / 3; 60 + // weight score can be a max of 15 61 + const highScoreWeighted = highScore + Math.min(weightScore, 15); 62 + return { 63 + scores: { 64 + dice, 65 + cosine, 66 + leven: levenSimilarPercent 67 + }, 68 + highScore, 69 + highScoreWeighted, 70 + } 71 + } 72 + 73 + export default stringSameness;
+3
src/matchingStrategies/cosineSimilarity.d.ts
··· 1 + declare const calculateCosineSimilarity: (strA: string, strB: string) => number; 2 + export default calculateCosineSimilarity; 3 + //# sourceMappingURL=CosineSimilarity.d.ts.map
+70
src/matchingStrategies/cosineSimilarity.ts
··· 1 + // reproduced from https://github.com/sumn2u/string-comparison/blob/master/jscosine.js 2 + // https://sumn2u.medium.com/string-similarity-comparision-in-js-with-examples-4bae35f13968 3 + 4 + interface StrMap { 5 + [key: string]: number 6 + } 7 + 8 + interface BoolMap { 9 + [key: string]: boolean 10 + } 11 + 12 + 13 + function termFreqMap(str: string) { 14 + var words = str.split(' '); 15 + var termFreq: StrMap = {}; 16 + words.forEach(function(w) { 17 + termFreq[w] = (termFreq[w] || 0) + 1; 18 + }); 19 + return termFreq; 20 + } 21 + 22 + function addKeysToDict(map: StrMap, dict: BoolMap) { 23 + for (var key in map) { 24 + dict[key] = true; 25 + } 26 + } 27 + 28 + function termFreqMapToVector(map: StrMap, dict: StrMap): number[] { 29 + var termFreqVector = []; 30 + for (var term in dict) { 31 + termFreqVector.push(map[term] || 0); 32 + } 33 + return termFreqVector; 34 + } 35 + 36 + function vecDotProduct(vecA: number[], vecB: number[]) { 37 + var product = 0; 38 + for (var i = 0; i < vecA.length; i++) { 39 + product += vecA[i] * vecB[i]; 40 + } 41 + return product; 42 + } 43 + 44 + function vecMagnitude(vec: number[]) { 45 + var sum = 0; 46 + for (var i = 0; i < vec.length; i++) { 47 + sum += vec[i] * vec[i]; 48 + } 49 + return Math.sqrt(sum); 50 + } 51 + 52 + function cosineSimilarity(vecA: number[], vecB: number[]) { 53 + return vecDotProduct(vecA, vecB) / (vecMagnitude(vecA) * vecMagnitude(vecB)); 54 + } 55 + 56 + const calculateCosineSimilarity = function textCosineSimilarity(strA: string, strB: string) { 57 + var termFreqA = termFreqMap(strA); 58 + var termFreqB = termFreqMap(strB); 59 + 60 + var dict = {}; 61 + addKeysToDict(termFreqA, dict); 62 + addKeysToDict(termFreqB, dict); 63 + 64 + var termFreqVecA = termFreqMapToVector(termFreqA, dict); 65 + var termFreqVecB = termFreqMapToVector(termFreqB, dict); 66 + 67 + return cosineSimilarity(termFreqVecA, termFreqVecB); 68 + } 69 + 70 + export default calculateCosineSimilarity;
+3
src/matchingStrategies/levenSimilarity.d.ts
··· 1 + declare const levenSimilarity: (valA: string, valB: string) => number[]; 2 + export default levenSimilarity; 3 + //# sourceMappingURL=levenSimilarity.d.ts.map
+19
src/matchingStrategies/levenSimilarity.ts
··· 1 + import leven from "leven"; 2 + 3 + const levenSimilarity = (valA: string, valB: string) => { 4 + let longer: string; 5 + let shorter: string; 6 + if (valA.length > valB.length) { 7 + longer = valA; 8 + shorter = valB; 9 + } else { 10 + longer = valB; 11 + shorter = valA; 12 + } 13 + 14 + const distance = leven(longer, shorter); 15 + const diff = (distance / longer.length) * 100; 16 + return [distance, 100 - diff]; 17 + } 18 + 19 + export default levenSimilarity;
+17
tsconfig.json
··· 1 + { 2 + "extends": "@tsconfig/node16/tsconfig.json", 3 + "compilerOptions": { 4 + "module": "commonjs", 5 + "declaration": true, 6 + "outDir": "./dist" 7 + }, 8 + "typeRoots": [ 9 + "./src/types.d.ts" 10 + ], 11 + "include": [ 12 + "src/**/*" 13 + ], 14 + "exclude": [ 15 + "node_modules" 16 + ] 17 + }
+17
typedoc.json
··· 1 + { 2 + "$schema": "https://typedoc.org/schema.json", 3 + "name": "FoxxMD Common Libs", 4 + "entryPoints": ["./src"], 5 + "sort": ["source-order"], 6 + "categorizeByGroup": false, 7 + "searchGroupBoosts": { 8 + "Functions": 1.5 9 + }, 10 + "navigationLinks": { 11 + "Docs": "https://github.com/foxxmd/common-libs", 12 + "GitHub": "https://github.com/foxxmd/common-libs" 13 + }, 14 + "sidebarLinks": { 15 + "API": "https://typedoc.org/api" 16 + } 17 + }
+97
yarn.lock
··· 1 + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 + # yarn lockfile v1 3 + 4 + 5 + "@tsconfig/node16@^1.0.3": 6 + version "1.0.3" 7 + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 8 + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 9 + 10 + "@types/string-similarity@^4.0.0": 11 + version "4.0.0" 12 + resolved "https://registry.yarnpkg.com/@types/string-similarity/-/string-similarity-4.0.0.tgz#8cc03d5d1baad2b74530fe6c7d849d5768d391ad" 13 + integrity sha512-dMS4S07fbtY1AILG/RhuwmptmzK1Ql8scmAebOTJ/8iBtK/KI17NwGwKzu1uipjj8Kk+3mfPxum56kKZE93mzQ== 14 + 15 + ansi-sequence-parser@^1.1.0: 16 + version "1.1.0" 17 + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" 18 + integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== 19 + 20 + balanced-match@^1.0.0: 21 + version "1.0.2" 22 + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 23 + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 24 + 25 + brace-expansion@^2.0.1: 26 + version "2.0.1" 27 + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 28 + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 29 + dependencies: 30 + balanced-match "^1.0.0" 31 + 32 + jsonc-parser@^3.2.0: 33 + version "3.2.0" 34 + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" 35 + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== 36 + 37 + leven@^4.0.0: 38 + version "4.0.0" 39 + resolved "https://registry.yarnpkg.com/leven/-/leven-4.0.0.tgz#b9c39c803f835950fabef9e122a9b47b95708710" 40 + integrity sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw== 41 + 42 + lunr@^2.3.9: 43 + version "2.3.9" 44 + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" 45 + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 46 + 47 + marked@^4.2.12: 48 + version "4.3.0" 49 + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" 50 + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== 51 + 52 + minimatch@^7.1.3: 53 + version "7.4.5" 54 + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.5.tgz#e721f2a6faba6846f3b891ccff9966dcf728813e" 55 + integrity sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q== 56 + dependencies: 57 + brace-expansion "^2.0.1" 58 + 59 + shiki@^0.14.1: 60 + version "0.14.1" 61 + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.1.tgz#9fbe082d0a8aa2ad63df4fbf2ee11ec924aa7ee1" 62 + integrity sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw== 63 + dependencies: 64 + ansi-sequence-parser "^1.1.0" 65 + jsonc-parser "^3.2.0" 66 + vscode-oniguruma "^1.7.0" 67 + vscode-textmate "^8.0.0" 68 + 69 + string-similarity@^4.0.4: 70 + version "4.0.4" 71 + resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" 72 + integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== 73 + 74 + typedoc@^0.23.28: 75 + version "0.23.28" 76 + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.28.tgz#3ce9c36ef1c273fa849d2dea18651855100d3ccd" 77 + integrity sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w== 78 + dependencies: 79 + lunr "^2.3.9" 80 + marked "^4.2.12" 81 + minimatch "^7.1.3" 82 + shiki "^0.14.1" 83 + 84 + typescript@^4.9.5: 85 + version "4.9.5" 86 + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 87 + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 88 + 89 + vscode-oniguruma@^1.7.0: 90 + version "1.7.0" 91 + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" 92 + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== 93 + 94 + vscode-textmate@^8.0.0: 95 + version "8.0.0" 96 + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" 97 + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==