diff --git a/.prettierrc.json b/.prettierrc.json index 86272e7770d..8127dc1ead0 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -7,6 +7,12 @@ "options": { "trailingComma": "none" } + }, + { + "files": "**/src/GlobMatcher.test.ts", + "options": { + "printWidth": 180 + } } ] } diff --git a/cspell.code-workspace b/cspell.code-workspace index 995eba089a9..45c23f07718 100644 --- a/cspell.code-workspace +++ b/cspell.code-workspace @@ -41,7 +41,14 @@ "autoAttachChildProcesses": true, "skipFiles": ["/**", "**/node_modules/**"], "program": "${workspaceRoot:cspell-monorepo}/node_modules/vitest/vitest.mjs", - "args": ["run", "--test-timeout=600000", "${relativeFile}"], + "args": [ + "run", + "--testTimeout=600000", + "--hideSkippedTests", + "--reporter=basic", + "--no-file-parallelism", + "${relativeFile}" + ], "cwd": "${fileWorkspaceFolder}", "smartStep": true, "console": "integratedTerminal" diff --git a/packages/cspell-gitignore/package.json b/packages/cspell-gitignore/package.json index 456c87ca369..5145e5a67bc 100644 --- a/packages/cspell-gitignore/package.json +++ b/packages/cspell-gitignore/package.json @@ -53,7 +53,9 @@ "node": ">=18" }, "dependencies": { + "@cspell/url": "workspace:*", "cspell-glob": "workspace:*", + "cspell-io": "workspace:*", "find-up-simple": "^1.0.0" } } diff --git a/packages/cspell-gitignore/src/GitIgnore.test.ts b/packages/cspell-gitignore/src/GitIgnore.test.ts index 4e13f0e242c..83ced33b3cd 100644 --- a/packages/cspell-gitignore/src/GitIgnore.test.ts +++ b/packages/cspell-gitignore/src/GitIgnore.test.ts @@ -1,15 +1,25 @@ import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { describe, expect, test } from 'vitest'; import { GitIgnore } from './GitIgnore.js'; -const pkg = path.resolve(__dirname, '..'); -const packages = path.resolve(pkg, '..'); -const gitRoot = path.resolve(packages, '..'); -const samples = path.resolve(pkg, 'samples'); -const pkgCSpellLib = path.join(packages, 'cspell-lib'); -const gitIgnoreFile = path.resolve(gitRoot, '.gitignore'); +const dirUrl = new URL('.', import.meta.url); + +const pkgUrl = new URL('../', dirUrl); +const packagesUrl = new URL('../', pkgUrl); +const gitRootUrl = new URL('../', packagesUrl); +const samplesUrl = new URL('samples/', pkgUrl); +const pkgCSpellLibUrl = new URL('cspell-lib/', packagesUrl); +const gitIgnoreFileUrl = new URL('.gitignore', gitRootUrl); + +const pkg = fileURLToPath(pkgUrl); +const packages = fileURLToPath(packagesUrl); +const gitRoot = fileURLToPath(gitRootUrl); +const samples = fileURLToPath(samplesUrl); +const pkgCSpellLib = fileURLToPath(pkgCSpellLibUrl); +const gitIgnoreFile = fileURLToPath(gitIgnoreFileUrl); // const pathSamples = path.resolve(pkg, 'samples'); // const gitIgnoreSamples = path.resolve(pathSamples, '.gitignore'); @@ -58,12 +68,23 @@ describe('GitIgnoreServer', () => { file | roots | expected ${__filename} | ${undefined} | ${undefined} ${p(samples, 'ignored/keepme.md')} | ${undefined} | ${undefined} - ${p(samples, 'ignored/file.txt')} | ${undefined} | ${{ glob: 'ignored/**', matched: true, line: 3, root: samples, gitIgnoreFile: p(samples, '.gitignore') }} - ${p(pkg, 'node_modules/bin')} | ${undefined} | ${oc({ glob: 'node_modules/', matched: true, root: gitRoot, gitIgnoreFile: gitIgnoreFile })} + ${p(samples, 'ignored/file.txt')} | ${undefined} | ${{ glob: 'ignored/**', matched: true, line: 3, root: pr(samples), gitIgnoreFile: p(samples, '.gitignore') }} + ${p(pkg, 'node_modules/bin')} | ${undefined} | ${oc({ glob: 'node_modules/', matched: true, root: pr(gitRoot), gitIgnoreFile: gitIgnoreFile })} + ${p(pkg, 'node_modules/')} | ${undefined} | ${oc({ glob: 'node_modules/', matched: true, root: pr(gitRoot), gitIgnoreFile: gitIgnoreFile })} ${__filename} | ${[p(samples, 'ignored')]} | ${undefined} ${p(samples, 'ignored/keepme.md')} | ${[p(samples, 'ignored')]} | ${undefined} ${p(samples, 'ignored/file.txt')} | ${[p(samples, 'ignored')]} | ${undefined} - ${p(pkg, 'node_modules/bin')} | ${[p(samples, 'ignored')]} | ${oc({ glob: 'node_modules/', matched: true, root: gitRoot, gitIgnoreFile: gitIgnoreFile })} + ${p(pkg, 'node_modules/bin')} | ${[p(samples, 'ignored')]} | ${oc({ glob: 'node_modules/', matched: true, root: pr(gitRoot), gitIgnoreFile: gitIgnoreFile })} + `('isIgnoredEx $file $roots', async ({ file, roots, expected }) => { + const dir = path.dirname(file); + const gs = new GitIgnore(roots); + const r = await gs.findGitIgnoreHierarchy(dir); + expect(r.isIgnoredEx(file)).toEqual(expected); + }); + + test.each` + file | roots | expected + ${p(pkg, 'node_modules/')} | ${undefined} | ${oc({ glob: 'node_modules/', matched: true, root: pr(gitRoot), gitIgnoreFile: gitIgnoreFile })} `('isIgnoredEx $file $roots', async ({ file, roots, expected }) => { const dir = path.dirname(file); const gs = new GitIgnore(roots); @@ -77,6 +98,7 @@ describe('GitIgnoreServer', () => { p(samples, 'ignored/keepme.md'), p(samples, 'ignored/file.txt'), p(pkg, 'node_modules/bin'), + p(pkg, 'node_modules/'), ]; const gs = new GitIgnore(); const r = await gs.filterOutIgnored(files); @@ -118,4 +140,8 @@ describe('GitIgnoreServer', () => { function p(dir: string, ...dirs: string[]) { return path.join(dir, ...dirs); } + + function pr(...dirs: string[]) { + return path.join(path.resolve(...dirs), './'); + } }); diff --git a/packages/cspell-gitignore/src/GitIgnoreFile.test.ts b/packages/cspell-gitignore/src/GitIgnoreFile.test.ts index ad2ab7c8683..1b8c7b1f309 100644 --- a/packages/cspell-gitignore/src/GitIgnoreFile.test.ts +++ b/packages/cspell-gitignore/src/GitIgnoreFile.test.ts @@ -1,4 +1,5 @@ import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { GlobMatcher } from 'cspell-glob'; import { describe, expect, test } from 'vitest'; @@ -7,8 +8,9 @@ import { __testing__, GitIgnoreFile, GitIgnoreHierarchy, loadGitIgnore } from '. const { mustBeHierarchical } = __testing__; +const __dirname = fileURLToPath(new URL('./', import.meta.url)); const pathPackage = path.resolve(__dirname, '..'); -const pathRepo = path.resolve(pathPackage, '../..'); +const pathRepo = path.join(path.resolve(pathPackage, '../..'), './'); const gitIgnoreFile = path.resolve(pathRepo, '.gitignore'); const oc = (obj: unknown) => expect.objectContaining(obj); diff --git a/packages/cspell-gitignore/src/__snapshots__/app.test.ts.snap b/packages/cspell-gitignore/src/__snapshots__/app.test.ts.snap index 632f982abdf..d8ec16936ed 100644 --- a/packages/cspell-gitignore/src/__snapshots__/app.test.ts.snap +++ b/packages/cspell-gitignore/src/__snapshots__/app.test.ts.snap @@ -29,6 +29,10 @@ exports[`app > app.run [ '../node_modules' ] 1`] = `".gitignore:50:node_modules/ exports[`app > app.run [ '../node_modules' ] 2`] = `""`; +exports[`app > app.run [ '../node_modules/.bin/run.mjs' ] 1`] = `".gitignore:50:node_modules/ ../node_modules/.bin/run.mjs"`; + +exports[`app > app.run [ '../node_modules/.bin/run.mjs' ] 2`] = `""`; + exports[`app > app.run [ '-r', '.' ] 1`] = `""`; exports[`app > app.run [ '-r', '.' ] 2`] = `"Missing files"`; diff --git a/packages/cspell-gitignore/src/app.test.ts b/packages/cspell-gitignore/src/app.test.ts index dd0aabb9146..7fdc01a6aa8 100644 --- a/packages/cspell-gitignore/src/app.test.ts +++ b/packages/cspell-gitignore/src/app.test.ts @@ -22,6 +22,7 @@ describe('app', () => { params ${[path.basename(__dirname) + '/code.ts']} ${['../node_modules']} + ${['../node_modules/.bin/run.mjs']} ${['-r', '.', 'dist']} ${['temp']} ${['-r', '.', 'temp']} diff --git a/packages/cspell-gitignore/src/app.ts b/packages/cspell-gitignore/src/app.ts index 3202a16ed7b..2a281e48c1b 100644 --- a/packages/cspell-gitignore/src/app.ts +++ b/packages/cspell-gitignore/src/app.ts @@ -40,8 +40,9 @@ export async function run(args: string[]): Promise { for (const file of files) { const filename = path.relative(cwd, file); const pFile = gi.isIgnoredEx(file); - const pDir = gi.isIgnoredEx(file + '/ '); + const pDir = gi.isIgnoredEx(file + '/'); const r = (await pFile) || (await pDir); + console.warn('%o', { pFile: await pFile, pDir: await pDir }); const gitignore = r?.gitIgnoreFile ? path.relative(repo, r.gitIgnoreFile) : ''; const line = r?.line || ''; const glob = r?.glob || ''; diff --git a/packages/cspell-gitignore/tsconfig.esm.json b/packages/cspell-gitignore/tsconfig.esm.json deleted file mode 100644 index 54835c32c5c..00000000000 --- a/packages/cspell-gitignore/tsconfig.esm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.esm.json", - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "dist/compile.esm.tsbuildInfo", - "rootDir": "src", - "outDir": "dist", - "types": ["node"] - }, - "include": ["src"] -} diff --git a/packages/cspell-gitignore/tsconfig.json b/packages/cspell-gitignore/tsconfig.json index 635469e894c..30891b89672 100644 --- a/packages/cspell-gitignore/tsconfig.json +++ b/packages/cspell-gitignore/tsconfig.json @@ -1,4 +1,9 @@ { - "files": [], - "references": [{ "path": "./tsconfig.esm.json" }] + "extends": "../../tsconfig.esm.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "types": ["node"] + }, + "include": ["src"] } diff --git a/packages/cspell-glob/package.json b/packages/cspell-glob/package.json index 13fabd0ac12..df717e880df 100644 --- a/packages/cspell-glob/package.json +++ b/packages/cspell-glob/package.json @@ -11,11 +11,11 @@ "license": "MIT", "type": "module", "sideEffects": false, - "types": "dist/esm/index.d.ts", - "module": "dist/esm/index.js", + "types": "dist/index.d.ts", + "module": "dist/index.js", "exports": { ".": { - "import": "./dist/esm/index.js" + "import": "./dist/index.js" } }, "files": [ @@ -25,18 +25,22 @@ "!**/__mocks__", "!**/test/**", "!**/*.test.*", + "!**/perf/**", + "!**/*.perf.*", "!**/*.spec.*", "!**/*.map" ], "scripts": { "clean": "shx rm -rf dist temp coverage \"*.tsbuildInfo\"", - "build": "tsc -b . -f", - "build:esm": "tsc -p tsconfig.esm.json", + "build": "tsc -p .", "clean-build": "pnpm run clean && pnpm run build", "coverage": "vitest run --coverage", + "test:perf": "insight --file \"dist/perf/**/*.perf.{mjs,js}\" -t 1000", + "test:perf:ts": "insight --register ts-node/esm --file \"src/perf/**/*.perf.{mts,ts}\" -t 1000", + "test:perf:prof": "NODE_ENV=production node --cpu-prof ../../node_modules/perf-insight/bin.mjs --file \"dist/perf/**/*.perf.{mjs,js}\" -t 1000", "test:watch": "vitest", "test": "vitest run", - "watch": "tsc -b . -w -f" + "watch": "tsc -p . -w" }, "repository": { "type": "git", @@ -50,6 +54,7 @@ "node": ">=18" }, "dependencies": { + "@cspell/url": "workspace:*", "micromatch": "^4.0.7" }, "devDependencies": { diff --git a/packages/cspell-glob/src/GlobMatcher.test.ts b/packages/cspell-glob/src/GlobMatcher.test.ts index 5e5324f2563..f64dd13ac62 100644 --- a/packages/cspell-glob/src/GlobMatcher.test.ts +++ b/packages/cspell-glob/src/GlobMatcher.test.ts @@ -1,18 +1,14 @@ import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { FileUrlBuilder } from '@cspell/url'; import mm from 'micromatch'; import { describe, expect, test } from 'vitest'; +import { fileOrGlobToGlob } from './globHelper.js'; import type { GlobMatchOptions, MatcherMode } from './GlobMatcher.js'; import { GlobMatcher } from './GlobMatcher.js'; -import type { - GlobMatch, - GlobPattern, - GlobPatternNormalized, - GlobPatternWithOptionalRoot, - PathInterface, -} from './GlobMatcherTypes.js'; +import type { GlobMatch, GlobPattern, GlobPatternNormalized, GlobPatternWithOptionalRoot, PathInterface } from './GlobMatcherTypes.js'; const defaultCwdWin32 = 'C:\\user\\home\\project\\testing'; const defaultCwdPosix = '/user/home/project/testing'; @@ -28,31 +24,56 @@ const pathPosix: PathInterface = { }; const __filename = fileURLToPath(import.meta.url); +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +const gitRoot = path.join(__dirname, '../../../'); const pathNames = new Map([ [pathWin32, 'Win32'], [pathPosix, 'Posix'], ]); +function r(...parts: string[]) { + return path.resolve(...parts); +} + describe('Validate assumptions', () => { - test('path relative', () => { - const relCrossDevice = path.win32.relative('C:\\user\\home\\project', 'D:\\projects'); - expect(relCrossDevice).toEqual('D:\\projects'); - const relSubDir = path.win32.relative('/User/home/project', '/User/home/project/fun/with/coding'); - expect(relSubDir).toBe(path.win32.normalize('fun/with/coding')); - const relSubDirPosix = path.posix.relative('/User/home/project', '/User/home/project/fun/with/coding'); - expect(relSubDirPosix).toBe(path.posix.normalize('fun/with/coding')); + test.each` + a | b | path | expected + ${'C:\\user\\home\\project'} | ${'D:\\projects'} | ${path.win32} | ${'D:\\projects'} + ${'/User/home/project'} | ${'/User/home/project/fun/with/coding'} | ${path.win32} | ${'fun\\with\\coding'} + ${'/User/home/project'} | ${'/User/home/project/fun/with/coding'} | ${path.posix} | ${'fun/with/coding'} + `('path relative $a $b', ({ a, b, path, expected }) => { + expect(path.relative(a, b)).toBe(expected); + }); + + test.each` + a | b | path | expected + ${'C:\\user\\home\\project'} | ${'D:\\projects'} | ${path.win32} | ${'/D:/projects'} + ${'/User/home/project'} | ${'/User/home/project/fun/with/coding'} | ${path.win32} | ${'fun/with/coding'} + ${'/User/home/project'} | ${'/User/home/project/fun/with/coding'} | ${path.posix} | ${'fun/with/coding'} + ${'/User/home/project/'} | ${'/User/home/project/fun/with/coding'} | ${path.win32} | ${'fun/with/coding'} + ${'/User/home/project/'} | ${'/User/home/project/fun/with/coding'} | ${path.posix} | ${'fun/with/coding'} + ${'/User/home/project'} | ${'/User/home/assignments/fun/with/coding'} | ${path.win32} | ${'../assignments/fun/with/coding'} + ${'/User/home/project'} | ${'/User/home/assignments/fun/with/coding'} | ${path.posix} | ${'../assignments/fun/with/coding'} + ${'/User/home/project'} | ${'/User/home/d#/fun/with/coding'} | ${path.posix} | ${'../d#/fun/with/coding'} + ${'/User/home/project'} | ${'/User/home/d#/fun with/coding'} | ${path.win32} | ${'../d#/fun with/coding'} + `('path relative $a $b', ({ a, b, path, expected }) => { + const builder = new FileUrlBuilder({ path }); + expect(builder.relative(builder.toFileDirURL(a), builder.toFileURL(b))).toBe(expected); }); - test('path parse', () => { - const res1 = path.win32.parse('/user/home/project'); - expect(res1.root).toBe('/'); - const res2 = path.win32.parse('user/home/project'); - expect(res2.root).toBe(''); - const res3 = path.win32.parse('C:\\user\\home\\project'); - expect(res3.root).toBe('C:\\'); - const res4 = path.win32.parse('C:user\\home\\project'); - expect(res4.root).toBe('C:'); + test.each` + filepath | expected + ${'/user/home/project'} | ${'/'} + ${'user/home/project'} | ${''} + ${'C:\\user\\home\\project'} | ${'C:\\'} + ${'C:/user/home/project'} | ${'C:/'} + ${'c:/user/home/project'} | ${'c:/'} + ${'C:user\\home\\project'} | ${'C:'} + `('path parse $filepath', ({ filepath, expected }) => { + const res = path.win32.parse(filepath); + expect(res.root).toBe(expected); }); }); @@ -70,6 +91,10 @@ describe('Validate Micromatch assumptions', () => { ${'**/temp'} | ${'/src/temp/data.json'} | ${false} ${'**/temp/'} | ${'/src/temp/data.json'} | ${false} ${'**/temp/**'} | ${'/src/temp/data.json'} | ${true} + ${'**/temp/**'} | ${'temp'} | ${true} + ${'**/temp/**'} | ${'temp/'} | ${true} + ${'**/temp/*'} | ${'temp/ '} | ${true} + ${'**/temp/*'} | ${'temp/'} | ${false} ${'src/*.json'} | ${'src/settings.json'} | ${true} ${'**/{*.json,*.json/**}'} | ${'settings.json'} | ${true} ${'**/{*.json,*.json/**}'} | ${'/settings.json'} | ${true} @@ -83,14 +108,11 @@ describe('Validate Micromatch assumptions', () => { ${'src/*.(test|spec).ts'} | ${'src/test.ts'} | ${false} ${filenameToGlob(__filename, 1)} | ${__filename} | ${true} ${filenameToGlob(__filename, 2)} | ${__filename} | ${true} - `( - `Micromatch glob: '$glob', filename: '$filename' expected: $expectedToMatch`, - ({ glob, filename, expectedToMatch }) => { - const reg = mm.makeRe(glob); - expect(reg.test(filename)).toEqual(expectedToMatch); - expect(mm.isMatch(filename, glob, { windows: path.sep === '\\' })).toBe(expectedToMatch); - }, - ); + `(`Micromatch glob: '$glob', filename: '$filename' expected: $expectedToMatch`, ({ glob, filename, expectedToMatch }) => { + const reg = mm.makeRe(glob); + expect(reg.test(filename)).toEqual(expectedToMatch); + expect(mm.isMatch(filename, glob, { windows: path.sep === '\\' })).toBe(expectedToMatch); + }); }); function resolveFilename(pathInstance: PathInterface, filename: string): string; @@ -114,14 +136,12 @@ function resolveFilename(pathInstance: PathInterface, filename: string | undefin const [patterns, _root, _filename, expected, description] = curTest; const root = resolveFilename(pathInstance, _root); const filename = resolveFilename(pathInstance, _filename); - test(`test ${index} ${description}, pattern: [${patterns}] filename: "${filename}", root: "${root}", expected: ${ - expected ? 'T' : 'F' - }`, () => { + test(`test ${index} ${description}, pattern: [${patterns}] filename: "${filename}", root: "${root}", expected: ${expected ? 'T' : 'F'}`, () => { const matcher = new GlobMatcher(patterns, root, pathInstance); try { expect(matcher.match(filename)).toEqual(expected); } catch (e) { - console.error('Failed on %i %o', index, curTest); + console.error('Failed on %i %o', index, { curTest, m_patterns: matcher.patterns, filename }); throw e; } }); @@ -397,18 +417,15 @@ describe('Validate GlobMatcher', () => { ${g('*.js', 'a/b')} | ${'a'} | ${'a/b/settings.js'} | ${'include'} | ${true} | ${'Matches files, *.js'} ${g('*.js', 'a/b')} | ${'a'} | ${'a/settings.js'} | ${'include'} | ${false} | ${'Does not match parent files, *.js'} ${g('*.js', 'a')} | ${'a/b'} | ${'a/b/src/settings.js'} | ${'include'} | ${false} | ${'Does not match nested files, *.js'} - `( - `${os} $mode: $description, patterns: $patterns, filename: $filename, root: $root, $expected`, - ({ filename, root, patterns, mode, expected }: TestCaseMatcher) => { - root = resolveFilename(pathInstance, root); - filename = resolveFilename(pathInstance, filename); - patterns = resolvePattern(patterns, pathInstance); - // console.log(`root: ${root}, filename: ${filename}, pattern: ${JSON.stringify(patterns)}`); - const matcher = new GlobMatcher(patterns, { mode, root, nodePath: pathInstance }); - - expect(matcher.match(filename)).toEqual(expected); - }, - ); + `(`${os} $mode: $description, patterns: $patterns, filename: $filename, root: $root, $expected`, ({ filename, root, patterns, mode, expected }: TestCaseMatcher) => { + root = resolveFilename(pathInstance, root); + filename = resolveFilename(pathInstance, filename); + patterns = resolvePattern(patterns, pathInstance); + // console.log(`root: ${root}, filename: ${filename}, pattern: ${JSON.stringify(patterns)}`); + const matcher = new GlobMatcher(patterns, { mode, root, nodePath: pathInstance }); + + expect(matcher.match(filename)).toEqual(expected); + }); } [pathWin32, pathPosix].forEach(runTestOn); @@ -426,7 +443,7 @@ describe('Validate GlobMatcher excludeMode patternsNormalizedToRoot', () => { const { root, rawRoot, ...rest } = g; const gg: Partial = {}; if (root !== undefined) { - gg.root = path.resolve(root); + gg.root = path.normalize(path.resolve(root) + '/'); } if (rawRoot !== undefined) { gg.rawRoot = path.resolve(rawRoot); @@ -459,35 +476,107 @@ describe('Validate GlobMatcher excludeMode patternsNormalizedToRoot', () => { ${'*.json'} | ${''} | ${'exclude'} | ${pathWin32} | ${expectedGlobs['*.json']} ${'*.json\n *.js'} | ${''} | ${'exclude'} | ${pathWin32} | ${[...expectedGlobs['*.json'], ...expectedGlobs['*.js']]} ${g('*.js', 'a')} | ${''} | ${'exclude'} | ${pathWin32} | ${gc(expectedGlobs['a/**/*.js'], { root: '' })} - ${g('*.js', 'a')} | ${'a'} | ${'exclude'} | ${pathWin32} | ${gc(expectedGlobs['*.js'], { root: 'a' })} - ${g('*.js', 'a')} | ${'a/b'} | ${'exclude'} | ${pathWin32} | ${gc(expectedGlobs['*.js'], { root: 'a/b' })} + ${g('*.js', 'a')} | ${'a'} | ${'exclude'} | ${pathWin32} | ${gc(expectedGlobs['*.js'], { root: 'a/' })} + ${g('*.js', 'a')} | ${'a/b'} | ${'exclude'} | ${pathWin32} | ${gc(expectedGlobs['*.js'], { root: 'a/b/' })} ${g('*.js', 'a/c')} | ${'a/b'} | ${'exclude'} | ${pathWin32} | ${[]} ${g('*.js', 'a/c')} | ${'a/b'} | ${'include'} | ${pathWin32} | ${[]} - `( - 'excludeMode patternsNormalizedToRoot $patterns $root', - ({ patterns, root, pathInstance, expected, mode }: TestCaseNormalizedToRoot) => { - root = resolveFilename(pathInstance, root); - patterns = resolvePattern(patterns, pathInstance); - const matcher = new GlobMatcher(patterns, { mode, root, nodePath: pathInstance }); - expected = expected.map((e) => ocg(e, pathInstance)); - expect(matcher.patternsNormalizedToRoot).toEqual(expected); - }, - ); + `('excludeMode patternsNormalizedToRoot $patterns $root', ({ patterns, root, pathInstance, expected, mode }: TestCaseNormalizedToRoot) => { + root = resolveFilename(pathInstance, root); + patterns = resolvePattern(patterns, pathInstance); + const matcher = new GlobMatcher(patterns, { mode, root, nodePath: pathInstance }); + expected = expected.map((e) => ocg(e, pathInstance)); + expect(matcher.patternsNormalizedToRoot).toEqual(expected); + }); +}); + +describe('normalizing globs', () => { + interface TestMapGlobToRoot { + glob: string; + globRoot: string; + root: string; + expectedGlobs: string[]; + file: string; + expectedToMatch: boolean; + } + + test.each` + glob | globRoot | root | expectedGlobs | file | expectedToMatch + ${'src/*.json'} | ${'.'} | ${'./project/p2'} | ${[]} | ${''} | ${false} + ${'**'} | ${'.'} | ${'.'} | ${['**']} | ${'./package.json'} | ${true} + ${'*.json'} | ${'.'} | ${'.'} | ${['**/*.json', '**/*.json/**']} | ${'./package.json'} | ${true} + ${'*.json'} | ${'.'} | ${'.'} | ${['**/*.json', '**/*.json/**']} | ${'./.git/package.json'} | ${true} + ${'*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/**/*.json', 'project/p1/**/*.json/**']} | ${'./project/p1/package.json'} | ${true} + ${'*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/**/*.json', 'project/p1/**/*.json/**']} | ${'./project/p1/src/package.json'} | ${true} + ${'*.json'} | ${'.'} | ${'./project/p2'} | ${['**/*.json', '**/*.json/**']} | ${'./project/p2/package.json'} | ${true} + ${'src/*.json'} | ${'.'} | ${'./project/p2'} | ${[]} | ${''} | ${false} + ${'**/src/*.json'} | ${'.'} | ${'./project/p2'} | ${['**/src/*.json', '**/src/*.json/**']} | ${'./project/p2/x/src/config.json'} | ${true} + ${'**/src/*.json'} | ${'./project/p1'} | ${'.'} | ${['**/src/*.json', '**/src/*.json/**']} | ${'./project/p1/src/config.json'} | ${true} + ${'/**/src/*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/**/src/*.json', 'project/p1/**/src/*.json/**']} | ${'./project/p1/src/config.json'} | ${true} + ${'/docs/types/cspell-types'} | ${gitRoot} | ${gitRoot} | ${['docs/types/cspell-types', 'docs/types/cspell-types/**']} | ${r(gitRoot, './docs/types/cspell-types/assets/main.js')} | ${true} + `('mapGlobToRoot exclude "$glob"@"$globRoot" -> "$root" = "$expectedGlobs"', ({ glob, globRoot, root, expectedGlobs, file, expectedToMatch }: TestMapGlobToRoot) => { + globRoot = path.resolve(globRoot); + root = path.resolve(root); + file = path.resolve(file); + const globMatcher = new GlobMatcher(glob, { + root: globRoot, + mode: 'exclude', + }); + const patterns = globMatcher.patterns.map((g) => g); + const r = normalizeGlobsToRoot(patterns, root, true); + expect(r).toEqual(expectedGlobs); + + expect(globMatcher.match(file)).toBe(expectedToMatch); + }); + + test.each` + glob | globRoot | root | expectedGlobs | file | expectedToMatch + ${'*.json'} | ${'.'} | ${'.'} | ${['*.json']} | ${'./package.json'} | ${true} + ${'*.json'} | ${'.'} | ${'.'} | ${['*.json']} | ${'./.git/package.json'} | ${false} + ${'*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/*.json']} | ${'./project/p1/package.json'} | ${true} + ${'*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/*.json']} | ${'./project/p1/src/package.json'} | ${false} + ${'*.json'} | ${'.'} | ${'./project/p2'} | ${[]} | ${'./project/p2/package.json'} | ${false} + ${'/**/*.json'} | ${'.'} | ${'./project/p2'} | ${['**/*.json']} | ${'./project/p2/package.json'} | ${true} + ${'**/*.json'} | ${'.'} | ${'./project/p2'} | ${['**/*.json']} | ${'./project/p2/package.json'} | ${true} + ${'src/*.json'} | ${'.'} | ${'./project/p2'} | ${[]} | ${''} | ${false} + ${'**/src/*.json'} | ${'.'} | ${'./project/p2'} | ${['**/src/*.json']} | ${'./project/p2/x/src/config.json'} | ${true} + ${'**/src/*.json'} | ${'./project/p1'} | ${'.'} | ${['**/src/*.json']} | ${'./project/p1/src/config.json'} | ${true} + ${'/**/src/*.json'} | ${'./project/p1'} | ${'.'} | ${['project/p1/**/src/*.json']} | ${'./project/p1/src/config.json'} | ${true} + `('mapGlobToRoot include "$glob"@"$globRoot" -> "$root" = "$expectedGlobs"', ({ glob, globRoot, root, expectedGlobs, file, expectedToMatch }: TestMapGlobToRoot) => { + globRoot = path.resolve(globRoot); + root = path.resolve(root); + file = path.resolve(file); + const globMatcher = new GlobMatcher(glob, { + root: globRoot, + mode: 'include', + }); + const patterns = globMatcher.patterns.map((g) => g); + const r = normalizeGlobsToRoot(patterns, root, false); + expect(r).toEqual(expectedGlobs); + + expect(globMatcher.match(file)).toBe(expectedToMatch); + }); }); -type TestCase = [ - patterns: string[] | string, - root: string | undefined, - filename: string, - expected: boolean, - description: string, -]; +type TestCase = [patterns: GlobPattern[] | GlobPattern, root: string | undefined, filename: string, expected: boolean, description: string]; function tests(): TestCase[] { const from = 0; const limit = 0; const testCases: TestCase[] = [ + [['node_modules/'], gitRoot, r(__dirname, 'node_modules/p/index.js'), true, 'node_modules/'], + [['node_modules/'], gitRoot, r(__dirname, 'node_modules/'), false, 'node_modules/'], + [['node_modules/'], gitRoot, r(__dirname, 'project/node_modules/p/index.js'), true, 'node_modules/'], + [['package.json'], gitRoot, r(__dirname, 'project/package.json'), true, 'package.json'], + [{ glob: 'node_modules/', root: '${cwd}' }, gitRoot, 'node_modules/p/index.js', true, 'node_modules/'], + [{ glob: 'node_modules/', root: '${cwd}' }, gitRoot, 'node_modules/', false, 'node_modules/'], + [{ glob: 'node_modules/', root: '${cwd}' }, gitRoot, 'project/node_modules/p/index.js', true, 'node_modules/'], + [{ glob: 'package.json', root: '${cwd}' }, gitRoot, 'project/package.json', true, 'package.json'], + [['${cwd}/node_modules/'], gitRoot, 'node_modules/p/index.js', true, 'node_modules/'], + [['${cwd}/node_modules/'], gitRoot, 'node_modules/', false, 'node_modules/'], + [['${cwd}/node_modules/'], gitRoot, 'node_modules/cspell/', true, 'node_modules/'], + [['${cwd}/node_modules/'], gitRoot, 'project/node_modules/p/index.js', false, 'node_modules/'], + [['${cwd}/package.json'], gitRoot, 'package.json', true, 'package.json'], [['*.json'], undefined, './settings.json', true, '*.json'], [['*.json'], undefined, 'settings.json', true, '*.json'], [['*.json'], undefined, '${cwd}/settings.json', true, '*.json'], @@ -521,44 +610,14 @@ function tests(): TestCase[] { // With Root [['*.json'], '/User/code/src', '/User/code/src/settings.json', true, 'With Root *.json'], [['.vscode'], '/User/code/src', '/User/code/src/.vscode/settings.json', true, 'With Root .vscode'], - [ - ['/*.json'], - '/User/code/src', - '/User/code/src/settings.json', - true, - 'With Root Matches only root level files, /*.json', - ], // . + [['/*.json'], '/User/code/src', '/User/code/src/settings.json', true, 'With Root Matches only root level files, /*.json'], // . [['*.js'], '/User/code/src', '/User/code/src/src/settings.js', true, 'With Root Matches nested files, *.js'], [['.vscode/'], '/User/code/src', '/User/code/src/.vscode/settings.json', true, 'With Root .vscode/'], [['.vscode/'], '/User/code/src', '/User/code/src/.vscode', false, 'With Root .vscode/'], // This one shouldn't match, but micromatch says it should. :-( - [ - ['.vscode/'], - '/User/code/src', - '/User/code/src/src/.vscode/settings.json', - true, - 'With Root should match nested .vscode/', - ], - [ - ['**/.vscode/'], - '/User/code/src', - '/User/code/src/src/.vscode/settings.json', - true, - 'With Root should match nested .vscode/', - ], - [ - ['/User/user/Library/**'], - '/User/code/src', - '/src/User/user/Library/settings.json', - false, - 'With Root No match', - ], - [ - ['/User/user/Library/**'], - '/User/code/src', - '/User/user/Library/settings.json', - false, - 'File has but does not match root', - ], + [['.vscode/'], '/User/code/src', '/User/code/src/src/.vscode/settings.json', true, 'With Root should match nested .vscode/'], + [['**/.vscode/'], '/User/code/src', '/User/code/src/src/.vscode/settings.json', true, 'With Root should match nested .vscode/'], + [['/User/user/Library/**'], '/User/code/src', '/src/User/user/Library/settings.json', false, 'With Root No match'], + [['/User/user/Library/**'], '/User/code/src', '/User/user/Library/settings.json', false, 'File has but does not match root'], [['tests/*.test.ts'], '/User/code/src', 'tests/code.test.ts', false, 'Relative file with Root'], [['tests/**/*.test.ts'], '/User/code/src', 'tests/nested/code.test.ts', false, 'Relative file with Root'], @@ -572,38 +631,14 @@ function tests(): TestCase[] { // Root with trailing / [['*.json'], '/User/code/src/', '/User/code/src/settings.json', true, '*.json'], [['.vscode'], '/User/code/src/', '/User/code/src/.vscode/settings.json', true, '.vscode'], - [ - ['/*.json'], - '/User/code/src/', - '/User/code/src/settings.json', - true, - 'Matches only root level files, /*.json', - ], // . + [['/*.json'], '/User/code/src/', '/User/code/src/settings.json', true, 'Matches only root level files, /*.json'], // . [['*.js'], '/User/code/src/', '/User/code/src/src/settings.js', true, '// Matches nested files, *.js'], [['.vscode/'], '/User/code/src/', '/User/code/src/.vscode/settings.json', true, '.vscode/'], [['.vscode/'], '/User/code/src/', '/User/code/src/.vscode', false, '.vscode/'], // This one shouldn't match, but micromatch says it should. :-( - [ - ['/.vscode/'], - '/User/code/src/', - '/User/code/src/src/.vscode/settings.json', - false, - "shouldn't match nested .vscode/", - ], - [ - ['.vscode/'], - '/User/code/src/', - '/User/code/src/src/.vscode/settings.json', - true, - 'should match nested .vscode/', - ], + [['/.vscode/'], '/User/code/src/', '/User/code/src/src/.vscode/settings.json', false, "shouldn't match nested .vscode/"], + [['.vscode/'], '/User/code/src/', '/User/code/src/src/.vscode/settings.json', true, 'should match nested .vscode/'], [['.vscode/'], '/User/code/src/', '/User/code/src/src/.vscode', false, 'should match nested file .vscode'], - [ - ['**/.vscode/'], - '/User/code/src/', - '/User/code/src/src/.vscode/settings.json', - true, - 'should match nested .vscode/', - ], + [['**/.vscode/'], '/User/code/src/', '/User/code/src/src/.vscode/settings.json', true, 'should match nested .vscode/'], [['/User/user/Library/**'], '/User/code/src/', '/src/User/user/Library/settings.json', false, 'No match'], [['/User/user/Library/**'], '/User/code/src/', '/User/user/Library/settings.json', false, 'Match system root'], @@ -711,3 +746,20 @@ function filenameToGlob(filename: string, segments: number = 1) { const parts = filename.split(path.sep).slice(-segments).join('/'); return '**/' + parts; } + +function buildGlobMatcherFromCommandLine(globs: GlobPattern[], root: string, isExclude: boolean): GlobMatcher { + const withRoots = globs.map((g) => { + const source = typeof g === 'string' ? 'command line' : undefined; + return { source, ...fileOrGlobToGlob(g, root) }; + }); + + return new GlobMatcher(withRoots, { root, mode: isExclude ? 'exclude' : 'include' }); +} + +function extractGlobsFromMatcher(globMatcher: GlobMatcher): string[] { + return globMatcher.patternsNormalizedToRoot.map((g) => g.glob); +} + +function normalizeGlobsToRoot(globs: GlobPattern[], root: string, isExclude: boolean): string[] { + return extractGlobsFromMatcher(buildGlobMatcherFromCommandLine(globs, root, isExclude)); +} diff --git a/packages/cspell-glob/src/GlobMatcher.ts b/packages/cspell-glob/src/GlobMatcher.ts index 19242cefda5..78d6a8425b0 100644 --- a/packages/cspell-glob/src/GlobMatcher.ts +++ b/packages/cspell-glob/src/GlobMatcher.ts @@ -1,8 +1,9 @@ import * as Path from 'node:path'; +import { FileUrlBuilder } from '@cspell/url'; import mm from 'micromatch'; -import { doesRootContainPath, normalizeGlobPatterns, normalizeGlobToRoot } from './globHelper.js'; +import { GlobPatterns, isRelativeValueNested, normalizeGlobPatterns, normalizeGlobToRoot } from './globHelper.js'; import type { GlobMatch, GlobPattern, @@ -89,6 +90,9 @@ export class GlobMatcher { readonly path: PathInterface; readonly patterns: GlobPatternWithRoot[]; readonly patternsNormalizedToRoot: GlobPatternNormalized[]; + /** + * path or href of the root directory. + */ readonly root: string; readonly dot: boolean; readonly options: NormalizedGlobMatchOptions; @@ -98,7 +102,7 @@ export class GlobMatcher { * @param patterns - the contents of a `.gitignore` style file or an array of individual glob rules. * @param root - the working directory */ - constructor(patterns: GlobPattern | GlobPattern[], root?: string, nodePath?: PathInterface); + constructor(patterns: GlobPattern | GlobPattern[], root?: string | URL, nodePath?: PathInterface); /** * Construct a `.gitignore` emulator @@ -106,30 +110,31 @@ export class GlobMatcher { * @param options - to set the root and other options */ constructor(patterns: GlobPattern | GlobPattern[], options?: GlobMatchOptions); - constructor(patterns: GlobPattern | GlobPattern[], rootOrOptions?: string | GlobMatchOptions); + constructor(patterns: GlobPattern | GlobPattern[], rootOrOptions?: string | URL | GlobMatchOptions); constructor( patterns: GlobPattern | GlobPattern[], - rootOrOptions?: string | GlobMatchOptions, + rootOrOptions?: string | URL | GlobMatchOptions, _nodePath?: PathInterface, ) { - _nodePath = _nodePath ?? Path; - - const options = typeof rootOrOptions === 'string' ? { root: rootOrOptions } : rootOrOptions ?? {}; - const { mode = 'exclude' } = options; + const options = + typeof rootOrOptions === 'string' || rootOrOptions instanceof URL + ? { root: rootOrOptions.toString() } + : rootOrOptions ?? {}; + const mode = options.mode ?? 'exclude'; const isExcludeMode = mode !== 'include'; - _nodePath = options.nodePath ?? _nodePath; - - const { - root = _nodePath.resolve(), - dot = isExcludeMode, - nodePath = _nodePath, - nested = isExcludeMode, - cwd = process.cwd(), - nobrace, - } = options; - - const normalizedRoot = nodePath.resolve(nodePath.normalize(root)); + const nodePath = options.nodePath ?? _nodePath ?? Path; + this.path = nodePath; + const cwd = options.cwd ?? nodePath.resolve(); + const dot = options.dot ?? isExcludeMode; + const nested = options.nested ?? isExcludeMode; + const nobrace = options.nobrace; + const root = options.root ?? nodePath.resolve(); + const builder = new FileUrlBuilder({ path: nodePath }); + + const rootURL = builder.toFileDirURL(root); + const normalizedRoot = builder.urlToFilePathOrHref(rootURL); + this.options = { root: normalizedRoot, dot, nodePath, nested, mode, nobrace, cwd }; patterns = Array.isArray(patterns) @@ -138,14 +143,14 @@ export class GlobMatcher { ? patterns.split(/\r?\n/g) : [patterns]; const globPatterns = normalizeGlobPatterns(patterns, this.options); + this.patternsNormalizedToRoot = globPatterns .map((g) => normalizeGlobToRoot(g, normalizedRoot, nodePath)) // Only keep globs that do not match the root when using exclude mode. - .filter((g) => nodePath.relative(g.root, normalizedRoot) === ''); + .filter((g) => builder.relative(builder.toFileDirURL(g.root), rootURL) === ''); this.patterns = globPatterns; this.root = normalizedRoot; - this.path = nodePath; this.dot = dot; this.matchEx = buildMatcherFn(this.patterns, this.options); } @@ -196,8 +201,11 @@ interface GlobRule { * @returns a function given a filename returns true if it matches. */ function buildMatcherFn(patterns: GlobPatternWithRoot[], options: NormalizedGlobMatchOptions): GlobMatchFn { - const { nodePath: path, dot, nobrace } = options; + // outputBuildMatcherFnPerfData(patterns, options); + const { nodePath, dot, nobrace } = options; + const builder = new FileUrlBuilder({ path: nodePath }); const makeReOptions = { dot, nobrace }; + const suffixDir = GlobPatterns.suffixDir; const rules: GlobRule[] = patterns .map((pattern, index) => ({ pattern, index })) .filter((r) => !!r.pattern.glob) @@ -207,15 +215,23 @@ function buildMatcherFn(patterns: GlobPatternWithRoot[], options: NormalizedGlob const glob = pattern.glob.replace(/^!/, ''); const isNeg = (matchNeg && matchNeg[0].length & 1 && true) || false; const reg = mm.makeRe(glob, makeReOptions); - const fn = (filename: string) => { - reg.lastIndex = 0; - return reg.test(filename); - }; + const fn = pattern.glob.endsWith(suffixDir) + ? (filename: string) => { + // Note: this is a hack to get around the limitations of globs. + // We want to match a filename with a trailing slash, but micromatch does not support it. + // So it is necessary to pretend that the filename has a space at the end. + return reg.test(filename) || (filename.endsWith('/') && reg.test(filename + ' ')); + } + : (filename: string) => { + return reg.test(filename); + }; return { pattern, index, isNeg, fn, reg }; }); const negRules = rules.filter((r) => r.isNeg); const posRules = rules.filter((r) => !r.isNeg); + const mapRoots = new Map(); + // const negRegEx = negRules.map((r) => r.reg).map((r) => r.toString()); // const posRegEx = posRules.map((r) => r.reg).map((r) => r.toString()); @@ -225,16 +241,23 @@ function buildMatcherFn(patterns: GlobPatternWithRoot[], options: NormalizedGlob // const posReg = joinRegExp(posRegEx); const fn: GlobMatchFn = (filename: string) => { - filename = path.resolve(path.normalize(filename)); - const fNameNormalize = path.sep === '\\' ? filename.replaceAll('\\', '/') : filename; - let lastRoot = '!!!!!!'; + const fileUrl = builder.toFileURL(filename); + const relFilePathname = builder.relative(new URL('file:///'), fileUrl); + let lastRoot = new URL('placeHolder://'); let lastRel = ''; - function relativeToRoot(root: string) { - if (root !== lastRoot) { + function rootToUrl(root: string): URL { + const found = mapRoots.get(root); + if (found) return found; + const url = builder.toFileDirURL(root); + mapRoots.set(root, url); + return url; + } + + function relativeToRoot(root: URL) { + if (root.href !== lastRoot.href) { lastRoot = root; - const relName = path.relative(root, filename); - lastRel = path.sep === '\\' ? relName.replaceAll('\\', '/') : relName; + lastRel = builder.relative(root, fileUrl); } return lastRel; } @@ -243,11 +266,16 @@ function buildMatcherFn(patterns: GlobPatternWithRoot[], options: NormalizedGlob for (const rule of rules) { const pattern = rule.pattern; const root = pattern.root; + const rootURL = rootToUrl(root); const isRelPat = !pattern.isGlobalPattern; - if (isRelPat && !doesRootContainPath(root, filename, path)) { - continue; + let fname = relFilePathname; + if (isRelPat) { + const relPathToFile = relativeToRoot(rootURL); + if (!isRelativeValueNested(relPathToFile)) { + continue; + } + fname = relPathToFile; } - const fname = isRelPat ? relativeToRoot(root) : fNameNormalize; if (rule.fn(fname)) { return { matched, @@ -266,10 +294,19 @@ function buildMatcherFn(patterns: GlobPatternWithRoot[], options: NormalizedGlob return fn; } -// function _joinRegExp(patterns: RegExp[]): RegExp | undefined { -// if (!patterns.length) { -// return undefined; -// } -// const joined = patterns.map((p) => `(?:${p.source})`).join('|'); -// return new RegExp(joined); +// function outputBuildMatcherFnPerfData(patterns: GlobPatternWithRoot[], options: NormalizedGlobMatchOptions) { +// console.warn( +// JSON.stringify({ +// options: { +// ...options, +// nodePath: undefined, +// root: Path.relative(process.cwd(), options.root), +// cwd: Path.relative(process.cwd(), options.cwd), +// }, +// patterns: patterns.map(({ glob, root, isGlobalPattern }) => ({ +// glob, +// root: isGlobalPattern ? undefined : Path.relative(process.cwd(), root), +// })), +// }) + ',', +// ); // } diff --git a/packages/cspell-glob/src/GlobMatcherTypes.ts b/packages/cspell-glob/src/GlobMatcherTypes.ts index 98b771d62ea..0ea88812fb0 100644 --- a/packages/cspell-glob/src/GlobMatcherTypes.ts +++ b/packages/cspell-glob/src/GlobMatcherTypes.ts @@ -6,6 +6,7 @@ export interface PathInterface { resolve(...paths: string[]): string; relative(from: string, to: string): string; isAbsolute(p: string): boolean; + parse(p: string): { root: string; dir: string; base: string; ext: string; name: string }; sep: string; } @@ -52,6 +53,7 @@ export interface GlobPatternWithRoot extends GlobPatternWithOptionalRoot { root: string; /** * Global patterns do not need to be relative to the root. + * Note: Some patterns start with `**` but they are tied to the root. In this case, `isGlobalPattern` is `false`. */ isGlobalPattern: boolean; } diff --git a/packages/cspell-glob/src/globHelper.test.ts b/packages/cspell-glob/src/globHelper.test.ts index 07204b81402..20902a4d9d6 100644 --- a/packages/cspell-glob/src/globHelper.test.ts +++ b/packages/cspell-glob/src/globHelper.test.ts @@ -1,6 +1,7 @@ -import * as path from 'node:path'; +import * as Path from 'node:path'; import { posix, win32 } from 'node:path'; +import { FileUrlBuilder, isUrlLike } from '@cspell/url'; import mm from 'micromatch'; import { describe, expect, test } from 'vitest'; @@ -41,11 +42,6 @@ describe('Validate fileOrGlobToGlob', () => { return { glob, root, isGlobalPattern }; } - function p(root: string, path: PathInterface): string { - const cwd = path === win32 ? 'E:\\user\\projects' : '/User/projects'; - return path.resolve(cwd, root); - } - function pp(root: string): string { return p(root, posix); } @@ -55,30 +51,60 @@ describe('Validate fileOrGlobToGlob', () => { } test.each` - file | root | path | expected | comment - ${'*.json'} | ${'.'} | ${posix} | ${g('*.json', pp('.'))} | ${'posix'} - ${'*.json'} | ${'.'} | ${win32} | ${g('*.json', pw('.'))} | ${'win32'} - ${{ glob: '*.json' }} | ${'.'} | ${posix} | ${g('*.json', pp('.'))} | ${'posix'} - ${{ glob: '*.json', root: pp('./data') }} | ${'.'} | ${posix} | ${g('*.json', pp('./data'))} | ${'posix'} - ${pp('./*.json')} | ${'.'} | ${posix} | ${g('*.json', pp('.'))} | ${''} - ${pw('./*.json')} | ${'.'} | ${win32} | ${g('*.json', pw('.'))} | ${''} - ${pp('./package.json')} | ${'.'} | ${posix} | ${g('package.json', pp('.'))} | ${''} - ${pw('.\\package.json')} | ${'.'} | ${win32} | ${g('package.json', pw('.'))} | ${''} - ${pp('./package.json')} | ${'.'} | ${posix} | ${g('package.json', pp('.'))} | ${''} - ${'.\\package.json'} | ${'.'} | ${win32} | ${g('package.json', pw('.'))} | ${''} - ${'./a/package.json'} | ${'.'} | ${posix} | ${g('a/package.json', pp('.'))} | ${''} - ${pw('.\\a\\package.json')} | ${'.'} | ${win32} | ${g('a/package.json', pw('.'))} | ${''} - ${'/user/tester/projects'} | ${'.'} | ${posix} | ${g('/user/tester/projects', pp('.'))} | ${'Directory not matching root.'} - ${'C:\\user\\tester\\projects'} | ${'.'} | ${win32} | ${g('C:/user/tester/projects', pw('.'))} | ${'Directory not matching root.'} - ${'E:\\user\\projects\\spell\\package.json'} | ${'.'} | ${win32} | ${g('spell/package.json', pw('.'))} | ${'Directory matching root.'} - ${'e:\\user\\projects\\spell\\package.json'} | ${'.'} | ${win32} | ${g('spell/package.json', pw('.'))} | ${'Directory matching root.'} - ${'/user/tester/projects/**/*.json'} | ${'.'} | ${posix} | ${g('/user/tester/projects/**/*.json', pp('.'))} | ${'A glob like path not matching the root.'} - ${'C:\\user\\tester\\projects\\**\\*.json'} | ${'.'} | ${win32} | ${g('C:/user/tester/projects/**/*.json', pw('.'))} | ${'A glob like path not matching the root.'} + file | root | path | expected | comment + ${'node_modules/**'} | ${'.'} | ${posix} | ${g('node_modules/**', pp('./'))} | ${'posix'} + ${'*.json'} | ${'.'} | ${posix} | ${g('*.json', pp('./'))} | ${'posix'} + ${'*.json'} | ${'.'} | ${win32} | ${g('*.json', pw('./'))} | ${'win32'} + ${'**/*.json'} | ${'.'} | ${posix} | ${g('**/*.json', pp('./'), true)} | ${'posix'} + ${'**/*.json'} | ${'.'} | ${win32} | ${g('**/*.json', pw('./'), true)} | ${'win32'} + ${pp('./*.json')} | ${'.'} | ${posix} | ${g('/*.json', pp('./'))} | ${''} + ${pw('./*.json')} | ${'.'} | ${win32} | ${g('/*.json', pw('./'))} | ${''} + ${pp('./package.json')} | ${'.'} | ${posix} | ${g('/package.json', pp('./'))} | ${''} + ${pw('.\\package.json')} | ${'.'} | ${win32} | ${g('/package.json', pw('./'))} | ${''} + ${pp('./package.json')} | ${'.'} | ${posix} | ${g('/package.json', pp('./'))} | ${''} + ${'.\\package.json'} | ${'.'} | ${win32} | ${g('/package.json', pw('./'))} | ${''} + ${'./a/package.json'} | ${'.'} | ${posix} | ${g('/a/package.json', pp('./'))} | ${''} + ${pw('.\\a\\package.json')} | ${'.'} | ${win32} | ${g('/package.json', pw('./a/'))} | ${''} + ${'/user/tester/projects'} | ${'.'} | ${posix} | ${g('/projects', pp('/user/tester/'))} | ${'Directory not matching root.'} + ${'C:\\user\\tester\\projects'} | ${'.'} | ${win32} | ${g('/projects', pw('C:/user/tester/'))} | ${'Directory not matching root.'} + ${'E:\\user\\projects\\spell\\package.json'} | ${'.'} | ${win32} | ${g('/package.json', pw('./spell/'))} | ${'Directory matching root.'} + ${'e:\\user\\projects\\spell\\package.json'} | ${'.'} | ${win32} | ${g('/package.json', pw('./spell/'))} | ${'Directory matching root.'} + ${'/user/tester/projects/**/*.json'} | ${'.'} | ${posix} | ${g('**/*.json', pp('/user/tester/projects/'))} | ${'A glob like path not matching the root.'} + ${'C:\\user\\tester\\projects\\**\\*.json'} | ${'.'} | ${win32} | ${g('**/*.json', pw('C:/user/tester/projects/'))} | ${'A glob like path not matching the root.'} `('fileOrGlobToGlob file: "$file" root: "$root" $comment', ({ file, root, path, expected }) => { root = p(root, path); const r = fileOrGlobToGlob(file, root, path); expect(r).toEqual(expected); }); + + test.each` + file | root | path | expected | comment + ${'*.json'} | ${uph('.', pathPosix)} | ${pathPosix} | ${g('*.json', p('./', pathPosix))} | ${'posix'} + ${'*.json'} | ${uph('.', pathWin32)} | ${pathWin32} | ${g('*.json', p('./', pathWin32))} | ${'win32'} + `('fileOrGlobToGlob file: "$file" root: "$root" $comment', ({ file, root, path, expected }) => { + root = p(root, path); + const r = fileOrGlobToGlob(file, root, path || Path); + expect(r).toEqual(expected); + }); + + test.each` + glob | root | path | expected | comment + ${{ glob: '*.json' }} | ${'.'} | ${posix} | ${g('*.json', pp('./'))} | ${'posix'} + ${{ glob: '../*.json' }} | ${'.'} | ${posix} | ${g('/*.json', pp('../'))} | ${'posix'} + ${{ glob: '*.json', root: pp('./data') }} | ${'.'} | ${posix} | ${g('*.json', pp('./data/'))} | ${'posix'} + ${{ glob: '**/*.json' }} | ${'.'} | ${posix} | ${g('**/*.json', pp('./'), true)} | ${'posix'} + ${{ glob: '**/*.json', root: pp('./data') }} | ${'.'} | ${posix} | ${g('**/*.json', pp('./data/'), true)} | ${'posix'} + ${{ glob: '**/*.json', isGlobalPattern: false }} | ${'.'} | ${posix} | ${g('**/*.json', pp('./'))} | ${'posix'} + ${{ glob: '../**/*.json' }} | ${'./a/b'} | ${posix} | ${g('**/*.json', pp('./a/'))} | ${'posix'} + ${{ glob: '/**/*.json' }} | ${'.'} | ${posix} | ${g('/**/*.json', pp('./'))} | ${'posix'} + ${{ glob: '/**/*.json', root: pp('./data') }} | ${'.'} | ${posix} | ${g('/**/*.json', pp('./data/'))} | ${'posix'} + ${{ glob: '*.json', root: '${cwd}' }} | ${'.'} | ${posix} | ${g('*.json', '${cwd}')} | ${'posix'} + ${{ glob: '${cwd}/*.json', root: pp('./data') }} | ${'.'} | ${posix} | ${g('/*.json', '${cwd}')} | ${'posix'} + `('fileOrGlobToGlob glob: "$glob" root: "$root" $comment', ({ glob, root, path, expected }) => { + root = p(root, path); + const r = fileOrGlobToGlob(glob, root, path); + expect(r).toEqual(expected); + }); }); describe('Validate Glob Normalization to root', () => { @@ -89,13 +115,13 @@ describe('Validate Glob Normalization to root', () => { pattern: GlobPattern, root = '.', source = 'cspell.json', - nodePath: PathInterface = path, + nodePath: PathInterface = Path, ): GlobPatternWithRoot { - root = nodePath.resolve(root || '.'); + root = nodePath.normalize(nodePath.resolve(root || '.') + '/'); source = nodePath.join(root, source); pattern = typeof pattern === 'string' ? { glob: pattern } : pattern; const isGlobalPattern = isGlobalGlob(pattern.glob); - root = pattern.root ?? root; + root = nodePath.normalize((pattern.root ?? root) + nodePath.sep); return { source, ...pattern, root, isGlobalPattern }; } @@ -103,7 +129,7 @@ describe('Validate Glob Normalization to root', () => { glob: GlobPatternWithRoot; path: PathInterface; } - function gp(pattern: GlobPattern, root?: string, nodePath: PathInterface = path): GlobNPath { + function gp(pattern: GlobPattern, root?: string, nodePath: PathInterface = Path): GlobNPath { return { glob: g(pattern, root, undefined, nodePath), path: nodePath, @@ -114,7 +140,7 @@ describe('Validate Glob Normalization to root', () => { patterns: GlobPattern | GlobPattern[], root?: string, source = 'cspell.json', - nodePath = path, + nodePath = Path, ): GlobPatternWithOptionalRoot[] { patterns = Array.isArray(patterns) ? patterns : typeof patterns === 'string' ? patterns.split('|') : [patterns]; @@ -141,7 +167,8 @@ describe('Validate Glob Normalization to root', () => { function eg(e: Partial, path: PathInterface) { const p: Partial = {}; if (e.root) { - p.root = path.resolve(e.root); + const suffix = '/'; + p.root = path.normalize(path.resolve(e.root) + suffix); } if (e.rawRoot) { p.rawRoot = path.resolve(e.rawRoot); @@ -162,7 +189,7 @@ describe('Validate Glob Normalization to root', () => { } } - return [...flatten()].map((e) => eg(e, path)); + return [...flatten()].map((e) => eg(e, Path)); } test.each` @@ -195,6 +222,7 @@ describe('Validate Glob Normalization to root', () => { glob | expected ${''} | ${''} ${'\t# hello'} | ${''} + ${'# hello'} | ${''} ${'\t\\# hello '} | ${'\\# hello'} ${' *.js \n'} | ${'*.js'} ${' space after\\ # comment '} | ${'space after\\ '} @@ -213,36 +241,65 @@ describe('Validate Glob Normalization to root', () => { } test.each` - globPath | file | root | expected | comment - ${gp('*.json')} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: '.', ...relGlob }, path)} | ${'matching root'} - ${gp('*.json', '.', pathPosix)} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: '.' }, pathPosix)} | ${'matching root'} - ${gp('*.json', '.', pathWin32)} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: '.' }, pathWin32)} | ${'matching root'} - ${gp('*.json')} | ${'cspell-glob/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell-glob/*.json', root: '..' }, path)} | ${'root above'} - ${gp('*.json', '.', pathPosix)} | ${'cspell/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell/*.json', root: '..' }, pathPosix)} | ${'root above'} - ${gp('*.json', '.', pathWin32)} | ${'cspell/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell/*.json', root: '..' }, pathWin32)} | ${'root above'} - ${gp('*.json')} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: '.' }, path)} | ${'root below, cannot change'} - ${gp('*.json', '.', pathPosix)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: '.' }, pathPosix)} | ${'root below, cannot change'} - ${gp('**/*.json', '.', pathWin32)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '**/*.json', root: 'deeper', ...globalGlob }, pathWin32)} | ${'root below, globstar'} - ${gp('deeper/*.json')} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper' }, path)} | ${'root below, matching'} - ${gp('deeper/*.json', '.', pathPosix)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper' }, pathPosix)} | ${'root below, matching'} - ${gp('deeper/*.json', '.', pathWin32)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper' }, pathWin32)} | ${'root below, matching'} - ${gp('deeper/*.json', 'e:/user/Test/project', pathWin32)} | ${'cfg.json'} | ${'E:/user/test/project/deeper'} | ${eg({ glob: '*.json', root: 'E:/user/test/project/deeper' }, pathWin32)} | ${'root below, matching'} - ${gp('**/deeper/*.json')} | ${'deeper/cfg.json'} | ${'deeper'} | ${eg({ glob: '**/deeper/*.json', root: 'deeper', ...globalGlob }, path)} | ${'root below, not matching'} - ${gp('**/deeper/*.json', 'proj/nested')} | ${'deeper/cfg.json'} | ${'proj'} | ${eg({ glob: '**/deeper/*.json', root: 'proj', ...globalGlob }, path)} | ${'root below, not matching'} - ${gp('**/deeper/*.json')} | ${'!cfg.json'} | ${'deeper'} | ${eg({ glob: '**/deeper/*.json', root: 'deeper', ...globalGlob }, path)} | ${'root below, not matching'} - ${gp('deeper/project/*/*.json')} | ${'cfg.json'} | ${'deeper/project/a'} | ${eg({ glob: '*.json', root: 'deeper/project/a' }, path)} | ${'root below, not matching'} + globPath | file | root | expected | comment + ${gp('*.json')} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: './', ...relGlob }, Path)} | ${'matching root'} + ${gp('*.json', '.', pathPosix)} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: './' }, pathPosix)} | ${'matching root'} + ${gp('*.json', '.', pathWin32)} | ${'cfg.json'} | ${'.'} | ${eg({ glob: '*.json', root: './' }, pathWin32)} | ${'matching root'} + ${gp('*.json')} | ${'cspell-glob/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell-glob/*.json', root: '../' }, Path)} | ${'root above'} + ${gp('*.json', '.', pathPosix)} | ${'cspell/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell/*.json', root: '../' }, pathPosix)} | ${'root above'} + ${gp('*.json', '.', pathWin32)} | ${'cspell/cfg.json'} | ${'..'} | ${eg({ glob: 'cspell/*.json', root: '../' }, pathWin32)} | ${'root above'} + ${gp('*.json')} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: './' }, Path)} | ${'root below, cannot change'} + ${gp('*.json', '.', pathPosix)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: './' }, pathPosix)} | ${'root below, cannot change'} + ${gp('**/*.json', '.', pathWin32)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '**/*.json', root: 'deeper/', ...globalGlob }, pathWin32)} | ${'root below, globstar'} + ${gp('deeper/*.json')} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper/' }, Path)} | ${'root below, matching'} + ${gp('deeper/*.json', '.', pathPosix)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper/' }, pathPosix)} | ${'root below, matching'} + ${gp('deeper/*.json', '.', pathWin32)} | ${'cfg.json'} | ${'deeper'} | ${eg({ glob: '*.json', root: 'deeper/' }, pathWin32)} | ${'root below, matching'} + ${gp('deeper/*.json', 'e:/user/Test/project', pathWin32)} | ${'cfg.json'} | ${'E:/user/test/project/deeper'} | ${eg({ glob: '*.json', root: 'E:/user/test/project/deeper/' }, pathWin32)} | ${'root below, matching'} + ${gp('**/deeper/*.json')} | ${'deeper/cfg.json'} | ${'deeper'} | ${eg({ glob: '**/deeper/*.json', root: 'deeper/', ...globalGlob }, Path)} | ${'root below, not matching'} + ${gp('**/deeper/*.json', 'proj/nested')} | ${'deeper/cfg.json'} | ${'proj'} | ${eg({ glob: '**/deeper/*.json', root: 'proj/', ...globalGlob }, Path)} | ${'root below, not matching'} + ${gp('**/deeper/*.json')} | ${'!cfg.json'} | ${'deeper'} | ${eg({ glob: '**/deeper/*.json', root: 'deeper/', ...globalGlob }, Path)} | ${'root below, not matching'} + ${gp('deeper/project/*/*.json')} | ${'cfg.json'} | ${'deeper/project/a'} | ${eg({ glob: '*.json', root: 'deeper/project/a/' }, Path)} | ${'root below, not matching'} `( 'normalizeGlobToRoot orig {$globPath.glob.glob, $globPath.glob.root} $root $comment', ({ globPath, file, root, expected }: TestNormalizeGlobToRoot) => { const path: PathInterface = globPath.path; + const builder = getFileUrlBuilder(path); const glob: GlobPatternWithRoot = globPath.glob; root = path.resolve(root); + const rootURL = builder.toFileDirURL(root); const shouldMatch = !file.startsWith('!'); + + const result = normalizeGlobToRoot(glob, root, path); + + expect(result).toEqual(expected); + file = file.replace(/^!/, ''); - file = path.relative(root, path.resolve(root, file)).replaceAll('\\', '/'); + file = builder.relative(rootURL, builder.toFileURL(file, rootURL)); + + expect(mm.isMatch(file, result.glob)).toBe(shouldMatch); + }, + ); + + test.each` + globPath | file | root | expected | comment + ${gp('deeper/*.json', 'e:/user/Test/project', pathWin32)} | ${'cfg.json'} | ${'E:/user/test/project/deeper'} | ${eg({ glob: '*.json', root: 'E:/user/test/project/deeper/' }, pathWin32)} | ${'root below, matching'} + `( + 'normalizeGlobToRoot orig {$globPath.glob.glob, $globPath.glob.root} $root $comment', + ({ globPath, file, root, expected }: TestNormalizeGlobToRoot) => { + const path: PathInterface = globPath.path; + const builder = getFileUrlBuilder(path); + const glob: GlobPatternWithRoot = globPath.glob; + root = path.resolve(root); + const rootURL = builder.toFileDirURL(root); + const shouldMatch = !file.startsWith('!'); const result = normalizeGlobToRoot(glob, root, path); + expect(result).toEqual(expected); + + file = file.replace(/^!/, ''); + file = builder.relative(rootURL, builder.toFileURL(file, rootURL)); + expect(mm.isMatch(file, result.glob)).toBe(shouldMatch); }, ); @@ -270,8 +327,8 @@ describe('Validate Glob Normalization to root', () => { ${mg({ glob: '/node_modules/' })} | ${'project'} | ${e(mGlob(gg('node_modules/**/*'), { rawGlob: '/node_modules/' }))} | ${'/node_modules/'} ${mg('i18/en_US')} | ${'project'} | ${e(mGlob(gg('i18/en_US', 'i18/en_US/**'), { rawGlob: 'i18/en_US' }))} | ${'i18/en_US'} `('tests normalization nested "$comment" root: "$root"', ({ globs, root, expectedGlobs }: TestCase) => { - root = path.resolve(root); - const r = normalizeGlobPatterns(globs, { root, nested: true, nodePath: path }); + root = Path.resolve(root); + const r = normalizeGlobPatterns(globs, { root, nested: true, nodePath: Path }); expect(r).toEqual(expectedGlobs); }); @@ -281,7 +338,7 @@ describe('Validate Glob Normalization to root', () => { ${mg('**')} | ${'.'} | ${e(mGlob(gg('**'), globalGlob))} | ${'**'} ${mg('node_modules/**')} | ${'.'} | ${e(gg('node_modules/**'))} | ${'node_modules/**'} ${mg('!*.json')} | ${'.'} | ${e(mGlob('!*.json', { rawGlob: '!*.json' }))} | ${'Negative glob'} - ${mg('!*.json', 'project/a')} | ${'.'} | ${e(mGlob(gg('!project/a/**/*.json', '!project/a/**/*.json/**'), { rawGlob: '!*.json', root: '.' }))} | ${'Negative in Sub dir glob.'} + ${mg('!*.json', 'project/a')} | ${'.'} | ${e(mGlob(gg('!project/a/**/*.json', '!project/a/**/*.json/**'), { rawGlob: '!*.json', root: './' }))} | ${'Negative in Sub dir glob.'} ${j(mg('*.json', 'project/a'), mg('*.ts', '.'))} | ${'.'} | ${e(mGlob(gg('project/a/**/*.json', 'project/a/**/*.json/**'), { rawGlob: '*.json' }), mGlob('*.ts'))} | ${'Sub dir glob.'} ${j(mg('*.json', '../tests/a'), mg('*.ts', '.'))} | ${'.'} | ${e(mGlob('*.json', { rawGlob: '*.json' }), mGlob('*.ts', { rawGlob: '*.ts' }))} | ${''} ${mg('*.json')} | ${'project'} | ${e(mGlob('*.json', { rawGlob: '*.json' }))} | ${'Root deeper than glob'} @@ -290,13 +347,13 @@ describe('Validate Glob Normalization to root', () => { ${j(mg('/node_modules', 'project/a'), mg('*.ts', '.'))} | ${'project'} | ${e(mGlob(gg('a/node_modules', 'a/node_modules/**'), { rawGlob: '/node_modules' }), mGlob('*.ts'))} | ${'/node_modules'} ${j(mg('!/node_modules', 'project/a'))} | ${'project'} | ${e(mGlob(gg('!a/node_modules', '!a/node_modules/**'), { rawGlob: '!/node_modules' }))} | ${'Root in the middle. /node_modules'} ${j(mg('*.json', '../tests/a'), mg('*.ts', '.'))} | ${'project'} | ${e(mGlob('*.json', { rawGlob: '*.json' }), mGlob('*.ts'))} | ${''} - ${j(mg('*.json', '../tests/a'))} | ${'project'} | ${e(mGlob('*.json', { rawGlob: '*.json', root: '../tests/a' }))} | ${''} + ${j(mg('*.json', '../tests/a'))} | ${'project'} | ${e(mGlob('*.json', { rawGlob: '*.json', root: '../tests/a/' }))} | ${''} ${j(mg('*/*.json', 'project/a'))} | ${'project'} | ${e(gg('a/*/*.json', 'a/*/*.json/**'))} | ${'nested a/*/*.json'} ${j(mg('*/*.json', '.'))} | ${'project'} | ${e(gg('*.json', '*.json/**'))} | ${'nested */*.json'} `('tests normalization to root nested "$comment" root: "$root"', ({ globs, root, expectedGlobs }: TestCase) => { - root = path.resolve(root); - const r = normalizeGlobPatterns(globs, { root, nested: true, nodePath: path }).map((p) => - normalizeGlobToRoot(p, root, path), + root = Path.resolve(root); + const r = normalizeGlobPatterns(globs, { root, nested: true, nodePath: Path }).map((p) => + normalizeGlobToRoot(p, root, Path), ); expect(r).toEqual(expectedGlobs); }); @@ -306,32 +363,32 @@ describe('Validate Glob Normalization to root', () => { ${mg('*.json')} | ${'.'} | ${e(mGlob(gg('*.json'), { rawGlob: '*.json' }))} | ${'Glob with same root'} ${mg('**')} | ${'.'} | ${e(mGlob(gg('**'), globalGlob))} | ${'**'} ${j(mg('*.json', 'project/a'), mg('*.ts', '.'))} | ${'.'} | ${e(mGlob(gg('project/a/*.json'), { rawGlob: '*.json' }), gg('*.ts'))} | ${'Sub dir glob.'} - ${j(mg('*.json', '../tests/a'), mg('*.ts', '.'))} | ${'.'} | ${e(mGlob(gg('*.json'), { root: '../tests/a' }), gg('*.ts'))} | ${'Glob not in root is not changed.'} - ${mg('*.json')} | ${'project'} | ${e(mGlob(gg('*.json'), { root: '.' }))} | ${'Root deeper than glob'} + ${j(mg('*.json', '../tests/a'), mg('*.ts', '.'))} | ${'.'} | ${e(mGlob(gg('*.json'), { root: '../tests/a/' }), gg('*.ts'))} | ${'Glob not in root is not changed.'} + ${mg('*.json')} | ${'project'} | ${e(mGlob(gg('*.json'), { root: './' }))} | ${'Root deeper than glob'} ${j(mg('*.json', 'project/a'))} | ${'project'} | ${e(mGlob(gg('a/*.json'), { rawGlob: '*.json' }))} | ${'Root in the middle.'} ${j(mg('/node_modules', 'project/a'))} | ${'project'} | ${e(mGlob(gg('a/node_modules'), { rawGlob: '/node_modules' }))} | ${'Root in the middle. /node_modules'} - ${j(mg('*.json', '../tests/a'))} | ${'project'} | ${e({ glob: '*.json', root: '../tests/a' })} | ${'Glob not in root is not changed.'} - ${j(mg('**/*.ts', '.'))} | ${'project'} | ${e({ glob: '**/*.ts', root: 'project' })} | ${'Glob not in root is not changed.'} - ${j(mg('/**/*.ts', '.'))} | ${'project'} | ${e({ glob: '**/*.ts', root: 'project' })} | ${'Glob not in root is not changed.'} - ${j(mg('*/*.json', '../tests/a'))} | ${'project'} | ${e({ glob: '*/*.json', root: '../tests/a' })} | ${'Glob not in root is not changed.'} - ${j(mg('*/*.json', 'project/a'))} | ${'project'} | ${e({ glob: 'a/*/*.json', root: 'project' })} | ${'nested a/*/*.json'} - ${j(mg('*/*.json', '.'))} | ${'project'} | ${e({ glob: '*.json', root: 'project' })} | ${'nested */*.json'} - ${j(mg('project/*/*.json', '.'))} | ${'project/sub'} | ${e({ glob: '*.json', root: 'project/sub' })} | ${'nested project/*/*.json'} - ${j(mg('node_modules', '.'))} | ${'.'} | ${e({ glob: 'node_modules', root: '.' })} | ${'node_modules'} - ${j(mg('node_modules/', '.'))} | ${'.'} | ${e({ glob: 'node_modules/**/*', root: '.' })} | ${'node_modules/'} + ${j(mg('*.json', '../tests/a'))} | ${'project'} | ${e({ glob: '*.json', root: '../tests/a/' })} | ${'Glob not in root is not changed.'} + ${j(mg('**/*.ts', '.'))} | ${'project'} | ${e({ glob: '**/*.ts', root: 'project/' })} | ${'Glob not in root is not changed.'} + ${j(mg('/**/*.ts', '.'))} | ${'project'} | ${e({ glob: '**/*.ts', root: 'project/' })} | ${'Glob not in root is not changed.'} + ${j(mg('*/*.json', '../tests/a'))} | ${'project'} | ${e({ glob: '*/*.json', root: '../tests/a/' })} | ${'Glob not in root is not changed.'} + ${j(mg('*/*.json', 'project/a'))} | ${'project'} | ${e({ glob: 'a/*/*.json', root: 'project/' })} | ${'nested a/*/*.json'} + ${j(mg('*/*.json', '.'))} | ${'project'} | ${e({ glob: '*.json', root: 'project/' })} | ${'nested */*.json'} + ${j(mg('project/*/*.json', '.'))} | ${'project/sub'} | ${e({ glob: '*.json', root: 'project/sub/' })} | ${'nested project/*/*.json'} + ${j(mg('node_modules', '.'))} | ${'.'} | ${e({ glob: 'node_modules', root: './' })} | ${'node_modules'} + ${j(mg('node_modules/', '.'))} | ${'.'} | ${e({ glob: 'node_modules/**/*', root: './' })} | ${'node_modules/'} `('tests normalization to root not nested "$comment" root: "$root"', ({ globs, root, expectedGlobs }: TestCase) => { - root = path.resolve(root); - const r = normalizeGlobPatterns(globs, { root, nested: false, nodePath: path }).map((p) => - normalizeGlobToRoot(p, root, path), - ); + root = Path.resolve(root); + const r = normalizeGlobPatterns(globs, { root, nested: false, nodePath: Path }).map((p) => { + return normalizeGlobToRoot(p, root, Path); + }); try { expect(r).toEqual(expectedGlobs); } catch (e) { - console.log('%o', globs); + console.error('%o', globs); throw e; } - const again = normalizeGlobPatterns(r, { root, nested: false, nodePath: path }).map((p) => - normalizeGlobToRoot(p, root, path), + const again = normalizeGlobPatterns(r, { root, nested: false, nodePath: Path }).map((p) => + normalizeGlobToRoot(p, root, Path), ); expect(again).toEqual(r); }); @@ -343,6 +400,7 @@ describe('Validate Glob Normalization to root', () => { } function gN(glob: string, root: string, rawGlob: string, rawRoot: string): GlobPatternNormalized { + root = nOpts().nodePath.normalize(root + '/'); return { glob, root, rawGlob, rawRoot, isGlobalPattern: glob.replaceAll(/^!+/g, '').startsWith('**') }; } @@ -423,13 +481,22 @@ function makePathInterface(nodePath: PathInterface, cwd: string): PathInterface normalize: (p) => nodePath.normalize(p), join: (...paths) => nodePath.join(...paths), isAbsolute: (p) => nodePath.isAbsolute(p), - relative: (from, to) => nodePath.relative(from, to), + relative: (...p) => nodePath.relative(...p), + parse: (...p) => nodePath.parse(...p), resolve: (...paths: string[]) => { return nodePath.resolve(cwd, ...paths); }, }; } +function p(root: string, p?: PathInterface | undefined): string { + if (isUrlLike(root)) return root; + const cwd = p === win32 ? 'E:\\user\\projects' : p === posix ? '/User/projects' : undefined; + p ??= Path; + const suffix = /[/\\]$/.test(root) ? p.sep : ''; + return ((cwd && p.resolve(cwd, root)) || p.resolve(root)) + suffix; +} + function gg(...globs: string[]) { return globs.map((glob) => ({ glob })); } @@ -438,3 +505,24 @@ function mGlob(g: KnownGlob | Partial[], ...toApply: Part const globs = typeof g == 'string' ? knownGlobs[g] : g; return globs.map((glob) => toApply.reduce((a: Partial, b) => ({ ...a, ...b }), glob)); } + +function getFileUrlBuilder(path?: PathInterface): FileUrlBuilder { + return new FileUrlBuilder({ path }); +} + +// function u(file: string): URL { +// return toFileURL(file); +// } + +// function uh(path: string): string { +// return u(path).href; +// } + +function up(file: string, path?: PathInterface): URL { + const builder = getFileUrlBuilder(path); + return builder.toFileURL(file); +} + +function uph(file: string, path: PathInterface | undefined): string { + return up(file, path).href; +} diff --git a/packages/cspell-glob/src/globHelper.ts b/packages/cspell-glob/src/globHelper.ts index 370f7279157..2efaebd0c06 100644 --- a/packages/cspell-glob/src/globHelper.ts +++ b/packages/cspell-glob/src/globHelper.ts @@ -1,6 +1,8 @@ /* eslint-disable no-irregular-whitespace */ import * as Path from 'node:path'; +import { FileUrlBuilder } from '@cspell/url'; + import type { GlobPattern, GlobPatternNormalized, @@ -10,10 +12,34 @@ import type { } from './GlobMatcherTypes.js'; const { posix } = Path; -const relRegExp = /^\.[\\/]/; +// const relRegExp = /^\..?[\\/]/; /** test for glob patterns starting with `**` */ const isGlobalPatternRegExp = /^!*[*]{2}/; +const hasGlobCharactersRegExp = /[*?{}[\]]/; + +const fileUrlBuilder = new FileUrlBuilder(); + +export const GlobPlaceHolders = { + cwd: '${cwd}', +}; + +export const GlobPatterns = { + suffixAny: '/**', + /** + * Use as as suffix for a directory. Example `node_modules/` becomes `node_modules/**​/*`. + */ + suffixDir: '/**/*', + prefixAny: '**/', +}; + +let cacheCalls = 0; +let cacheMisses = 0; +let cachePath: PathInterface = Path; +let cacheRoot: string = '<>'; +const cache = new Map(); +const debugCache = false; + /** * This function tries its best to determine if `fileOrGlob` is a path to a file or a glob pattern. * @param fileOrGlob - file (with absolute path) or glob. @@ -25,51 +51,102 @@ export function fileOrGlobToGlob( root: string, path: PathInterface = Path, ): GlobPatternWithRoot { - const pathToGlob = path.sep === '\\' ? (p: string) => p.replaceAll('\\', '/') : (p: string) => p; - - const isGlobalPattern = false; - if (isGlobPatternWithOptionalRoot(fileOrGlob)) { - const useRoot = fileOrGlob.root ?? root; - const isGlobalPattern = isGlobPatternWithRoot(fileOrGlob) - ? fileOrGlob.isGlobalPattern - : isGlobalGlob(fileOrGlob.glob); - return { ...fileOrGlob, root: useRoot, isGlobalPattern }; - } - - if (doesRootContainPath(root, fileOrGlob, path) || relRegExp.test(fileOrGlob)) { - const rel = path.relative(root, path.resolve(root, fileOrGlob)); - return { glob: pathToGlob(rel), root, isGlobalPattern }; + if (cacheRoot !== root || cachePath !== path) { + cache.clear(); + cacheCalls = 0; + cacheMisses = 0; + cacheRoot = root; + cachePath = path; } - return { glob: pathToGlob(fileOrGlob), root, isGlobalPattern }; + ++cacheCalls; + debugCache && + !(cacheCalls & 0x7) && + console.error('cache miss rate: %d%% cache size: %d', (cacheMisses / cacheCalls) * 100, cache.size); + const found = cache.get(fileOrGlob); + if (found) return found; + ++cacheMisses; + const pattern = _fileOrGlobToGlob(fileOrGlob, root, path); + cache.set(fileOrGlob, pattern); + return pattern; } /** - * Decide if a childPath is contained within a root or at the same level. - * @param root - absolute path - * @param childPath - absolute path + * This function tries its best to determine if `fileOrGlob` is a path to a file or a glob pattern. + * @param fileOrGlob - file (with absolute path) or glob. + * @param root - absolute path to the directory that will be considered the root when testing the glob pattern. + * @param path - optional node path methods - used for testing */ -export function doesRootContainPath(root: string, child: string, path: PathInterface): boolean { - if (child.startsWith(root)) return true; - const rel = path.relative(root, child); - return !rel || (rel !== child && !rel.startsWith('..') && !path.isAbsolute(rel)); +function _fileOrGlobToGlob( + fileOrGlob: string | GlobPattern, + root: string, + path: PathInterface = Path, +): GlobPatternWithRoot { + const toForwardSlash = path.sep === '\\' ? (p: string) => p.replaceAll('\\', '/') : (p: string) => p; + const builder = urlBuilder(path); + fileOrGlob = typeof fileOrGlob === 'string' ? toForwardSlash(fileOrGlob) : fileOrGlob; + const rootUrl = builder.toFileDirURL(root); + + // Normalize root + root = builder.urlToFilePathOrHref(rootUrl); + + const pattern = toGlobPatternWithRoot(fileOrGlob, root, builder); + + // if (root.includes(GlobPlaceHolders.cwd) || pattern.root.includes(GlobPlaceHolders.cwd)) { + // console.warn('fileOrGlobToGlob: root or pattern contains ${cwd}', { root, pattern, fileOrGlob }); + // } + + return pattern; +} + +function toGlobPatternWithRoot(glob: GlobPattern, root: string, builder: FileUrlBuilder): GlobPatternWithRoot { + function toPattern() { + if (isGlobPatternWithRoot(glob)) return fixPatternRoot({ ...glob }, builder); + const rootUrl = builder.toFileDirURL(root); + if (typeof glob === 'string') return filePathOrGlobToGlob(glob, rootUrl, builder); + const pattern = { isGlobalPattern: isGlobalGlob(glob.glob), ...glob, root: glob.root ?? root }; + fixPatternRoot(pattern, builder); + // pattern.glob might still be a file or a relative glob pattern. + fixPatternGlob(pattern, builder); + return pattern; + } + const pattern = toPattern(); + + if (pattern.glob.startsWith(GlobPlaceHolders.cwd)) { + pattern.root = GlobPlaceHolders.cwd; + pattern.glob = pattern.glob.replace(GlobPlaceHolders.cwd, ''); + } + + return pattern; } export function isGlobPatternWithOptionalRoot(g: GlobPattern): g is GlobPatternWithOptionalRoot { return typeof g !== 'string' && typeof g.glob === 'string'; } -export function isGlobPatternWithRoot(g: GlobPatternWithRoot | GlobPatternWithOptionalRoot): g is GlobPatternWithRoot { +export function isGlobPatternWithRoot(g: GlobPattern): g is GlobPatternWithRoot { + if (typeof g === 'string') return false; return typeof g.root === 'string' && 'isGlobalPattern' in g; } export function isGlobPatternNormalized(g: GlobPattern | GlobPatternNormalized): g is GlobPatternNormalized { - if (!isGlobPatternWithOptionalRoot(g)) return false; if (!isGlobPatternWithRoot(g)) return false; - const gr = g; + const gr = g as GlobPatternNormalized; return 'rawGlob' in gr && 'rawRoot' in gr && typeof gr.rawGlob === 'string'; } +export function isGlobPatternNormalizedToRoot( + g: GlobPattern | GlobPatternNormalized, + options: NormalizeOptions, +): g is GlobPatternNormalized { + if (!isGlobPatternNormalized(g)) return false; + return g.root === options.root; +} + +function urlBuilder(path: PathInterface = Path): FileUrlBuilder { + return path === Path ? fileUrlBuilder : new FileUrlBuilder({ path }); +} + /** * @param pattern glob pattern * @param nested when true add `**​//​**` @@ -94,7 +171,8 @@ function normalizePatternNested(pattern: string): string[] { pattern = hasLeadingSlash ? pattern.slice(1) : pattern; if (pattern.endsWith('/')) { - // legacy behavior, if it only has a trailing slash, allow matching against a nested directory. + // See: https://git-scm.com/docs/gitignore#_pattern_format + // if it only has a trailing slash, allow matching against a nested directory. return hasLeadingSlash || pattern.slice(0, -1).includes('/') ? [pattern + '**/*'] : ['**/' + pattern + '**/*']; } @@ -143,7 +221,9 @@ export function normalizeGlobPatterns(patterns: GlobPattern[], options: Normaliz function* normalize() { for (const glob of patterns) { if (isGlobPatternNormalized(glob)) { - yield glob; + yield isGlobPatternNormalizedToRoot(glob, options) + ? glob + : normalizeGlobToRoot(glob, options.root, options.nodePath || Path); continue; } yield* normalizeGlobPattern(glob, options); @@ -154,8 +234,13 @@ export function normalizeGlobPatterns(patterns: GlobPattern[], options: Normaliz } export function normalizeGlobPattern(g: GlobPattern, options: NormalizeOptions): GlobPatternNormalized[] { - const { root, nodePath: path = Path, nested, cwd = Path.resolve() } = options; + const { root, nodePath: path = Path, nested } = options; + const builder = urlBuilder(path); + const cwd = options.cwd ?? path.resolve(); + const cwdUrl = builder.toFileDirURL(cwd); + const rootUrl = builder.toFileDirURL(root, cwdUrl); + const gIsGlobalPattern = isGlobPatternWithRoot(g) ? g.isGlobalPattern : undefined; g = !isGlobPatternWithOptionalRoot(g) ? { glob: g } : g; const gr = { ...g, root: g.root ?? root }; @@ -163,16 +248,19 @@ export function normalizeGlobPattern(g: GlobPattern, options: NormalizeOptions): const rawRoot = gr.root; const rawGlob = g.glob; - gr.glob = gr.glob.trim(); // trimGlob(g.glob); - if (gr.glob.startsWith('${cwd}')) { - gr.glob = gr.glob.replace('${cwd}', ''); - gr.root = '${cwd}'; + gr.glob = trimGlob(g.glob); + if (gr.glob.startsWith(GlobPlaceHolders.cwd)) { + gr.glob = gr.glob.replace(GlobPlaceHolders.cwd, ''); + gr.root = GlobPlaceHolders.cwd; } - if (gr.root.startsWith('${cwd}')) { - gr.root = path.resolve(gr.root.replace('${cwd}', cwd)); + if (gr.root.startsWith(GlobPlaceHolders.cwd)) { + const relRoot = gr.root.replace(GlobPlaceHolders.cwd, './'); + const r = builder.toFileDirURL(relRoot, cwdUrl); + r.pathname = posix.normalize(r.pathname); + gr.root = builder.urlToFilePathOrHref(r); } - const isGlobalPattern = isGlobalGlob(gr.glob); - gr.root = path.resolve(root, path.normalize(gr.root)); + const isGlobalPattern = gIsGlobalPattern ?? isGlobalGlob(gr.glob); + gr.root = builder.urlToFilePathOrHref(builder.toFileDirURL(gr.root, rootUrl)); const globs = normalizePattern(gr.glob, nested); return globs.map((glob) => ({ ...gr, glob, rawGlob, rawRoot, isGlobalPattern })); @@ -191,15 +279,18 @@ export function normalizeGlobToRoot( root: string, path: PathInterface, ): Glob { - function relToGlob(relativePath: string): string { - return path.sep === '\\' ? relativePath.replaceAll('\\', '/') : relativePath; - } + const builder = urlBuilder(path); + glob = { ...glob }; + fixPatternRoot(glob, builder); + const rootURL = builder.toFileDirURL(root); + root = builder.urlToFilePathOrHref(rootURL); if (glob.root === root) { return glob; } - const relFromRootToGlob = path.relative(root, glob.root); + const globRootUrl = builder.toFileDirURL(glob.root); + const relFromRootToGlob = builder.relative(rootURL, globRootUrl); if (!relFromRootToGlob) { return glob; @@ -209,9 +300,9 @@ export function normalizeGlobToRoot( return { ...glob, root }; } - const relFromGlobToRoot = path.relative(glob.root, root); - const globIsUnderRoot = relFromRootToGlob[0] !== '.' && !path.isAbsolute(relFromRootToGlob); - const rootIsUnderGlob = relFromGlobToRoot[0] !== '.' && !path.isAbsolute(relFromGlobToRoot); + const relFromGlobToRoot = builder.relative(globRootUrl, rootURL); + const globIsUnderRoot = isRelativeValueNested(relFromRootToGlob); + const rootIsUnderGlob = isRelativeValueNested(relFromGlobToRoot); // Root and Glob are not in the same part of the directory tree. if (!globIsUnderRoot && !rootIsUnderGlob) { @@ -224,7 +315,7 @@ export function normalizeGlobToRoot( // prefix with root if (globIsUnderRoot) { - const relGlob = relToGlob(relFromRootToGlob); + const relGlob = relFromRootToGlob; return { ...glob, @@ -236,18 +327,22 @@ export function normalizeGlobToRoot( // The root is under the glob root // The more difficult case, the glob is higher than the root // A best effort is made, but does not do advanced matching. - const relGlob = relToGlob(relFromGlobToRoot) + '/'; + const relGlob = (relFromGlobToRoot + '/').replaceAll('//', '/'); const rebasedGlob = rebaseGlob(g, relGlob); return rebasedGlob ? { ...glob, glob: prefix + rebasedGlob, root } : glob; } +export function isRelativeValueNested(rel: string): boolean { + return !rel || !(rel === '..' || rel.startsWith('../') || rel.startsWith('/')); +} + /** * Rebase a glob string to a new prefix * @param glob - glob string * @param rebaseTo - glob prefix */ -function rebaseGlob(glob: string, rebaseTo: string): string | undefined { +export function rebaseGlob(glob: string, rebaseTo: string): string | undefined { if (!rebaseTo || rebaseTo === '/') return glob; if (glob.startsWith('**')) return glob; rebaseTo = rebaseTo.endsWith('/') ? rebaseTo : rebaseTo + '/'; @@ -278,13 +373,17 @@ function rebaseGlob(glob: string, rebaseTo: string): string | undefined { * @param glob - glob string * @returns trimmed glob */ -function trimGlob(glob: string): string { - glob = glob.replaceAll(/(? = { ' ': true, '\t': true, @@ -304,7 +403,7 @@ function trimGlobRight(glob: string): string { while (i >= 0 && glob[i] in spaces) { --i; } - if (glob[i] === '\\' && i < lenMin1) { + if (glob[i] === '\\') { ++i; } ++i; @@ -317,17 +416,138 @@ function trimGlobRight(glob: string): string { * @returns string with leading spaces removed. */ function trimGlobLeft(glob: string): string { - let i = 0; - while (i < glob.length && glob[i] in spaces) { - ++i; - } - return glob.slice(i); + return glob.trimStart(); } +/** + * Test if a glob pattern has a leading `**`. + * @param glob - the glob + * @returns true if the glob pattern starts with `**` + */ function isGlobalGlob(glob: string): boolean { return isGlobalPatternRegExp.test(glob); } +function hasGlobCharacters(glob: string): boolean { + return hasGlobCharactersRegExp.test(glob); +} + +/** + * Split a glob into a path and a glob portion. + */ +interface SplitGlob { + /** + * the leading path portion of a glob + * it does not contain any glob characters. + */ + path: string | undefined; + /** + * The glob portion of the glob. + */ + glob: string; +} + +function isGlobPart(part: string): boolean { + if (part === GlobPlaceHolders.cwd) return false; + return hasGlobCharacters(part); +} + +/** + * Split a glob into a path and a glob portion. + * The path portion does not contain any glob characters. + * Path might be empty. The glob portion should always be non-empty. + * @param glob - glob string pattern + * @returns + */ +function splitGlob(glob: string): SplitGlob { + const parts = glob.split('/'); + + const p = parts.findIndex(isGlobPart); + const s = p < 0 ? parts.length - 1 : p; + return createSplitGlob(s ? parts.slice(0, s).join('/') + '/' : undefined, parts.slice(s).join('/')); +} + +/** + * Split a glob into a path and a glob portion. + * The path portion does not contain any glob characters. + * Path might be empty. The glob portion should always be non-empty. + * @param glob - glob string pattern + * @param relOnly - Indicates that only `..` and `.` path segments are considered for the path. + * @returns + */ +function splitGlobRel(glob: string): SplitGlob { + const parts = glob.split('/'); + + if (!parts.includes('..') && !parts.includes('.')) return { path: undefined, glob }; + + const firstGlobPartIdx = parts.findIndex(isGlobPart); + const lastRelIdx = Math.max(parts.lastIndexOf('..'), parts.lastIndexOf('.')); + + const p = firstGlobPartIdx >= 0 ? Math.min(firstGlobPartIdx, lastRelIdx + 1) : lastRelIdx + 1; + const s = p < 0 ? parts.length - 1 : p; + return createSplitGlob(s ? parts.slice(0, s).join('/') + '/' : undefined, parts.slice(s).join('/')); +} + +function createSplitGlob(path: string | undefined, glob: string): SplitGlob { + glob = path ? '/' + glob : glob; + glob = glob.startsWith('/**') ? glob.slice(1) : glob; + return { path, glob }; +} + +function rootToUrl(root: string, builder: FileUrlBuilder): URL { + if (root.startsWith(GlobPlaceHolders.cwd)) { + return new URL(builder.normalizeFilePathForUrl(root.replace(GlobPlaceHolders.cwd, '.')), builder.cwd); + } + + return builder.toFileDirURL(root); +} + +function fixPatternRoot(glob: GlobPatternWithRoot, builder: FileUrlBuilder): GlobPatternWithRoot { + // Gets resolved later. + if (glob.root.startsWith(GlobPlaceHolders.cwd)) { + return glob; + } + + glob.root = builder.urlToFilePathOrHref(rootToUrl(glob.root, builder)); + return glob; +} + +/** + * Adjust the glob pattern in case it is a file or a relative glob. + * @param glob + * @param builder + * @returns + */ +function fixPatternGlob(glob: GlobPatternWithRoot, builder: FileUrlBuilder): void { + const rootURL = builder.toFileURL(glob.root); + + const split = splitGlobRel(glob.glob); + glob.glob = split.glob; + if (split.path !== undefined) { + const relRootPath = split.path.startsWith('/') ? '.' + split.path : split.path; + glob.root = builder.urlToFilePathOrHref(builder.toFileDirURL(relRootPath, glob.root)); + } + fixPatternRelativeToRoot(glob, rootURL, builder); +} + +function fixPatternRelativeToRoot(glob: GlobPatternWithRoot, root: URL, builder: FileUrlBuilder): void { + if (glob.root.startsWith(GlobPlaceHolders.cwd)) return; + + const rel = builder.relative(root, builder.toFileDirURL(glob.root)); + if (rel.startsWith('/') || rel.startsWith('../')) return; + glob.root = builder.urlToFilePathOrHref(root); + glob.glob = rel + glob.glob; +} + +function filePathOrGlobToGlob(filePathOrGlob: string, root: URL, builder: FileUrlBuilder): GlobPatternWithRoot { + const isGlobalPattern = isGlobalGlob(filePathOrGlob); + const { path, glob } = builder.isAbsolute(filePathOrGlob) + ? splitGlob(filePathOrGlob) + : splitGlobRel(filePathOrGlob); + const url = builder.toFileDirURL(path || './', root); + return { root: builder.urlToFilePathOrHref(url), glob, isGlobalPattern }; +} + export const __testing__ = { rebaseGlob, trimGlob, diff --git a/packages/cspell-glob/src/perf/match.perf.ts b/packages/cspell-glob/src/perf/match.perf.ts new file mode 100644 index 00000000000..2af439ca16a --- /dev/null +++ b/packages/cspell-glob/src/perf/match.perf.ts @@ -0,0 +1,66 @@ +import { promises as fs } from 'node:fs'; +import Path from 'node:path'; + +import { suite } from 'perf-insight'; + +import { GlobMatcher, GlobMatchOptions } from '../GlobMatcher.js'; +import { GlobPatternWithOptionalRoot } from '../GlobMatcherTypes.js'; + +const fixturesDataUrl = new URL('../../../../test-fixtures/perf/cspell-glob/data/', import.meta.url); + +const cwd = process.cwd(); + +interface TestPattern { + options: GlobMatchOptions; + patterns: GlobPatternWithOptionalRoot[]; +} + +suite('cspell-glob GlobMatcher match', async (test) => { + const fileList = await loadFileList(); + const patterns = await loadPatterns(); + const matchers: GlobMatcher[] = patterns.map(({ options, patterns }) => new GlobMatcher(patterns, options)); + + test('match', () => { + for (const matcher of matchers) { + for (const file of fileList) { + matcher.match(file); + } + } + }); +}); + +suite('cspell-glob GlobMatcher create', async (test) => { + const patterns = await loadPatterns(); + + test('create GlobMatcher', () => { + patterns.map(({ options, patterns }) => new GlobMatcher(patterns, options)); + }); +}); + +async function loadFileList() { + const fileList = (await fs.readFile(new URL('file-list.txt', fixturesDataUrl), 'utf8')) + .split('\n') + .map((a) => a.trim()) + .filter((a) => a) + .map((file) => Path.relative(cwd, file)); + + return fileList; +} + +async function loadPatterns(): Promise { + const raw = await fs.readFile(new URL('patterns.jsonc', fixturesDataUrl), 'utf8'); + const patterns: TestPattern[] = JSON.parse(raw); + + return patterns.map(({ options, patterns }) => ({ + options: { + ...options, + cwd: Path.resolve(cwd, options.cwd || '.'), + root: Path.resolve(cwd, options.root || '.'), + }, + patterns: patterns.map((pattern) => ({ + ...pattern, + root: Path.resolve(cwd, pattern.root || '.'), + isGlobalPattern: pattern.root === undefined, + })), + })); +} diff --git a/packages/cspell-glob/tsconfig.esm.json b/packages/cspell-glob/tsconfig.esm.json deleted file mode 100644 index 3e7a07fa810..00000000000 --- a/packages/cspell-glob/tsconfig.esm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.esm.json", - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "dist/compile.esm.tsbuildInfo", - "rootDir": "src", - "outDir": "dist/esm", - "types": ["node"] - }, - "include": ["src"] -} diff --git a/packages/cspell-glob/tsconfig.json b/packages/cspell-glob/tsconfig.json index 635469e894c..30891b89672 100644 --- a/packages/cspell-glob/tsconfig.json +++ b/packages/cspell-glob/tsconfig.json @@ -1,4 +1,9 @@ { - "files": [], - "references": [{ "path": "./tsconfig.esm.json" }] + "extends": "../../tsconfig.esm.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "types": ["node"] + }, + "include": ["src"] } diff --git a/packages/cspell-io/src/CSpellIONode.test.ts b/packages/cspell-io/src/CSpellIONode.test.ts index 0a827ba119c..c241b8abd40 100644 --- a/packages/cspell-io/src/CSpellIONode.test.ts +++ b/packages/cspell-io/src/CSpellIONode.test.ts @@ -134,7 +134,7 @@ describe('CSpellIONode', () => { url | expected ${'https://raw.githubusercontent.com/streetsidesoftware/cspell/main/tsconfig.json'} | ${oc({ eTag: sc('W/') })} ${__filename} | ${oc({ mtimeMs: expect.any(Number) })} - `('getStat $url', async ({ url, expected }) => { + `('getStat $url', { timeout: 30_000 }, async ({ url, expected }) => { const cspellIo = new CSpellIONode(); const r = await cspellIo.getStat(url); expect(r).toEqual(expected); @@ -144,7 +144,7 @@ describe('CSpellIONode', () => { url | expected ${'https://raw.gitubusrcotent.com/streetsidesoftware/cspell/main/tsconfig.json'} | ${oc({ code: 'ENOTFOUND' })} ${ps(__dirname, 'not-found.nf')} | ${oc({ code: 'ENOENT' })} - `('getStat with error $url', async ({ url, expected }) => { + `('getStat with error $url', { timeout: 30_000 }, async ({ url, expected }) => { const cspellIo = new CSpellIONode(); const r = cspellIo.getStat(url); await expect(r).rejects.toEqual(expected); diff --git a/packages/cspell-io/src/CVirtualFS.ts b/packages/cspell-io/src/CVirtualFS.ts new file mode 100644 index 00000000000..04c35c1d279 --- /dev/null +++ b/packages/cspell-io/src/CVirtualFS.ts @@ -0,0 +1,180 @@ +import { urlOrReferenceToUrl } from './common/index.js'; +import type { CSpellIO } from './CSpellIO.js'; +import { getDefaultCSpellIO } from './CSpellIONode.js'; +import type { Disposable } from './models/index.js'; +import { LogEvent } from './models/LogEvent.js'; +import { UrlOrReference, VFileSystem, VFileSystemCore } from './VFileSystem.js'; +import { debug, NextProvider, VFileSystemProvider, VirtualFS } from './VirtualFS.js'; +import { CVFileSystem } from './VirtualFS/CVFileSystem.js'; +import { + chopUrl, + cspellIOToFsProvider, + CVfsDirEntry, + rPad, + VFSErrorUnsupportedRequest, + WrappedProviderFs, +} from './VirtualFS/WrappedProviderFs.js'; + +class CVirtualFS implements VirtualFS { + private readonly providers = new Set(); + private cachedFs = new Map(); + private revCacheFs = new Map>(); + readonly fsc: Required; + readonly fs: Required; + loggingEnabled = debug; + + constructor() { + this.fsc = fsPassThroughCore((url) => this._getFS(url)); + this.fs = new CVFileSystem(this.fsc); + } + + enableLogging(value?: boolean | undefined): void { + this.loggingEnabled = value ?? true; + } + + log = console.log; + logEvent = (event: LogEvent) => { + if (this.loggingEnabled) { + const id = event.traceID.toFixed(13).replaceAll(/\d{4}(?=\d)/g, '$&.'); + const msg = event.message ? `\n\t\t${event.message}` : ''; + const method = rPad(`${event.method}-${event.event}`, 16); + this.log(`${method} ID:${id} ts:${event.ts.toFixed(13)} ${chopUrl(event.url)}${msg}`); + } + }; + + registerFileSystemProvider(...providers: VFileSystemProvider[]): Disposable { + providers.forEach((provider) => this.providers.add(provider)); + this.reset(); + return { + dispose: () => { + for (const provider of providers) { + for (const key of this.revCacheFs.get(provider) || []) { + this.cachedFs.delete(key); + } + this.providers.delete(provider) && undefined; + } + this.reset(); + }, + }; + } + + getFS(url: URL): VFileSystem { + return new CVFileSystem(this._getFS(url)); + } + + private _getFS(url: URL): WrappedProviderFs { + const key = `${url.protocol}${url.hostname}`; + const cached = this.cachedFs.get(key); + if (cached) { + return cached; + } + + const fnNext = (provider: VFileSystemProvider, next: NextProvider) => { + return (url: URL) => { + let calledNext = false; + const fs = provider.getFileSystem(url, (_url) => { + calledNext = calledNext || url === _url; + return next(_url); + }); + if (fs) { + const s = this.revCacheFs.get(provider) || new Set(); + s.add(key); + this.revCacheFs.set(provider, s); + return fs; + } + if (!calledNext) { + return next(url); + } + return undefined; + }; + }; + + let next: NextProvider = (_url: URL) => undefined; + + for (const provider of this.providers) { + next = fnNext(provider, next); + } + + const fs = new WrappedProviderFs(next(url), this.logEvent); + this.cachedFs.set(key, fs); + return fs; + } + + reset(): void { + this.disposeOfCachedFs(); + } + + private disposeOfCachedFs(): void { + for (const [key, fs] of [...this.cachedFs].reverse()) { + try { + WrappedProviderFs.disposeOf(fs); + } catch { + // continue - we are cleaning up. + } + this.cachedFs.delete(key); + } + this.cachedFs.clear(); + this.revCacheFs.clear(); + } + + dispose(): void { + this.disposeOfCachedFs(); + const providers = [...this.providers].reverse(); + for (const provider of providers) { + try { + provider.dispose?.(); + } catch { + // continue - we are cleaning up. + } + } + } +} + +function fsPassThroughCore(fs: (url: URL) => WrappedProviderFs): Required { + function gfs(ur: UrlOrReference, name: string): VFileSystemCore { + const url = urlOrReferenceToUrl(ur); + const f = fs(url); + if (!f.hasProvider) + throw new VFSErrorUnsupportedRequest( + name, + url, + ur instanceof URL ? undefined : { url: ur.url.toString(), encoding: ur.encoding }, + ); + return f; + } + return { + providerInfo: { name: 'default' }, + hasProvider: true, + stat: async (url) => gfs(url, 'stat').stat(url), + readFile: async (url) => gfs(url, 'readFile').readFile(url), + writeFile: async (file) => gfs(file, 'writeFile').writeFile(file), + readDirectory: async (url) => + gfs(url, 'readDirectory') + .readDirectory(url) + .then((entries) => entries.map((e) => new CVfsDirEntry(e))), + getCapabilities: (url) => gfs(url, 'getCapabilities').getCapabilities(url), + }; +} + +export function createVirtualFS(cspellIO?: CSpellIO): VirtualFS { + const cspell = cspellIO || getDefaultCSpellIO(); + const vfs = new CVirtualFS(); + vfs.registerFileSystemProvider(cspellIOToFsProvider(cspell)); + return vfs; +} +let defaultVirtualFs: VirtualFS | undefined = undefined; + +export function getDefaultVirtualFs(): VirtualFS { + if (!defaultVirtualFs) { + defaultVirtualFs = createVirtualFS(); + } + return defaultVirtualFs; +} + +export function getDefaultVFileSystemCore(): VFileSystemCore { + return getDefaultVirtualFs().fsc; +} + +export function getDefaultVFileSystem(): VFileSystem { + return getDefaultVirtualFs().fs; +} diff --git a/packages/cspell-io/src/VFileSystem.ts b/packages/cspell-io/src/VFileSystem.ts new file mode 100644 index 00000000000..817c05217c9 --- /dev/null +++ b/packages/cspell-io/src/VFileSystem.ts @@ -0,0 +1,99 @@ +import type { BufferEncoding, DirEntry, FileReference, FileResource, Stats, TextFileResource } from './models/index.js'; + +export type UrlOrReference = URL | FileReference; + +export enum FSCapabilityFlags { + None = 0, + Stat = 1 << 0, + Read = 1 << 1, + Write = 1 << 2, + ReadWrite = Read | Write, + ReadDir = 1 << 3, + WriteDir = 1 << 4, + ReadWriteDir = ReadDir | WriteDir, +} + +export interface FileSystemProviderInfo { + name: string; +} + +export interface VFileSystemCore { + /** + * Read a file. + * @param url - URL to read + * @param encoding - optional encoding + * @returns A FileResource, the content will not be decoded. Use `.getText()` to get the decoded text. + */ + readFile(url: UrlOrReference, encoding?: BufferEncoding): Promise; + /** + * Write a file + * @param file - the file to write + */ + writeFile(file: FileResource): Promise; + /** + * Get the stats for a url. + * @param url - Url to fetch stats for. + */ + stat(url: UrlOrReference): Promise; + /** + * Read the directory entries for a url. + * The url should end with `/` to indicate a directory. + * @param url - the url to read the directory entries for. + */ + readDirectory(url: URL): Promise; + /** + * Get the capabilities for a URL. + * The capabilities can be more restrictive than the general capabilities of the provider. + * @param url - the url to try + */ + getCapabilities(url: URL): FSCapabilities; + /** + * Information about the provider. + * It is up to the provider to define what information is available. + */ + providerInfo: FileSystemProviderInfo; + /** + * Indicates that a provider was found for the url. + */ + hasProvider: boolean; +} + +export interface VFileSystem extends VFileSystemCore { + findUp( + name: string | string[] | VFindUpPredicate, + from: URL, + options?: VFindUpURLOptions, + ): Promise; +} + +export interface FSCapabilities { + readonly flags: FSCapabilityFlags; + readonly readFile: boolean; + readonly writeFile: boolean; + readonly readDirectory: boolean; + readonly writeDirectory: boolean; + readonly stat: boolean; +} + +export interface VfsStat extends Stats { + isDirectory(): boolean; + isFile(): boolean; + isUnknown(): boolean; + isSymbolicLink(): boolean; +} + +export interface VfsDirEntry extends DirEntry { + isDirectory(): boolean; + isFile(): boolean; + isUnknown(): boolean; + isSymbolicLink(): boolean; +} + +export type VFindEntryType = 'file' | 'directory' | '!file' | '!directory'; + +export interface VFindUpURLOptions { + type?: VFindEntryType; + stopAt?: URL; +} + +export type VFindUpPredicate = (dir: URL) => URL | undefined | Promise; diff --git a/packages/cspell-io/src/VirtualFS.ts b/packages/cspell-io/src/VirtualFS.ts index 48a3f02f3a3..91fa9a5d53e 100644 --- a/packages/cspell-io/src/VirtualFS.ts +++ b/packages/cspell-io/src/VirtualFS.ts @@ -1,22 +1,16 @@ -import { createTextFileResource, urlOrReferenceToUrl } from './common/index.js'; -import type { CSpellIO } from './CSpellIO.js'; -import { getDefaultCSpellIO } from './CSpellIONode.js'; +import type { DirEntry, Disposable, FileReference, FileResource, Stats } from './models/index.js'; import type { - BufferEncoding, - DirEntry, - Disposable, - FileReference, - FileResource, - Stats, - TextFileResource, -} from './models/index.js'; -import { FileType } from './models/index.js'; + FileSystemProviderInfo, + FSCapabilities, + FSCapabilityFlags, + UrlOrReference, + VFileSystem, + VFileSystemCore, +} from './VFileSystem.js'; -type UrlOrReference = URL | FileReference; +export type NextProvider = (url: URL) => VProviderFileSystem | undefined; -type NextProvider = (url: URL) => VProviderFileSystem | undefined; - -const debug = false; +export const debug = false; export interface VirtualFS extends Disposable { registerFileSystemProvider(provider: VFileSystemProvider, ...providers: VFileSystemProvider[]): Disposable; @@ -30,6 +24,11 @@ export interface VirtualFS extends Disposable { */ readonly fs: Required; + /** + * The file system core. All requests will first use getFileSystem to get the file system before making the request. + */ + readonly fsc: Required; + /** * Clear the cache of file systems. */ @@ -43,62 +42,6 @@ export interface VirtualFS extends Disposable { enableLogging(value?: boolean): void; } -export enum FSCapabilityFlags { - None = 0, - Stat = 1 << 0, - Read = 1 << 1, - Write = 1 << 2, - ReadWrite = Read | Write, - ReadDir = 1 << 3, - WriteDir = 1 << 4, - ReadWriteDir = ReadDir | WriteDir, -} - -interface FileSystemProviderInfo { - name: string; -} - -export interface VFileSystem { - /** - * Read a file. - * @param url - URL to read - * @param encoding - optional encoding - * @returns A FileResource, the content will not be decoded. Use `.getText()` to get the decoded text. - */ - readFile(url: UrlOrReference, encoding?: BufferEncoding): Promise; - /** - * Write a file - * @param file - the file to write - */ - writeFile(file: FileResource): Promise; - /** - * Get the stats for a url. - * @param url - Url to fetch stats for. - */ - stat(url: UrlOrReference): Promise; - /** - * Read the directory entries for a url. - * The url should end with `/` to indicate a directory. - * @param url - the url to read the directory entries for. - */ - readDirectory(url: URL): Promise; - /** - * Get the capabilities for a URL. - * The capabilities can be more restrictive than the general capabilities of the provider. - * @param url - the url to try - */ - getCapabilities(url: URL): FSCapabilities; - /** - * Information about the provider. - * It is up to the provider to define what information is available. - */ - providerInfo: FileSystemProviderInfo; - /** - * Indicates that a provider was found for the url. - */ - hasProvider: boolean; -} - export interface VProviderFileSystem extends Disposable { readFile(url: UrlOrReference): Promise; writeFile(file: FileResource): Promise; @@ -134,476 +77,3 @@ export interface VFileSystemProvider extends Partial { */ getFileSystem(url: URL, next: NextProvider): VProviderFileSystem | undefined; } - -class CVirtualFS implements VirtualFS { - private readonly providers = new Set(); - private cachedFs = new Map(); - private revCacheFs = new Map>(); - readonly fs: Required; - loggingEnabled = debug; - - constructor() { - this.fs = fsPassThrough((url) => this._getFS(url)); - } - - enableLogging(value?: boolean | undefined): void { - this.loggingEnabled = value ?? true; - } - - log = console.log; - logEvent = (event: LogEvent) => { - if (this.loggingEnabled) { - const id = event.traceID.toFixed(13).replaceAll(/\d{4}(?=\d)/g, '$&.'); - const msg = event.message ? `\n\t\t${event.message}` : ''; - const method = rPad(`${event.method}-${event.event}`, 16); - this.log(`${method} ID:${id} ts:${event.ts.toFixed(13)} ${chopUrl(event.url)}${msg}`); - } - }; - - registerFileSystemProvider(...providers: VFileSystemProvider[]): Disposable { - providers.forEach((provider) => this.providers.add(provider)); - this.reset(); - return { - dispose: () => { - for (const provider of providers) { - for (const key of this.revCacheFs.get(provider) || []) { - this.cachedFs.delete(key); - } - this.providers.delete(provider) && undefined; - } - this.reset(); - }, - }; - } - - getFS(url: URL): VFileSystem { - return this._getFS(url); - } - - private _getFS(url: URL): WrappedProviderFs { - const key = `${url.protocol}${url.hostname}`; - - const cached = this.cachedFs.get(key); - if (cached) { - return cached; - } - - const fnNext = (provider: VFileSystemProvider, next: NextProvider) => { - return (url: URL) => { - let calledNext = false; - const fs = provider.getFileSystem(url, (_url) => { - calledNext = calledNext || url === _url; - return next(_url); - }); - if (fs) { - const s = this.revCacheFs.get(provider) || new Set(); - s.add(key); - this.revCacheFs.set(provider, s); - return fs; - } - if (!calledNext) { - return next(url); - } - return undefined; - }; - }; - - let next: NextProvider = (_url: URL) => undefined; - - for (const provider of this.providers) { - next = fnNext(provider, next); - } - - const fs = new WrappedProviderFs(next(url), this.logEvent); - this.cachedFs.set(key, fs); - return fs; - } - - reset(): void { - this.cachedFs.clear(); - this.revCacheFs.clear(); - this.disposeOfCachedFs(); - } - - private disposeOfCachedFs(): void { - for (const [key, fs] of [...this.cachedFs].reverse()) { - try { - WrappedProviderFs.disposeOf(fs); - } catch { - // continue - we are cleaning up. - } - this.cachedFs.delete(key); - } - this.cachedFs.clear(); - } - - dispose(): void { - this.disposeOfCachedFs(); - const providers = [...this.providers].reverse(); - for (const provider of providers) { - try { - provider.dispose?.(); - } catch { - // continue - we are cleaning up. - } - } - } -} - -function fsPassThrough(fs: (url: URL) => WrappedProviderFs): Required { - function gfs(ur: UrlOrReference, name: string): VFileSystem { - const url = urlOrReferenceToUrl(ur); - const f = fs(url); - if (!f.hasProvider) - throw new VFSErrorUnsupportedRequest( - name, - url, - ur instanceof URL ? undefined : { url: ur.url.toString(), encoding: ur.encoding }, - ); - return f; - } - return { - providerInfo: { name: 'default' }, - hasProvider: true, - stat: async (url) => gfs(url, 'stat').stat(url), - readFile: async (url) => gfs(url, 'readFile').readFile(url), - writeFile: async (file) => gfs(file, 'writeFile').writeFile(file), - readDirectory: async (url) => - gfs(url, 'readDirectory') - .readDirectory(url) - .then((entries) => entries.map((e) => new CVfsDirEntry(e))), - getCapabilities: (url) => gfs(url, 'getCapabilities').getCapabilities(url), - }; -} - -export function createVirtualFS(cspellIO?: CSpellIO): VirtualFS { - const cspell = cspellIO || getDefaultCSpellIO(); - const vfs = new CVirtualFS(); - vfs.registerFileSystemProvider(cspellIOToFsProvider(cspell)); - return vfs; -} - -function cspellIOToFsProvider(cspellIO: CSpellIO): VFileSystemProvider { - const capabilities = FSCapabilityFlags.Stat | FSCapabilityFlags.ReadWrite | FSCapabilityFlags.ReadDir; - const capabilitiesHttp = capabilities & ~FSCapabilityFlags.Write & ~FSCapabilityFlags.ReadDir; - const capMap: Record = { - 'file:': capabilities, - 'http:': capabilitiesHttp, - 'https:': capabilitiesHttp, - }; - const name = 'CSpellIO'; - const supportedProtocols = new Set(['file:', 'http:', 'https:']); - const fs: VProviderFileSystem = { - providerInfo: { name }, - stat: (url) => cspellIO.getStat(url), - readFile: (url) => cspellIO.readFile(url), - readDirectory: (url) => cspellIO.readDirectory(url), - writeFile: (file) => cspellIO.writeFile(file.url, file.content), - dispose: () => undefined, - capabilities, - getCapabilities(url) { - return fsCapabilities(capMap[url.protocol] || FSCapabilityFlags.None); - }, - }; - - return { - name, - getFileSystem: (url, _next) => { - return supportedProtocols.has(url.protocol) ? fs : undefined; - }, - }; -} - -let defaultVirtualFs: VirtualFS | undefined = undefined; - -export function getDefaultVirtualFs(): VirtualFS { - if (!defaultVirtualFs) { - defaultVirtualFs = createVirtualFS(); - } - return defaultVirtualFs; -} - -function wrapError(e: unknown): unknown { - if (e instanceof VFSError) return e; - // return new VFSError(e instanceof Error ? e.message : String(e), { cause: e }); - return e; -} - -export class VFSError extends Error { - constructor(message: string, options?: { cause?: unknown }) { - super(message, options); - } -} - -export class VFSErrorUnsupportedRequest extends VFSError { - public readonly url?: string | undefined; - - constructor( - public readonly request: string, - url?: URL | string, - public readonly parameters?: unknown, - ) { - super(`Unsupported request: ${request}`); - this.url = url?.toString(); - } -} - -export interface FSCapabilities { - readonly flags: FSCapabilityFlags; - readonly readFile: boolean; - readonly writeFile: boolean; - readonly readDirectory: boolean; - readonly writeDirectory: boolean; - readonly stat: boolean; -} - -class CFsCapabilities { - constructor(readonly flags: FSCapabilityFlags) {} - - get readFile(): boolean { - return !!(this.flags & FSCapabilityFlags.Read); - } - - get writeFile(): boolean { - return !!(this.flags & FSCapabilityFlags.Write); - } - - get readDirectory(): boolean { - return !!(this.flags & FSCapabilityFlags.ReadDir); - } - - get writeDirectory(): boolean { - return !!(this.flags & FSCapabilityFlags.WriteDir); - } - - get stat(): boolean { - return !!(this.flags & FSCapabilityFlags.Stat); - } -} - -export function fsCapabilities(flags: FSCapabilityFlags): FSCapabilities { - return new CFsCapabilities(flags); -} - -type EventMethods = 'stat' | 'readFile' | 'writeFile' | 'readDir'; -type LogEvents = 'start' | 'end' | 'error' | 'other'; - -interface LogEvent { - /** - * The request method - */ - method: EventMethods; - event: LogEvents; - message?: string | undefined; - /** - * The trace id can be used to link request and response events. - * The trace id is unique for a given request. - */ - traceID: number; - /** - * The request url - */ - url?: URL | undefined; - /** - * The time in milliseconds, see `performance.now()` - */ - ts: number; -} - -class WrappedProviderFs implements VFileSystem { - readonly hasProvider: boolean; - readonly capabilities: FSCapabilityFlags; - readonly providerInfo: FileSystemProviderInfo; - private _capabilities: FSCapabilities; - constructor( - private readonly fs: VProviderFileSystem | undefined, - readonly eventLogger: (event: LogEvent) => void, - ) { - this.hasProvider = !!fs; - this.capabilities = fs?.capabilities || FSCapabilityFlags.None; - this._capabilities = fsCapabilities(this.capabilities); - this.providerInfo = fs?.providerInfo || { name: 'unknown' }; - } - - private logEvent(method: EventMethods, event: LogEvents, traceID: number, url: URL, message?: string): void { - this.eventLogger({ method, event, url, traceID, ts: performance.now(), message }); - } - - getCapabilities(url: URL): FSCapabilities { - if (this.fs?.getCapabilities) return this.fs.getCapabilities(url); - - return this._capabilities; - } - - async stat(urlRef: UrlOrReference): Promise { - const traceID = performance.now(); - const url = urlOrReferenceToUrl(urlRef); - this.logEvent('stat', 'start', traceID, url); - try { - checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Stat, 'stat', url); - return new CVfsStat(await this.fs.stat(urlRef)); - } catch (e) { - this.logEvent('stat', 'error', traceID, url, e instanceof Error ? e.message : ''); - throw wrapError(e); - } finally { - this.logEvent('stat', 'end', traceID, url); - } - } - - async readFile(urlRef: UrlOrReference, encoding?: BufferEncoding): Promise { - const traceID = performance.now(); - const url = urlOrReferenceToUrl(urlRef); - this.logEvent('readFile', 'start', traceID, url); - try { - checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Read, 'readFile', url); - return createTextFileResource(await this.fs.readFile(urlRef), encoding); - } catch (e) { - this.logEvent('readFile', 'error', traceID, url, e instanceof Error ? e.message : ''); - throw wrapError(e); - } finally { - this.logEvent('readFile', 'end', traceID, url); - } - } - - async readDirectory(url: URL): Promise { - const traceID = performance.now(); - this.logEvent('readDir', 'start', traceID, url); - try { - checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.ReadDir, 'readDirectory', url); - return (await this.fs.readDirectory(url)).map((e) => new CVfsDirEntry(e)); - } catch (e) { - this.logEvent('readDir', 'error', traceID, url, e instanceof Error ? e.message : ''); - throw wrapError(e); - } finally { - this.logEvent('readDir', 'end', traceID, url); - } - } - - async writeFile(file: FileResource): Promise { - const traceID = performance.now(); - const url = file.url; - this.logEvent('writeFile', 'start', traceID, url); - try { - checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Write, 'writeFile', file.url); - return await this.fs.writeFile(file); - } catch (e) { - this.logEvent('writeFile', 'error', traceID, url, e instanceof Error ? e.message : ''); - throw wrapError(e); - } finally { - this.logEvent('writeFile', 'end', traceID, url); - } - } - - static disposeOf(fs: VFileSystem): void { - fs instanceof WrappedProviderFs && fs.fs?.dispose(); - } -} - -function checkCapabilityOrThrow( - fs: VProviderFileSystem | undefined, - capabilities: FSCapabilityFlags, - flag: FSCapabilityFlags, - name: string, - url: URL, -): asserts fs is VProviderFileSystem { - if (!(capabilities & flag)) { - throw new VFSErrorUnsupportedRequest(name, url); - } -} - -export interface VfsStat extends Stats { - isDirectory(): boolean; - isFile(): boolean; - isUnknown(): boolean; - isSymbolicLink(): boolean; -} - -export interface VfsDirEntry extends DirEntry { - isDirectory(): boolean; - isFile(): boolean; - isUnknown(): boolean; - isSymbolicLink(): boolean; -} - -class CFileType { - constructor(readonly fileType: FileType) {} - - isFile(): boolean { - return this.fileType === FileType.File; - } - - isDirectory(): boolean { - return this.fileType === FileType.Directory; - } - - isUnknown(): boolean { - return !this.fileType; - } - - isSymbolicLink(): boolean { - return !!(this.fileType & FileType.SymbolicLink); - } -} - -class CVfsStat extends CFileType implements VfsStat { - constructor(private stat: Stats) { - super(stat.fileType || FileType.Unknown); - } - - get size(): number { - return this.stat.size; - } - - get mtimeMs(): number { - return this.stat.mtimeMs; - } - - get eTag(): string | undefined { - return this.stat.eTag; - } -} - -class CVfsDirEntry extends CFileType implements VfsDirEntry { - private _url: URL | undefined; - constructor(private entry: DirEntry) { - super(entry.fileType); - } - - get name(): string { - return this.entry.name; - } - - get dir(): URL { - return this.entry.dir; - } - - get url(): URL { - if (this._url) return this._url; - this._url = new URL(this.entry.name, this.entry.dir); - return this._url; - } - - toJSON(): DirEntry { - return { - name: this.name, - dir: this.dir, - fileType: this.fileType, - }; - } -} - -function chopUrl(url: URL | undefined): string { - if (!url) return ''; - const href = url.href; - const parts = href.split('/'); - const n = parts.indexOf('node_modules'); - if (n > 0) { - const tail = parts.slice(Math.max(parts.length - 3, n + 1)); - return parts.slice(0, n + 1).join('/') + '/…/' + tail.join('/'); - } - return href; -} - -function rPad(str: string, len: number, ch = ' '): string { - return str + ch.repeat(Math.max(0, len - str.length)); -} diff --git a/packages/cspell-io/src/VirtualFS/CVFileSystem.test.ts b/packages/cspell-io/src/VirtualFS/CVFileSystem.test.ts new file mode 100644 index 00000000000..03dd77c4fc1 --- /dev/null +++ b/packages/cspell-io/src/VirtualFS/CVFileSystem.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, test } from 'vitest'; + +import { getDefaultVFileSystemCore } from '../CVirtualFS.js'; +import { CVFileSystem } from './CVFileSystem.js'; + +describe('CVFileSystem', () => { + test('CVFileSystem', () => { + const vfs = new CVFileSystem(getDefaultVFileSystemCore()); + expect(vfs).toBeDefined(); + expect(vfs.findUp).toBeInstanceOf(Function); + }); + + test('findUp', async () => { + const vfs = new CVFileSystem(getDefaultVFileSystemCore()); + const result = await vfs.findUp('README.md', new URL(import.meta.url)); + expect(result?.href).toEqual(expect.stringContaining('cspell-io/README.md')); + }); +}); diff --git a/packages/cspell-io/src/VirtualFS/CVFileSystem.ts b/packages/cspell-io/src/VirtualFS/CVFileSystem.ts new file mode 100644 index 00000000000..8f4c7a22abb --- /dev/null +++ b/packages/cspell-io/src/VirtualFS/CVFileSystem.ts @@ -0,0 +1,38 @@ +import { VFileSystem, VFileSystemCore, VFindUpPredicate, VFindUpURLOptions } from '../VFileSystem.js'; +import { findUpFromUrl } from './findUpFromUrl.js'; + +export class CVFileSystem implements VFileSystem { + #core: VFileSystemCore; + + readFile: VFileSystem['readFile']; + writeFile: VFileSystem['writeFile']; + stat: VFileSystem['stat']; + readDirectory: VFileSystem['readDirectory']; + getCapabilities: VFileSystem['getCapabilities']; + + constructor(core: VFileSystemCore) { + this.#core = core; + this.readFile = this.#core.readFile.bind(this.#core); + this.writeFile = this.#core.writeFile.bind(this.#core); + this.stat = this.#core.stat.bind(this.#core); + this.readDirectory = this.#core.readDirectory.bind(this.#core); + this.getCapabilities = this.#core.getCapabilities.bind(this.#core); + } + + get providerInfo(): VFileSystem['providerInfo'] { + return this.#core.providerInfo; + } + + get hasProvider(): VFileSystem['hasProvider'] { + return this.#core.hasProvider; + } + + findUp( + name: string | string[] | VFindUpPredicate, + from: URL, + options: VFindUpURLOptions = {}, + ): Promise { + const opts = { ...options, fs: this.#core }; + return findUpFromUrl(name, from, opts); + } +} diff --git a/packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts b/packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts new file mode 100644 index 00000000000..f0b70676e4a --- /dev/null +++ b/packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts @@ -0,0 +1,284 @@ +import { createTextFileResource, urlOrReferenceToUrl } from '../common/index.js'; +import type { CSpellIO } from '../CSpellIO.js'; +import type { + BufferEncoding, + DirEntry, + FileReference, + FileResource, + Stats, + TextFileResource, +} from '../models/index.js'; +import { FileType } from '../models/index.js'; +import type { EventMethods, LogEvent, LogEvents } from '../models/LogEvent.js'; +import { + FileSystemProviderInfo, + FSCapabilities, + FSCapabilityFlags, + UrlOrReference, + VFileSystemCore, + VfsDirEntry, + VfsStat, +} from '../VFileSystem.js'; +import { VFileSystemProvider, VProviderFileSystem } from '../VirtualFS.js'; + +export function cspellIOToFsProvider(cspellIO: CSpellIO): VFileSystemProvider { + const capabilities = FSCapabilityFlags.Stat | FSCapabilityFlags.ReadWrite | FSCapabilityFlags.ReadDir; + const capabilitiesHttp = capabilities & ~FSCapabilityFlags.Write & ~FSCapabilityFlags.ReadDir; + const capMap: Record = { + 'file:': capabilities, + 'http:': capabilitiesHttp, + 'https:': capabilitiesHttp, + }; + const name = 'CSpellIO'; + const supportedProtocols = new Set(['file:', 'http:', 'https:']); + const fs: VProviderFileSystem = { + providerInfo: { name }, + stat: (url) => cspellIO.getStat(url), + readFile: (url) => cspellIO.readFile(url), + readDirectory: (url) => cspellIO.readDirectory(url), + writeFile: (file) => cspellIO.writeFile(file.url, file.content), + dispose: () => undefined, + capabilities, + getCapabilities(url) { + return fsCapabilities(capMap[url.protocol] || FSCapabilityFlags.None); + }, + }; + + return { + name, + getFileSystem: (url, _next) => { + return supportedProtocols.has(url.protocol) ? fs : undefined; + }, + }; +} + +function wrapError(e: unknown): unknown { + if (e instanceof VFSError) return e; + // return new VFSError(e instanceof Error ? e.message : String(e), { cause: e }); + return e; +} + +export class VFSError extends Error { + constructor(message: string, options?: { cause?: unknown }) { + super(message, options); + } +} + +export class VFSErrorUnsupportedRequest extends VFSError { + public readonly url?: string | undefined; + + constructor( + public readonly request: string, + url?: URL | string, + public readonly parameters?: unknown, + ) { + super(`Unsupported request: ${request}`); + this.url = url?.toString(); + } +} + +class CFsCapabilities { + constructor(readonly flags: FSCapabilityFlags) {} + + get readFile(): boolean { + return !!(this.flags & FSCapabilityFlags.Read); + } + + get writeFile(): boolean { + return !!(this.flags & FSCapabilityFlags.Write); + } + + get readDirectory(): boolean { + return !!(this.flags & FSCapabilityFlags.ReadDir); + } + + get writeDirectory(): boolean { + return !!(this.flags & FSCapabilityFlags.WriteDir); + } + + get stat(): boolean { + return !!(this.flags & FSCapabilityFlags.Stat); + } +} + +export function fsCapabilities(flags: FSCapabilityFlags): FSCapabilities { + return new CFsCapabilities(flags); +} + +export class WrappedProviderFs implements VFileSystemCore { + readonly hasProvider: boolean; + readonly capabilities: FSCapabilityFlags; + readonly providerInfo: FileSystemProviderInfo; + private _capabilities: FSCapabilities; + constructor( + private readonly fs: VProviderFileSystem | undefined, + readonly eventLogger: (event: LogEvent) => void, + ) { + this.hasProvider = !!fs; + this.capabilities = fs?.capabilities || FSCapabilityFlags.None; + this._capabilities = fsCapabilities(this.capabilities); + this.providerInfo = fs?.providerInfo || { name: 'unknown' }; + } + + private logEvent(method: EventMethods, event: LogEvents, traceID: number, url: URL, message?: string): void { + this.eventLogger({ method, event, url, traceID, ts: performance.now(), message }); + } + + getCapabilities(url: URL): FSCapabilities { + if (this.fs?.getCapabilities) return this.fs.getCapabilities(url); + + return this._capabilities; + } + + async stat(urlRef: UrlOrReference): Promise { + const traceID = performance.now(); + const url = urlOrReferenceToUrl(urlRef); + this.logEvent('stat', 'start', traceID, url); + try { + checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Stat, 'stat', url); + return new CVfsStat(await this.fs.stat(urlRef)); + } catch (e) { + this.logEvent('stat', 'error', traceID, url, e instanceof Error ? e.message : ''); + throw wrapError(e); + } finally { + this.logEvent('stat', 'end', traceID, url); + } + } + + async readFile(urlRef: UrlOrReference, encoding?: BufferEncoding): Promise { + const traceID = performance.now(); + const url = urlOrReferenceToUrl(urlRef); + this.logEvent('readFile', 'start', traceID, url); + try { + checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Read, 'readFile', url); + return createTextFileResource(await this.fs.readFile(urlRef), encoding); + } catch (e) { + this.logEvent('readFile', 'error', traceID, url, e instanceof Error ? e.message : ''); + throw wrapError(e); + } finally { + this.logEvent('readFile', 'end', traceID, url); + } + } + + async readDirectory(url: URL): Promise { + const traceID = performance.now(); + this.logEvent('readDir', 'start', traceID, url); + try { + checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.ReadDir, 'readDirectory', url); + return (await this.fs.readDirectory(url)).map((e) => new CVfsDirEntry(e)); + } catch (e) { + this.logEvent('readDir', 'error', traceID, url, e instanceof Error ? e.message : ''); + throw wrapError(e); + } finally { + this.logEvent('readDir', 'end', traceID, url); + } + } + + async writeFile(file: FileResource): Promise { + const traceID = performance.now(); + const url = file.url; + this.logEvent('writeFile', 'start', traceID, url); + try { + checkCapabilityOrThrow(this.fs, this.capabilities, FSCapabilityFlags.Write, 'writeFile', file.url); + return await this.fs.writeFile(file); + } catch (e) { + this.logEvent('writeFile', 'error', traceID, url, e instanceof Error ? e.message : ''); + throw wrapError(e); + } finally { + this.logEvent('writeFile', 'end', traceID, url); + } + } + + static disposeOf(fs: V): void { + fs instanceof WrappedProviderFs && fs.fs?.dispose(); + } +} +function checkCapabilityOrThrow( + fs: VProviderFileSystem | undefined, + capabilities: FSCapabilityFlags, + flag: FSCapabilityFlags, + name: string, + url: URL, +): asserts fs is VProviderFileSystem { + if (!(capabilities & flag)) { + throw new VFSErrorUnsupportedRequest(name, url); + } +} +class CFileType { + constructor(readonly fileType: FileType) {} + + isFile(): boolean { + return this.fileType === FileType.File; + } + + isDirectory(): boolean { + return this.fileType === FileType.Directory; + } + + isUnknown(): boolean { + return !this.fileType; + } + + isSymbolicLink(): boolean { + return !!(this.fileType & FileType.SymbolicLink); + } +} +class CVfsStat extends CFileType implements VfsStat { + constructor(private stat: Stats) { + super(stat.fileType || FileType.Unknown); + } + + get size(): number { + return this.stat.size; + } + + get mtimeMs(): number { + return this.stat.mtimeMs; + } + + get eTag(): string | undefined { + return this.stat.eTag; + } +} +export class CVfsDirEntry extends CFileType implements VfsDirEntry { + private _url: URL | undefined; + constructor(private entry: DirEntry) { + super(entry.fileType); + } + + get name(): string { + return this.entry.name; + } + + get dir(): URL { + return this.entry.dir; + } + + get url(): URL { + if (this._url) return this._url; + this._url = new URL(this.entry.name, this.entry.dir); + return this._url; + } + + toJSON(): DirEntry { + return { + name: this.name, + dir: this.dir, + fileType: this.fileType, + }; + } +} +export function chopUrl(url: URL | undefined): string { + if (!url) return ''; + const href = url.href; + const parts = href.split('/'); + const n = parts.indexOf('node_modules'); + if (n > 0) { + const tail = parts.slice(Math.max(parts.length - 3, n + 1)); + return parts.slice(0, n + 1).join('/') + '/…/' + tail.join('/'); + } + return href; +} +export function rPad(str: string, len: number, ch = ' '): string { + return str.padEnd(len, ch); +} diff --git a/packages/cspell-io/src/VirtualFS/findUpFromUrl.test.ts b/packages/cspell-io/src/VirtualFS/findUpFromUrl.test.ts new file mode 100644 index 00000000000..d5452747de7 --- /dev/null +++ b/packages/cspell-io/src/VirtualFS/findUpFromUrl.test.ts @@ -0,0 +1,68 @@ +import { pathToFileURL } from 'node:url'; + +import { describe, expect, test, vi } from 'vitest'; + +import { getDefaultVFileSystemCore } from '../CVirtualFS.js'; +import { findUpFromUrl } from './findUpFromUrl.js'; + +const cwdURL = pathToFileURL('./'); + +const __fileURL = new URL(import.meta.url); +const __dirURL = new URL('.', __fileURL); +const packageRoot = new URL('../..', __dirURL); +const reposRoot = new URL('../..', packageRoot); + +const fs = getDefaultVFileSystemCore(); + +describe('findUpFromUrl', () => { + test('should find the file in the current directory', async () => { + const result = await findUpFromUrl('README.md', __dirURL, { fs }); + expect(result).toEqual(new URL('README.md', packageRoot)); + }); + + test('should find the `samples` in the current directory', async () => { + const result = await findUpFromUrl('samples', __dirURL, { fs, type: 'directory' }); + expect(result).toEqual(resolve(packageRoot, './samples')); + }); + + test('should find the directory in the current directory', async () => { + const result = await findUpFromUrl('samples', packageRoot, { fs, type: 'directory' }); + expect(result).toEqual(resolve(packageRoot, './samples')); + }); + + test('should stop searching at the specified directory', async () => { + const result = await findUpFromUrl('eslint.config.mjs', __dirURL, { fs, stopAt: reposRoot }); + expect(result).toEqual(new URL('eslint.config.mjs', reposRoot)); + }); + + test('should stop searching at the specified directory', async () => { + const result = await findUpFromUrl('eslint.config.mjs', __dirURL, { fs, stopAt: packageRoot }); + expect(result).toBeUndefined(); + }); + + test('should return undefined if the file or directory is not found', async () => { + const result = await findUpFromUrl('nonexistent.txt', __dirURL, { fs }); + expect(result).toBeUndefined(); + }); + + test('using a predicate', async () => { + const predicate = vi.fn((dir: URL) => (dir.href === packageRoot.href ? new URL('found', dir) : undefined)); + const result = await findUpFromUrl(predicate, __dirURL, { fs }); + expect(result).toStrictEqual(new URL('found', packageRoot)); + }); + + test.each` + name | cwd | expected + ${'README.md'} | ${undefined} | ${resolve(packageRoot, 'README.md')} + ${'README.md'} | ${'../'} | ${resolve(reposRoot, 'README.md')} + ${['samples', 'package.json']} | ${__dirURL} | ${resolve(packageRoot, 'package.json')} + `('findUp $name $cwd', async ({ name, cwd, expected }) => { + const url = cwd instanceof URL ? cwd : cwd ? pathToFileURL(cwd) : cwdURL; + const result = await findUpFromUrl(name, url, { fs }); + expect(result).toEqual(expected); + }); +}); + +function resolve(root: URL, ...parts: string[]) { + return new URL(parts.join('/'), root); +} diff --git a/packages/cspell-io/src/VirtualFS/findUpFromUrl.ts b/packages/cspell-io/src/VirtualFS/findUpFromUrl.ts new file mode 100644 index 00000000000..26f01c30f4e --- /dev/null +++ b/packages/cspell-io/src/VirtualFS/findUpFromUrl.ts @@ -0,0 +1,61 @@ +import type { VFileSystemCore, VFindEntryType, VFindUpURLOptions } from '../VFileSystem.js'; + +export type FindUpFileSystem = Pick; + +export interface FindUpURLOptions extends VFindUpURLOptions { + fs: FindUpFileSystem; +} + +export type FindUpPredicate = (dir: URL) => URL | undefined | Promise; + +export async function findUpFromUrl( + name: string | string[] | FindUpPredicate, + from: URL, + options: FindUpURLOptions, +): Promise { + const { type: entryType = 'file', stopAt, fs } = options; + let dir = new URL('.', from); + const root = new URL('/', dir); + const predicate = makePredicate(fs, name, entryType); + const stopAtDir = stopAt || root; + + let last = ''; + while (dir.href !== last) { + const found = await predicate(dir); + if (found !== undefined) return found; + last = dir.href; + if (dir.href === root.href || dir.href === stopAtDir.href) break; + dir = new URL('..', dir); + } + return undefined; +} + +function makePredicate( + fs: FindUpFileSystem, + name: string | string[] | FindUpPredicate, + entryType: VFindEntryType, +): FindUpPredicate { + if (typeof name === 'function') return name; + + const checkStat = entryType === 'file' || entryType === '!file' ? 'isFile' : 'isDirectory'; + const checkValue = entryType.startsWith('!') ? false : true; + + function checkName(dir: URL, name: string) { + const f = new URL(name, dir); + return fs + .stat(f) + .then((stats) => ((stats.isUnknown() || stats[checkStat]() === checkValue) && f) || undefined) + .catch(() => undefined); + } + + if (!Array.isArray(name)) return (dir) => checkName(dir, name); + + return async (dir) => { + const pending = name.map((n) => checkName(dir, n)); + for (const p of pending) { + const found = await p; + if (found) return found; + } + return undefined; + }; +} diff --git a/packages/cspell-io/src/VirtualFS/redirectProvider.test.ts b/packages/cspell-io/src/VirtualFS/redirectProvider.test.ts index 1b285625bd5..e56caf1c93e 100644 --- a/packages/cspell-io/src/VirtualFS/redirectProvider.test.ts +++ b/packages/cspell-io/src/VirtualFS/redirectProvider.test.ts @@ -3,11 +3,13 @@ import assert from 'node:assert'; import { describe, expect, test, vi } from 'vitest'; import { CFileResource, renameFileResource } from '../common/index.js'; +import { createVirtualFS } from '../CVirtualFS.js'; import { toURL, urlBasename } from '../node/file/url.js'; import { makePathToURL, pathToSampleURL, pathToTempURL } from '../test/test.helper.js'; +import { FSCapabilityFlags } from '../VFileSystem.js'; import type { VProviderFileSystem } from '../VirtualFS.js'; -import { createVirtualFS, FSCapabilityFlags, VFSErrorUnsupportedRequest } from '../VirtualFS.js'; import { createRedirectProvider } from './redirectProvider.js'; +import { VFSErrorUnsupportedRequest } from './WrappedProviderFs.js'; const samplesURL = pathToSampleURL(); diff --git a/packages/cspell-io/src/VirtualFS/redirectProvider.ts b/packages/cspell-io/src/VirtualFS/redirectProvider.ts index 3aee51e44de..cedcfdd13b4 100644 --- a/packages/cspell-io/src/VirtualFS/redirectProvider.ts +++ b/packages/cspell-io/src/VirtualFS/redirectProvider.ts @@ -2,8 +2,9 @@ import assert from 'node:assert'; import { renameFileReference, renameFileResource, urlOrReferenceToUrl } from '../common/index.js'; import type { DirEntry, FileReference, FileResource } from '../models/index.js'; -import type { FSCapabilityFlags, VFileSystemProvider, VProviderFileSystem } from '../VirtualFS.js'; -import { fsCapabilities, VFSErrorUnsupportedRequest } from '../VirtualFS.js'; +import type { FSCapabilityFlags } from '../VFileSystem.js'; +import type { VFileSystemProvider, VProviderFileSystem } from '../VirtualFS.js'; +import { fsCapabilities, VFSErrorUnsupportedRequest } from './WrappedProviderFs.js'; type UrlOrReference = URL | FileReference; diff --git a/packages/cspell-io/src/VirtualFs.test.ts b/packages/cspell-io/src/VirtualFs.test.ts index 40157559500..9b31e5653d1 100644 --- a/packages/cspell-io/src/VirtualFs.test.ts +++ b/packages/cspell-io/src/VirtualFs.test.ts @@ -4,11 +4,13 @@ import { basename } from 'node:path'; import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { CFileResource } from './common/index.js'; +import { createVirtualFS, getDefaultVFileSystem } from './CVirtualFS.js'; import { FileType } from './models/Stats.js'; import { toFileURL, urlBasename } from './node/file/url.js'; import { pathToSample as ps } from './test/test.helper.js'; +import { FSCapabilityFlags } from './VFileSystem.js'; import type { VFileSystemProvider, VirtualFS, VProviderFileSystem } from './VirtualFS.js'; -import { createVirtualFS, FSCapabilityFlags, getDefaultVirtualFs, VFSErrorUnsupportedRequest } from './VirtualFS.js'; +import { VFSErrorUnsupportedRequest } from './VirtualFS/WrappedProviderFs.js'; const sc = expect.stringContaining; const oc = expect.objectContaining; @@ -173,7 +175,7 @@ describe('VirtualFs', () => { ${ps('cities.txt.gz')} | ${'cities.txt.gz'} | ${sc('San Francisco\n')} `('readFile $filename', async ({ filename, content, baseFilename }) => { const url = toFileURL(filename); - const fs = getDefaultVirtualFs().fs; + const fs = getDefaultVFileSystem(); const expected = { url, content, baseFilename }; const result = await fs.readFile(url); const gz = filename.endsWith('.gz') || undefined; @@ -190,7 +192,7 @@ describe('VirtualFs', () => { ${ps('cities.not_found.txt.gz')} | ${oc({ code: 'ENOENT' })} `('readFile not found $filename', async ({ filename, expected }) => { const url = toFileURL(filename); - const fs = getDefaultVirtualFs().fs; + const fs = getDefaultVFileSystem(); await expect(fs.readFile(url)).rejects.toEqual(expected); }); @@ -200,7 +202,7 @@ describe('VirtualFs', () => { ${ps('link.txt')} | ${oc({ mtimeMs: expect.any(Number), size: expect.any(Number), fileType: 1 }) /* links are resolved */} `('getStat $url', async ({ url, expected }) => { url = toFileURL(url); - const fs = getDefaultVirtualFs().fs; + const fs = getDefaultVFileSystem(); const s = await fs.stat(url); expect(mockConsoleLog).not.toHaveBeenCalled(); expect(s).toEqual(expected); @@ -232,9 +234,9 @@ describe('VirtualFs', () => { url | expected ${'https://raw.gitubusrcotent.com/streetsidesoftware/cspell/main/tsconfig.json'} | ${oc({ code: 'ENOTFOUND' })} ${ps(__dirname, 'not-found.nf')} | ${oc({ code: 'ENOENT' })} - `('getStat with error $url', async ({ url, expected }) => { + `('getStat with error $url', { timeout: 30_000 }, async ({ url, expected }) => { url = toFileURL(url); - const fs = getDefaultVirtualFs().fs; + const fs = getDefaultVFileSystem(); const r = fs.stat(url); await expect(r).rejects.toEqual(expected); }); diff --git a/packages/cspell-io/src/index.ts b/packages/cspell-io/src/index.ts index 3cc7e7cffb3..4da10bcc0c1 100644 --- a/packages/cspell-io/src/index.ts +++ b/packages/cspell-io/src/index.ts @@ -3,6 +3,7 @@ export * from './common/index.js'; export { compareStats, createTextFileResource } from './common/index.js'; export type { CSpellIO } from './CSpellIO.js'; export { CSpellIONode, getDefaultCSpellIO } from './CSpellIONode.js'; +export { createVirtualFS, getDefaultVirtualFs } from './CVirtualFS.js'; export { getStat, getStatSync, @@ -17,13 +18,7 @@ export type { Stats } from './models/Stats.js'; export { FileType as VFileType } from './models/Stats.js'; export { encodeDataUrl, toDataUrl } from './node/dataUrl.js'; export { isFileURL, isUrlLike, toFileURL, toURL, urlBasename, urlDirname } from './node/file/url.js'; -export type { - VFileSystem as VFileSystem, - VFileSystemProvider, - VfsDirEntry, - VfsStat, - VirtualFS, - VProviderFileSystem, -} from './VirtualFS.js'; -export { createVirtualFS, FSCapabilityFlags, getDefaultVirtualFs } from './VirtualFS.js'; +export type { VFileSystem, VfsDirEntry, VfsStat } from './VFileSystem.js'; +export { FSCapabilityFlags } from './VFileSystem.js'; +export type { VFileSystemProvider, VirtualFS, VProviderFileSystem } from './VirtualFS.js'; export { createRedirectProvider } from './VirtualFS/redirectProvider.js'; diff --git a/packages/cspell-io/src/models/LogEvent.ts b/packages/cspell-io/src/models/LogEvent.ts new file mode 100644 index 00000000000..c806e69e479 --- /dev/null +++ b/packages/cspell-io/src/models/LogEvent.ts @@ -0,0 +1,23 @@ +export type EventMethods = 'stat' | 'readFile' | 'writeFile' | 'readDir'; +export type LogEvents = 'start' | 'end' | 'error' | 'other'; +export interface LogEvent { + /** + * The request method + */ + method: EventMethods; + event: LogEvents; + message?: string | undefined; + /** + * The trace id can be used to link request and response events. + * The trace id is unique for a given request. + */ + traceID: number; + /** + * The request url + */ + url?: URL | undefined; + /** + * The time in milliseconds, see `performance.now()` + */ + ts: number; +} diff --git a/packages/cspell-url/package.json b/packages/cspell-url/package.json index 70a4b96d464..a229d5879da 100644 --- a/packages/cspell-url/package.json +++ b/packages/cspell-url/package.json @@ -28,6 +28,8 @@ "!**/*.spec.*", "!**/*.test.*", "!**/test/**", + "!**/*.perf.*", + "!**/perf/**", "!**/*.map" ], "scripts": { @@ -38,6 +40,9 @@ "coverage": "vitest run --coverage", "test-watch": "vitest", "test": "vitest run", + "test:perf": "insight --file \"dist/perf/**/*.perf.{mjs,js}\" -t 1000", + "test:perf:ts": "insight --register ts-node/esm --file \"src/perf/**/*.perf.{mts,ts}\" -t 1000", + "test:perf:prof": "NODE_ENV=production node --cpu-prof ../../node_modules/perf-insight/bin.mjs --file \"dist/perf/**/*.perf.{mjs,js}\" -t 1000", "watch": "tsc -p . --watch" }, "repository": { diff --git a/packages/cspell-url/src/FileUrlBuilder.mts b/packages/cspell-url/src/FileUrlBuilder.mts new file mode 100644 index 00000000000..f342cc20d9d --- /dev/null +++ b/packages/cspell-url/src/FileUrlBuilder.mts @@ -0,0 +1,207 @@ +import assert from 'node:assert'; +import Path from 'node:path'; + +import { toFilePathOrHref } from './fileUrl.mjs'; +import { addTrailingSlash, isUrlLike, urlParent, urlToUrlRelative } from './url.mjs'; + +export const isWindows = process.platform === 'win32'; + +export const isWindowsPathRegEx = /^[a-z]:[\\/]/i; +const isWindowsPathname = /^[\\/]([a-z]:[\\/])/i; + +export const percentRegEx = /%/g; +export const backslashRegEx = /\\/g; +export const newlineRegEx = /\n/g; +export const carriageReturnRegEx = /\r/g; +export const tabRegEx = /\t/g; +export const questionRegex = /\?/g; +export const hashRegex = /#/g; + +export interface PathInterface { + sep: string; + resolve(...paths: string[]): string; + parse(path: string): Path.ParsedPath; + normalize(path: string): string; + relative(from: string, to: string): string; + isAbsolute(path: string): boolean; +} + +export interface BuilderOptions { + windows?: boolean | undefined; + path?: PathInterface | undefined; + cwd?: URL | undefined; +} + +const ProtocolFile = 'file:'; +const RootFileURL = 'file:///'; + +export class FileUrlBuilder { + private windows: boolean; + readonly path: PathInterface; + readonly cwd: URL; + constructor(options: BuilderOptions = {}) { + const sep = options.path?.sep; + this.windows = options.windows ?? (sep ? sep === '\\' : undefined) ?? isWindows; + this.path = options.path ?? (this.windows ? Path.win32 : Path.posix); + // note: `this.path.resolve() + '/'` is used on purpose instead of `'./'` + this.cwd = options.cwd ?? this.pathToFileURL(this.path.resolve() + '/', this.rootFileURL()); + assert( + this.path.sep === (this.windows ? '\\' : '/'), + `Path separator should match OS type Windows: ${this.windows === true ? 'true' : (this.windows ?? 'undefined') || 'false'}, ` + + `sep: ${this.path.sep}, ` + + `options: ` + + JSON.stringify({ + isWindows, + sep: `${sep}`, + windows: options.windows, + pathSep: options.path?.sep, + n: options.path?.normalize('path/file.txt'), + cwd: options.cwd?.href, + win32: this.path === Path.win32, + posix: this.path === Path.posix, + 'win32.normalize': this.path.normalize === Path.win32.normalize, + 'posix.normalize': this.path.normalize === Path.posix.normalize, + }) + + ``, + ); + } + + /** + * Encode special characters in a file path to use in a URL. + * @param filepath + * @returns + */ + encodePathChars(filepath: string) { + filepath = filepath.replaceAll(percentRegEx, '%25'); + // In posix, backslash is a valid character in paths: + if (!this.windows && !isWindows && filepath.includes('\\')) { + filepath = filepath.replaceAll(backslashRegEx, '%5C'); + } + filepath = filepath.replaceAll(newlineRegEx, '%0A'); + filepath = filepath.replaceAll(carriageReturnRegEx, '%0D'); + filepath = filepath.replaceAll(tabRegEx, '%09'); + return filepath; + } + + /** + * Normalize a file path for use in a URL. + * ```js + * const url = new URL(normalizeFilePathForUrl('path\\to\\file.txt'), 'file:///Users/user/'); + * // Result: file:///Users/user/path/to/file.txt + * ``` + * @param filePath + * @returns a normalized file path for use as a relative path in a URL. + */ + normalizeFilePathForUrl(filePath: string): string { + filePath = this.encodePathChars(filePath); + filePath = filePath.replaceAll(questionRegex, '%3F'); + filePath = filePath.replaceAll(hashRegex, '%23'); + const pathname = filePath.replaceAll('\\', '/'); + return pathname.replace(isWindowsPathRegEx, (drive) => `/${drive}`.toUpperCase()); + } + + /** + * Try to make a file URL. + * - if filenameOrUrl is already a URL, it is returned as is. + * @param filenameOrUrl + * @param relativeTo - optional URL, if given, filenameOrUrl will be parsed as relative. + * @returns a URL + */ + toFileURL(filenameOrUrl: string | URL, relativeTo?: string | URL): URL { + if (typeof filenameOrUrl !== 'string') return filenameOrUrl; + if (isUrlLike(filenameOrUrl)) return new URL(filenameOrUrl); + relativeTo ??= this.cwd; + isWindows && (filenameOrUrl = filenameOrUrl.replaceAll('\\', '/')); + if (isUrlLike(relativeTo)) { + const pathname = this.normalizeFilePathForUrl(filenameOrUrl); + return new URL(pathname, relativeTo); + } + // Resolve removes the trailing slash, so we need to add it back. + const appendSlash = filenameOrUrl.endsWith('/') ? '/' : ''; + const pathname = + this.normalizeFilePathForUrl(this.path.resolve(relativeTo.toString(), filenameOrUrl)) + appendSlash; + return this.pathToFileURL(pathname, this.cwd); + } + + /** + * Try to make a URL for a directory. + * - if dirOrUrl is already a URL, a slash is appended to the pathname. + * @param dirOrUrl - directory path to convert to a file URL. + * @param relativeTo - optional URL, if given, filenameOrUrl will be parsed as relative. + * @returns a URL + */ + toFileDirURL(dirOrUrl: string | URL, relativeTo?: string | URL): URL { + return addTrailingSlash(this.toFileURL(dirOrUrl, relativeTo)); + } + + urlToFilePathOrHref(url: URL | string): string { + url = this.toFileURL(url); + return this.#urlToFilePathOrHref(url); + } + + #urlToFilePathOrHref(url: URL): string { + if (url.protocol !== ProtocolFile) return url.href; + const p = + this.path === Path + ? toFilePathOrHref(url) + : decodeURIComponent(url.pathname.split('/').join(this.path.sep)); + return p.replace(isWindowsPathRegEx, (drive) => drive.toUpperCase()).replace(isWindowsPathname, '$1'); + } + + /** + * Calculate the relative path to go from `urlFrom` to `urlTo`. + * The protocol is not evaluated. Only the `url.pathname` is used. + * The result: `new URL(relative(urlFrom, urlTo), urlFrom).pathname === urlTo.pathname` + * @param urlFrom + * @param urlTo + * @returns the relative path + */ + relative(urlFrom: URL, urlTo: URL): string { + if (urlFrom.protocol === urlTo.protocol && urlFrom.protocol === ProtocolFile) { + if (urlFrom.href === urlTo.href) return ''; + urlFrom = urlFrom.pathname.endsWith('/') ? urlFrom : new URL('./', urlFrom); + const fromPath = urlFrom.pathname; + const toPath = urlTo.pathname; + if (toPath.startsWith(fromPath)) return decodeURIComponent(toPath.slice(fromPath.length)); + const pFrom = this.#urlToFilePathOrHref(urlFrom); + const pTo = this.#urlToFilePathOrHref(urlTo); + const toIsDir = urlTo.pathname.endsWith('/'); + let pathname = this.normalizeFilePathForUrl(this.path.relative(pFrom, pTo)); + if (toIsDir && !pathname.endsWith('/')) pathname += '/'; + return decodeURIComponent(pathname); + } + return decodeURIComponent(urlToUrlRelative(urlFrom, urlTo)); + } + + /** + * Get the parent directory of a URL. + * @param url + */ + urlDirname(url: URL | string): URL { + return urlParent(this.toFileURL(url)); + } + + pathToFileURL(pathname: string, relativeToURL?: URL | string): URL { + return new URL(this.normalizeFilePathForUrl(pathname), relativeToURL || this.cwd); + } + + rootFileURL(filePath?: string): URL { + const path = this.path; + const p = path.parse(path.normalize(path.resolve(filePath ?? '.'))); + return new URL(this.normalizeFilePathForUrl(p.root), RootFileURL); + } + + /** + * Determine if a filePath is absolute. + * + * @param filePath + * @returns true if `URL` or `path.isAbsolute(filePath)` + */ + isAbsolute(filePath: string): boolean { + return isUrlLike(filePath) || this.path.isAbsolute(filePath); + } + + isUrlLike(url: string | URL): boolean { + return isUrlLike(url); + } +} diff --git a/packages/cspell-url/src/FileUrlBuilder.test.mts b/packages/cspell-url/src/FileUrlBuilder.test.mts new file mode 100644 index 00000000000..45aed292c53 --- /dev/null +++ b/packages/cspell-url/src/FileUrlBuilder.test.mts @@ -0,0 +1,58 @@ +import Path from 'node:path'; +import url from 'node:url'; + +import { describe, expect, test } from 'vitest'; + +import { FileUrlBuilder } from './FileUrlBuilder.mjs'; + +describe('FileUrlBuilder', () => { + test('FileUrlBuilder', () => { + const builder = new FileUrlBuilder(); + expect(builder.cwd.href.toLowerCase()).toBe(url.pathToFileURL('./').href.toLowerCase()); + expect(builder.urlToFilePathOrHref(builder.cwd).toLowerCase()).toBe(Path.resolve('.').toLowerCase() + Path.sep); + }); + + test.each` + fromPath | toPath | path | expected + ${'.'} | ${'.'} | ${undefined} | ${''} + ${'e:/path/to/file.txt'} | ${'e:/path/to/file2.txt'} | ${Path.win32} | ${'file2.txt'} + ${'file:///E:/user/test/project/deeper/'} | ${'file:///E:/user/Test/project/'} | ${Path.win32} | ${'../'} + ${'file:///E:/user/test/project/'} | ${'file:///E:/user/Test/project//deeper/'} | ${Path.win32} | ${'deeper/'} + `('relative $fromPath $toPath', ({ fromPath, toPath, path, expected }) => { + const builder = new FileUrlBuilder({ path }); + const fromUrl = builder.pathToFileURL(fromPath); + const toUrl = builder.pathToFileURL(toPath); + const result = builder.relative(fromUrl, toUrl); + expect(result).toEqual(expected); + }); + + test.each` + filePath | path | expected + ${'.'} | ${undefined} | ${false} + ${'./../hello'} | ${undefined} | ${false} + ${'src/README.md'} | ${undefined} | ${false} + ${'e:/path/to/file.txt'} | ${Path.win32} | ${true} + ${'e:/path/to/file.txt'} | ${Path.posix} | ${false} + ${'/path/to/file.txt'} | ${Path.win32} | ${true} + ${'\\path\\to\\file.txt'} | ${Path.win32} | ${true} + ${'\\path\\to\\file.txt'} | ${Path.posix} | ${false} + ${'file:///E:/user/test/project/deeper/'} | ${Path.win32} | ${true} + ${'vscode:///E:/user/test/project/'} | ${Path.win32} | ${true} + `('isAbsolute $filePath', ({ filePath, path, expected }) => { + const builder = new FileUrlBuilder({ path }); + expect(builder.isAbsolute(filePath)).toEqual(expected); + }); + + test.each` + filePath | path | expected + ${'.'} | ${undefined} | ${false} + ${'e:/path/to/file.txt'} | ${Path.win32} | ${false} + ${'e:/path/to/file.txt'} | ${Path.posix} | ${false} + ${'/path/to/file.txt'} | ${Path.win32} | ${false} + ${'file:///E:/user/test/project/deeper/'} | ${Path.win32} | ${true} + ${'vscode:///E:/user/test/project/'} | ${Path.win32} | ${true} + `('isUrlLike $filePath', ({ filePath, path, expected }) => { + const builder = new FileUrlBuilder({ path }); + expect(builder.isUrlLike(filePath)).toEqual(expected); + }); +}); diff --git a/packages/cspell-url/src/defaultFileUrlBuilder.mts b/packages/cspell-url/src/defaultFileUrlBuilder.mts new file mode 100644 index 00000000000..35be4fcbfb8 --- /dev/null +++ b/packages/cspell-url/src/defaultFileUrlBuilder.mts @@ -0,0 +1,41 @@ +import { FileUrlBuilder } from './FileUrlBuilder.mjs'; + +const fileUrlBuilder = new FileUrlBuilder(); + +export function encodePathChars(filepath: string) { + return fileUrlBuilder.encodePathChars(filepath); +} + +/** + * Normalize a file path for use in a URL. + * ```js + * const url = new URL(normalizeFilePathForUrl('path\\to\\file.txt'), 'file:///Users/user/'); + * // Result: file:///Users/user/path/to/file.txt + * ``` + * @param filePath + * @returns a normalized file path for use as a relative path in a URL. + */ +export function normalizeFilePathForUrl(filePath: string): string { + return fileUrlBuilder.normalizeFilePathForUrl(filePath); +} + +/** + * Try to make a file URL. + * - if filenameOrUrl is already a URL, it is returned as is. + * - + * @param filenameOrUrl + * @param relativeTo - optional URL, if given, filenameOrUrl will be parsed as relative. + * @returns a URL + */ +export function toFileURL(filenameOrUrl: string | URL, relativeTo?: string | URL): URL { + return fileUrlBuilder.toFileURL(filenameOrUrl, relativeTo); +} + +/** + * Converts a file path to a URL and adds a trailing slash. + * @param dir - url to a directory + * @returns a URL + */ +export function toFileDirURL(dir: string | URL): URL { + return fileUrlBuilder.toFileDirURL(dir); +} diff --git a/packages/cspell-url/src/fileUrl.mts b/packages/cspell-url/src/fileUrl.mts index a5758d3f33b..ea51b6c10f6 100644 --- a/packages/cspell-url/src/fileUrl.mts +++ b/packages/cspell-url/src/fileUrl.mts @@ -1,20 +1,6 @@ -import assert from 'node:assert'; -import path from 'node:path'; -import { fileURLToPath, pathToFileURL } from 'node:url'; +import { fileURLToPath } from 'node:url'; -import { addTrailingSlash, hasProtocol, isUrlLike } from './url.mjs'; - -const isWindows = process.platform === 'win32'; - -const isWindowsPathRegEx = /^[a-z]:[\\/]/i; - -const percentRegEx = /%/g; -const backslashRegEx = /\\/g; -const newlineRegEx = /\n/g; -const carriageReturnRegEx = /\r/g; -const tabRegEx = /\t/g; -const questionRegex = /\?/g; -const hashRegex = /#/g; +import { hasProtocol } from './url.mjs'; /** * @param url - URL or string to check if it is a file URL. @@ -24,116 +10,6 @@ export function isFileURL(url: URL | string): boolean { return hasProtocol(url, 'file:'); } -export interface PathInterface { - sep: string; - resolve(...paths: string[]): string; -} - -export interface BuilderOptions { - windows?: boolean | undefined; - path?: PathInterface | undefined; - cwd?: URL | undefined; -} - -export class FileUrlBuilder { - private windows: boolean; - private path: PathInterface; - private cwd: URL; - constructor(options: BuilderOptions = {}) { - const sep = options.path?.sep; - this.windows = options.windows ?? (sep ? sep === '\\' : undefined) ?? isWindows; - this.path = options.path ?? this.windows ? path.win32 : path.posix; - this.cwd = options.cwd ?? pathToFileURL(this.path.resolve() + '/'); - assert(this.path.sep === (this.windows ? '\\' : '/')); - } - - /** - * Encode special characters in a file path to use in a URL. - * @param filepath - * @returns - */ - encodePathChars(filepath: string) { - filepath = filepath.replaceAll(percentRegEx, '%25'); - // In posix, backslash is a valid character in paths: - if (!this.windows && filepath.includes('\\')) filepath = filepath.replaceAll(backslashRegEx, '%5C'); - filepath = filepath.replaceAll(newlineRegEx, '%0A'); - filepath = filepath.replaceAll(carriageReturnRegEx, '%0D'); - filepath = filepath.replaceAll(tabRegEx, '%09'); - return filepath; - } - - /** - * Normalize a file path for use in a URL. - * ```js - * const url = new URL(normalizeFilePathForUrl('path\\to\\file.txt'), 'file:///Users/user/'); - * // Result: file:///Users/user/path/to/file.txt - * ``` - * @param filePath - * @returns a normalized file path for use as a relative path in a URL. - */ - normalizeFilePathForUrl(filePath: string): string { - filePath = this.encodePathChars(filePath); - filePath = filePath.replaceAll(questionRegex, '%3F'); - filePath = filePath.replaceAll(hashRegex, '%23'); - const pathname = filePath.replaceAll('\\', '/'); - return pathname.replace(isWindowsPathRegEx, (drive) => `/${drive}`.toUpperCase()); - } - - /** - * Try to make a file URL. - * - if filenameOrUrl is already a URL, it is returned as is. - * @param filenameOrUrl - * @param relativeTo - optional URL, if given, filenameOrUrl will be parsed as relative. - * @returns a URL - */ - toFileURL(filenameOrUrl: string | URL, relativeTo?: string | URL): URL { - if (typeof filenameOrUrl !== 'string') return filenameOrUrl; - if (isUrlLike(filenameOrUrl)) return new URL(filenameOrUrl); - relativeTo ??= this.cwd; - if (isUrlLike(relativeTo)) { - return new URL(this.normalizeFilePathForUrl(filenameOrUrl), relativeTo); - } - // Resolve removes the trailing slash, so we need to add it back. - const appendSlash = filenameOrUrl.endsWith('/') - ? '/' - : this.windows && filenameOrUrl.endsWith('\\') - ? '\\' - : ''; - return pathToFileURL(this.path.resolve(relativeTo.toString(), filenameOrUrl) + appendSlash); - } -} - -const fileUrlBuilder = new FileUrlBuilder(); - -export function encodePathChars(filepath: string) { - return fileUrlBuilder.encodePathChars(filepath); -} - -/** - * Normalize a file path for use in a URL. - * ```js - * const url = new URL(normalizeFilePathForUrl('path\\to\\file.txt'), 'file:///Users/user/'); - * // Result: file:///Users/user/path/to/file.txt - * ``` - * @param filePath - * @returns a normalized file path for use as a relative path in a URL. - */ -export function normalizeFilePathForUrl(filePath: string): string { - return fileUrlBuilder.normalizeFilePathForUrl(filePath); -} - -/** - * Try to make a file URL. - * - if filenameOrUrl is already a URL, it is returned as is. - * - - * @param filenameOrUrl - * @param relativeTo - optional URL, if given, filenameOrUrl will be parsed as relative. - * @returns a URL - */ -export function toFileURL(filenameOrUrl: string | URL, relativeTo?: string | URL): URL { - return fileUrlBuilder.toFileURL(filenameOrUrl, relativeTo); -} - /** * Convert a URL into a string. If it is a file URL, convert it to a path. * @param url - URL @@ -150,13 +26,3 @@ function toFilePath(url: string | URL): string { function windowsDriveLetterToUpper(absoluteFilePath: string): string { return absoluteFilePath.replace(/^([a-z]):\\/, (s) => s.toUpperCase()); } - -/** - * Converts a file path to a URL and adds a trailing slash. - * @param dir - url to a directory - * @returns a URL - */ -export function toFileDirURL(dir: string | URL): URL { - const url = toFileURL(dir); - return addTrailingSlash(url); -} diff --git a/packages/cspell-url/src/fileUrl.test.mts b/packages/cspell-url/src/fileUrl.test.mts index 73d084331c0..188e2cb04b8 100644 --- a/packages/cspell-url/src/fileUrl.test.mts +++ b/packages/cspell-url/src/fileUrl.test.mts @@ -1,13 +1,15 @@ -import * as path from 'node:path'; +import * as Path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { describe, expect, test } from 'vitest'; import { urlBasename } from './dataUrl.mjs'; -import { FileUrlBuilder, normalizeFilePathForUrl, toFileDirURL, toFilePathOrHref, toFileURL } from './fileUrl.mjs'; +import { normalizeFilePathForUrl, toFileDirURL, toFileURL } from './defaultFileUrlBuilder.mjs'; +import { toFilePathOrHref } from './fileUrl.mjs'; +import { FileUrlBuilder } from './FileUrlBuilder.mjs'; import { isUrlLike, toURL, urlParent } from './url.mjs'; -const root = path.join(__dirname, '../..'); +const root = Path.join(__dirname, '../..'); // const oc = expect.objectContaining; // const sc = expect.stringContaining; const sm = expect.stringMatching; @@ -53,7 +55,7 @@ describe('util', () => { ${toURL('data:application/gzip;base64,H')} | ${'application.gzip'} ${'data:application/vnd.cspell.dictionary+trie,H'} | ${'application.vnd.cspell.dictionary.trie'} `('urlBasename $file', async ({ file, expected }) => { - const filename = isUrlLike(file) ? file : toFileURL(path.resolve(root, file)); + const filename = isUrlLike(file) ? file : toFileURL(Path.resolve(root, file)); expect(urlBasename(filename)).toEqual(expected); }); @@ -67,7 +69,7 @@ describe('util', () => { ${'https://github.com/streetsidesoftware/cspell/raw/main/packages/cspell-io/samples/cities.txt.gz'} | ${sm(/https:.*\/samples\/$/)} ${'https://github.com/streetsidesoftware/cspell/raw/main/packages/cspell-io/samples/code/'} | ${sm(/https:.*\/samples\/$/)} `('urlDirname $file', async ({ file, expected }) => { - const filename = isUrlLike(file) ? file : toFileURL(path.resolve(root, file)); + const filename = isUrlLike(file) ? file : toFileURL(Path.resolve(root, file)); expect(urlParent(filename).toString()).toEqual(expected); }); @@ -101,8 +103,8 @@ describe('util', () => { test.each` url | expected - ${toFileURL('file.txt')} | ${path.resolve('file.txt')} - ${toFileURL('file.txt').href} | ${path.resolve('file.txt')} + ${toFileURL('file.txt')} | ${Path.resolve('file.txt')} + ${toFileURL('file.txt').href} | ${Path.resolve('file.txt')} ${import.meta.url} | ${fileURLToPath(import.meta.url)} ${'stdin:sample.py'} | ${'stdin:sample.py'} `('toFilePathOrHref $url', ({ url, expected }) => { diff --git a/packages/cspell-url/src/index.mts b/packages/cspell-url/src/index.mts index 9e8b7773df7..3190ff8932b 100644 --- a/packages/cspell-url/src/index.mts +++ b/packages/cspell-url/src/index.mts @@ -1,12 +1,17 @@ export { isDataURL, urlBasename } from './dataUrl.mjs'; -export type { BuilderOptions, PathInterface } from './fileUrl.mjs'; +export { encodePathChars, normalizeFilePathForUrl, toFileDirURL, toFileURL } from './defaultFileUrlBuilder.mjs'; +export { isFileURL, toFilePathOrHref } from './fileUrl.mjs'; +export type { BuilderOptions, PathInterface } from './FileUrlBuilder.mjs'; +export { FileUrlBuilder } from './FileUrlBuilder.mjs'; export { - encodePathChars, - FileUrlBuilder, - isFileURL, - normalizeFilePathForUrl, - toFileDirURL, - toFilePathOrHref, - toFileURL, -} from './fileUrl.mjs'; -export { addTrailingSlash, basenameOfUrlPathname, hasProtocol, isURL, isUrlLike, toURL, urlParent } from './url.mjs'; + addTrailingSlash, + basenameOfUrlPathname, + hasProtocol, + isNotUrlLike, + isURL, + isUrlLike, + toURL, + urlDirname, + urlParent, + urlRelative, +} from './url.mjs'; diff --git a/packages/cspell-url/src/perf/url.perf.ts b/packages/cspell-url/src/perf/url.perf.ts new file mode 100644 index 00000000000..90d3a7094df --- /dev/null +++ b/packages/cspell-url/src/perf/url.perf.ts @@ -0,0 +1,69 @@ +import assert from 'node:assert'; +import { promises as fs } from 'node:fs'; +import Path from 'node:path'; +import { pathToFileURL } from 'node:url'; + +import { suite } from 'perf-insight'; + +import { FileUrlBuilder } from '../index.mjs'; +import { urlToUrlRelative } from '../url.mjs'; + +const fixturesDataUrl = new URL('../../../../test-fixtures/perf/cspell-glob/data/', import.meta.url); + +const cwd = process.cwd(); + +suite('cspell-url.FileUrlBuilder.relative', async (test) => { + const fileList = await loadFileList(); + const fileUrlList = fileList.map((file) => pathToFileURL(file)); + const builder = new FileUrlBuilder({ path: Path }); + + verifyRelative(fileUrlList); + + test('FileUrlBuilder.relative', () => { + const cwdUrl = builder.cwd; + + for (const file of fileUrlList) { + builder.relative(cwdUrl, file); + } + }); + + test('urlToUrlRelative', () => { + const cwdUrl = builder.cwd; + + for (const file of fileUrlList) { + urlToUrlRelative(cwdUrl, file); + } + }); + + test('Path.relative', () => { + const cwdUrl = builder.cwd; + const relative = Path.posix.relative; + + for (const file of fileUrlList) { + relative(cwdUrl.pathname, file.pathname); + } + }); +}); + +function verifyRelative(urls: URL[]) { + const builder = new FileUrlBuilder({ path: Path }); + const cwdUrl = builder.cwd; + + for (const url of urls) { + const relBuilder = builder.relative(cwdUrl, url); + const relPath = decodeURIComponent(Path.posix.relative(cwdUrl.pathname, url.pathname)); + const relUrl = urlToUrlRelative(cwdUrl, url); + assert.deepStrictEqual(relBuilder, relPath, 'Builder vs Path'); + assert.deepStrictEqual(relBuilder, relUrl, 'Builder vs URL'); + } +} + +async function loadFileList() { + const fileList = (await fs.readFile(new URL('file-list.txt', fixturesDataUrl), 'utf8')) + .split('\n') + .map((a) => a.trim()) + .filter((a) => a) + .map((file) => Path.relative(cwd, file)); + + return fileList; +} diff --git a/packages/cspell-url/src/url.mts b/packages/cspell-url/src/url.mts index 1aae95ba7c9..9025ba2b449 100644 --- a/packages/cspell-url/src/url.mts +++ b/packages/cspell-url/src/url.mts @@ -31,6 +31,15 @@ export function urlParent(url: string | URL): URL { return new URL(hasTrailingSlash ? '..' : '.', url); } +/** + * Alias of {@link urlParent} + * Try to determine the parent directory URL of the uri. + * If it is not a hierarchical URL, then it will return the URL. + * @param url - url to extract the dirname from. + * @returns a URL + */ +export const urlDirname = urlParent; + /** * return the basename (last portion of the URL pathname) of a path. It does NOT remove the trailing slash. * @param path - URL pathname to extract the basename from. @@ -54,6 +63,19 @@ export function isUrlLike(filename: string | URL): boolean { return filename instanceof URL || isURLRegEx.test(filename); } +/** + * @param filename - filename to check if it is a string containing a URL. + */ +export function isNotUrlLike(filename: string): boolean; +export function isNotUrlLike(filename: URL): false; +/** + * @param filename - filename to check if it is a string containing a URL or a URL object. + */ +export function isNotUrlLike(filename: string | URL): filename is string; +export function isNotUrlLike(filename: string | URL): boolean { + return !isUrlLike(filename); +} + /** * Check if `url` is a URL instance. * @returns @@ -85,3 +107,70 @@ export function addTrailingSlash(url: URL): URL { urlWithSlash.pathname += '/'; return urlWithSlash; } + +/** + * Remove the filename at the end of the URL pathname. + * If the URL pathname ends with a `/`, it is considered a directory and the URL is returned as is. + * If the URL pathname does not start with a `/`, it is considered an non-regular URL and the URL is returned as is. + * @param url + * @returns + */ +export function urlRemoveFilename(url: URL): URL { + // Test if it is already a directory or it is not possible to remove the filename. + if (url.pathname.endsWith('/') || !url.pathname.startsWith('/')) return url; + return new URL('./', url); +} + +/** + * Extract the filename from the URL pathname. + * + * ```ts + * url.href === new URL(urlFilename(url), urlRemoveFilename(url)).href + * ``` + * @param url - URL to extract the filename from. + * @returns the filename or empty string if the URL pathname ends with a `/`. + */ +export function urlFilename(url: URL): string { + if (!url.pathname.startsWith('/')) return ''; + const lastSlash = url.pathname.lastIndexOf('/'); + return url.pathname.slice(lastSlash + 1); +} + +/** + * Calculate the relative path to go from `urlFrom` to `urlTo`. + * The protocol is not evaluated. Only the `url.pathname` is used. + * @param urlFrom + * @param urlTo + * @returns the relative path + */ +export function urlRelative(urlFrom: string | URL, urlTo: string | URL): string { + return urlToUrlRelative(toURL(urlFrom), toURL(urlTo)); +} + +/** + * Calculate the relative path to go from `urlFrom` to `urlTo`. + * The protocol is not evaluated. Only the `url.pathname` is used. + * @param urlFrom + * @param urlTo + * @returns the relative path + */ +export function urlToUrlRelative(urlFrom: URL, urlTo: URL): string { + let pFrom = urlFrom.pathname; + const pTo = urlTo.pathname; + if (pFrom === pTo) return ''; + pFrom = pFrom.endsWith('/') ? pFrom : new URL('./', urlFrom).pathname; + if (pTo.startsWith(pFrom)) return decodeURIComponent(pTo.slice(pFrom.length)); + const p0 = pFrom; + const p1 = pTo; + if (p1.startsWith(p0)) { + return decodeURIComponent(p0 === p1 ? '' : p1.slice(p0.lastIndexOf('/') + 1)); + } + const p0Parts = p0.split('/').slice(0, -1); // drop the last segment. + const p1Parts = p1.split('/'); + let i = 0; + for (i = 0; i < p0Parts.length && i < p1Parts.length - 1 && p0Parts[i] === p1Parts[i]; ++i) { + // empty + } + const rel = '../'.repeat(p0Parts.length - i) + p1Parts.slice(i).join('/'); + return decodeURIComponent(rel.length < p1.length ? rel : p1); +} diff --git a/packages/cspell-url/src/url.test.mts b/packages/cspell-url/src/url.test.mts index 4e8efa785f9..cd4e891b4b4 100644 --- a/packages/cspell-url/src/url.test.mts +++ b/packages/cspell-url/src/url.test.mts @@ -1,6 +1,15 @@ import { describe, expect, test } from 'vitest'; -import { addTrailingSlash, basenameOfUrlPathname, isUrlLike, toURL, urlParent } from './url.mjs'; +import { + addTrailingSlash, + basenameOfUrlPathname, + isUrlLike, + toURL, + urlFilename, + urlParent, + urlRelative, + urlRemoveFilename, +} from './url.mjs'; describe('url', () => { test.each` @@ -20,8 +29,10 @@ describe('url', () => { ${'README.md'} | ${'https://github.com/streetsidesoftware/cspell/'} | ${'https://github.com/streetsidesoftware/cspell/README.md'} ${new URL('https://github.com/streetsidesoftware/cspell/README.md')} | ${undefined} | ${'https://github.com/streetsidesoftware/cspell/README.md'} ${'vsls:/cspell.config.yaml'} | ${undefined} | ${'vsls:/cspell.config.yaml'} - ${'stdin:sample.py'} | ${undefined} | ${'stdin:sample.py'} + ${'stdin:sample.py'} | ${'file:///'} | ${'stdin:sample.py'} ${'vsls:/cspell.config.yaml'} | ${'file:///'} | ${'vsls:/cspell.config.yaml'} + ${'**/*.json'} | ${'file:///User/test/project/'} | ${'file:///User/test/project/**/*.json'} + ${'**/*{.json,.jsonc,.yml}'} | ${'file:///User/test/project/'} | ${'file:///User/test/project/**/*%7B.json,.jsonc,.yml%7D'} `('toUrl $url $rootUrl', ({ url, rootUrl, expected }) => { expect(toURL(url, rootUrl)).toEqual(new URL(expected)); }); @@ -77,7 +88,48 @@ describe('url', () => { ${'data:application/text'} | ${'data:application/text'} ${'https://github.com/streetsidesoftware/samples'} | ${'https://github.com/streetsidesoftware/samples/'} ${'vs-code:///remote/file/sample.ts'} | ${'vs-code:///remote/file/sample.ts/'} - `('isUrlLike $url', ({ url, expected }) => { + `('addTrailingSlash $url', ({ url, expected }) => { expect(addTrailingSlash(toURL(url))).toEqual(new URL(expected)); }); + + test.each` + urlFrom | urlTo | expected + ${'file:///'} | ${'file:///'} | ${''} + ${'file:///samples/code/'} | ${'file:///samples/code/src/file.cpp'} | ${'src/file.cpp'} + ${'file:///samples/code/package.json'} | ${'file:///samples/code/src/file.cpp'} | ${'src/file.cpp'} + ${'file:///samples/code/'} | ${'file:///samples/code/'} | ${''} + ${'file:///samples/code/'} | ${'file:///samples/code'} | ${'../code'} + ${'file:///samples/code'} | ${'file:///samples/code/'} | ${'code/'} + ${'stdin:sample'} | ${'stdin:sample'} | ${''} + ${'stdin:/sample'} | ${'stdin:/sample'} | ${''} + ${'data:application/text'} | ${'data:application/text'} | ${''} + ${'https://github.com/streetsidesoftware/samples'} | ${'https://github.com/streetsidesoftware/samples'} | ${''} + ${'vs-code:///remote/file/sample.ts'} | ${'vs-code:///remote/file/sample.ts'} | ${''} + `('urlRelative $urlFrom $urlTo', ({ urlFrom, urlTo, expected }) => { + expect(urlRelative(urlFrom, urlTo)).toEqual(expected); + const rel = urlRelative(toURL(urlFrom), toURL(urlTo)); + expect(rel).toEqual(expected); + if (toURL(urlFrom).pathname.startsWith('/')) { + // new URL('', 'stdin:sample') will throw, but new URL('', 'stdin:/sample') will work. + expect(new URL(rel, urlFrom)).toEqual(new URL(urlTo)); + } + }); + + test.each` + url | expected + ${'file:///path/to/my/file.txt'} | ${'file.txt'} + ${'stdin:sample'} | ${''} + `('urlFilename $url', ({ url, expected }) => { + url = new URL(url); + expect(urlFilename(url)).toBe(expected); + }); + + test.each` + url | expected + ${'file:///path/to/my/file.txt'} | ${'file.txt'} + `('urlFilename & urlRemoveFilename $url', ({ url, expected }) => { + url = new URL(url); + expect(urlFilename(url)).toBe(expected); + expect(new URL(urlFilename(url), urlRemoveFilename(url)).href).toBe(url.href); + }); }); diff --git a/packages/cspell/fixtures/globRoot/config/cspell.config.yaml b/packages/cspell/fixtures/globRoot/config/cspell.config.yaml new file mode 100644 index 00000000000..070f23f7a89 --- /dev/null +++ b/packages/cspell/fixtures/globRoot/config/cspell.config.yaml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json + +globRoot: '${cwd}' +ignorePaths: + - 'ignore-me.md' diff --git a/packages/cspell/fixtures/globRoot/cspell.json b/packages/cspell/fixtures/globRoot/cspell.json new file mode 100644 index 00000000000..32735fcf735 --- /dev/null +++ b/packages/cspell/fixtures/globRoot/cspell.json @@ -0,0 +1,3 @@ +{ + "import": ["config/cspell.config.yaml"] +} diff --git a/packages/cspell/fixtures/globRoot/src/ignore-me.md b/packages/cspell/fixtures/globRoot/src/ignore-me.md new file mode 100644 index 00000000000..6c7cdaa9d55 --- /dev/null +++ b/packages/cspell/fixtures/globRoot/src/ignore-me.md @@ -0,0 +1,3 @@ +# This file will be ignored + +It has delibberate errors and misswpellings. diff --git a/packages/cspell/src/app/__snapshots__/app.test.ts.snap b/packages/cspell/src/app/__snapshots__/app.test.ts.snap index 329e5e330f6..8f5018f5700 100644 --- a/packages/cspell/src/app/__snapshots__/app.test.ts.snap +++ b/packages/cspell/src/app/__snapshots__/app.test.ts.snap @@ -1541,6 +1541,20 @@ error CSpell: Files checked: 3, Issues found: 6 in 2 files." exports[`Validate cli > app 'typos' Expect Error: [Function CheckFailed] 3`] = `""`; +exports[`Validate cli > app 'verify globRoot works' Expect Error: undefined 1`] = `[]`; + +exports[`Validate cli > app 'verify globRoot works' Expect Error: undefined 2`] = ` +"error 0.00ms +error 0.00ms +error CSpell: Files checked: 2, Issues found: 0 in 0 files." +`; + +exports[`Validate cli > app 'verify globRoot works' Expect Error: undefined 3`] = ` +" +1/2 ./config/cspell.config.yaml +2/2 ./cspell.json" +`; + exports[`Validate cli > app 'with errors and excludes' Expect Error: [Function CheckFailed] 1`] = `[]`; exports[`Validate cli > app 'with errors and excludes' Expect Error: [Function CheckFailed] 2`] = ` diff --git a/packages/cspell/src/app/app.test.ts b/packages/cspell/src/app/app.test.ts index 682085ea6e5..2992ee0d507 100644 --- a/packages/cspell/src/app/app.test.ts +++ b/packages/cspell/src/app/app.test.ts @@ -196,6 +196,7 @@ describe('Validate cli', () => { ${'reporter'} | ${['-r', pathFix('features/reporter'), '-c', pathFix('features/reporter/cspell.config.yaml')]} | ${undefined} | ${false} | ${true} | ${false} ${'issue-4811 **/README.md'} | ${['-r', pIssues('issue-4811'), '--no-progress', '**/README.md']} | ${undefined} | ${true} | ${false} | ${false} ${'issue-4811'} | ${['-r', pIssues('issue-4811'), '--no-progress', '.']} | ${app.CheckFailed} | ${true} | ${true} | ${false} + ${'verify globRoot works'} | ${['-r', pathFix('globRoot'), '.']} | ${undefined} | ${true} | ${false} | ${false} `('app $msg Expect Error: $errorCheck', async ({ testArgs, errorCheck, eError, eLog, eInfo }: TestCase) => { chalk.level = 1; const commander = getCommander(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52de71b7885..8c6f26737b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -570,15 +570,24 @@ importers: packages/cspell-gitignore: dependencies: + '@cspell/url': + specifier: workspace:* + version: link:../cspell-url cspell-glob: specifier: workspace:* version: link:../cspell-glob + cspell-io: + specifier: workspace:* + version: link:../cspell-io find-up-simple: specifier: ^1.0.0 version: 1.0.0 packages/cspell-glob: dependencies: + '@cspell/url': + specifier: workspace:* + version: link:../cspell-url micromatch: specifier: ^4.0.7 version: 4.0.7 @@ -6034,9 +6043,8 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true - is-core-module@2.14.0: - resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} - engines: {node: '>= 0.4'} + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -12725,7 +12733,7 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 18.19.39 '@types/semver@7.5.8': {} @@ -14558,7 +14566,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.14.0 + is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color @@ -14572,7 +14580,7 @@ snapshots: eslint-plugin-import: 2.29.1(eslint-import-resolver-typescript@3.6.1)(eslint@9.5.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 - is-core-module: 2.14.0 + is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -14636,7 +14644,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(eslint-plugin-import@2.29.1)(eslint@9.5.0))(eslint@9.5.0) hasown: 2.0.2 - is-core-module: 2.14.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -15977,7 +15985,7 @@ snapshots: dependencies: ci-info: 3.9.0 - is-core-module@2.14.0: + is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -18836,13 +18844,13 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.14.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.14.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 diff --git a/test-fixtures/perf/cspell-glob/data/file-list.txt b/test-fixtures/perf/cspell-glob/data/file-list.txt new file mode 100644 index 00000000000..6838bb5cc2b --- /dev/null +++ b/test-fixtures/perf/cspell-glob/data/file-list.txt @@ -0,0 +1,3895 @@ +./bin.mjs +./CHANGELOG.md +./CODE_OF_CONDUCT.md +./codecov.yaml +./CONTRIBUTING.md +./cspell-tools.mjs +./doc-generator/README.md +./doc-generator/typedoc.json +./docs/_config.yml +./docs/_config.yml +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/404.html +./docs/404.html +./docs/about.md +./docs/about.md +./docs/CNAME +./docs/CNAME +./docs/configuration/document-settings.md +./docs/configuration/document-settings.md +./docs/configuration/imports.md +./docs/configuration/imports.md +./docs/configuration/index.md +./docs/configuration/index.md +./docs/configuration/language-settings.md +./docs/configuration/language-settings.md +./docs/configuration/overrides.md +./docs/configuration/overrides.md +./docs/configuration/patterns.md +./docs/configuration/patterns.md +./docs/configuration/template.md +./docs/configuration/template.md +./docs/docs/case-sensitive.md +./docs/docs/case-sensitive.md +./docs/docs/command-check.md +./docs/docs/command-check.md +./docs/docs/command-trace.md +./docs/docs/command-trace.md +./docs/docs/dictionaries-custom.md +./docs/docs/dictionaries-custom.md +./docs/docs/dictionaries.md +./docs/docs/dictionaries.md +./docs/docs/forbidden-words.md +./docs/docs/forbidden-words.md +./docs/docs/getting-started.md +./docs/docs/getting-started.md +./docs/docs/git.md +./docs/docs/git.md +./docs/docs/globs.md +./docs/docs/globs.md +./docs/docs/how-it-works.md +./docs/docs/how-it-works.md +./docs/docs/index.md +./docs/docs/index.md +./docs/docs/installation.md +./docs/docs/installation.md +./docs/docs/template.md +./docs/docs/template.md +./docs/drafts/import.md +./docs/drafts/import.md +./docs/drafts/index.md +./docs/drafts/index.md +./docs/favicon.ico +./docs/favicon.ico +./docs/Gemfile +./docs/Gemfile +./docs/Gemfile.lock +./docs/Gemfile.lock +./docs/index.md +./docs/index.md +./docs/posts/2021-08-22-getting-started.md +./docs/posts/2021-08-22-getting-started.md +./docs/posts/2021-08-22-welcome-to-jekyll.markdown +./docs/posts/2021-08-22-welcome-to-jekyll.markdown +./docs/posts/index.md +./docs/posts/index.md +./docs/README.md +./docs/README.md +./docs/types/index.md +./docs/types/index.md +./docs/types/README.md +./docs/types/README.md +./eslint.config.mjs +./examples/case-sensitive.cspell.config.yaml +./examples/filetype-examples.cspell.config.yaml +./examples/ignore-words-dict.cspell.config.yaml +./examples/patterns.cspell.config.yaml +./examples/project-words.txt +./files.txt +./integration-tests/CHANGELOG.md +./integration-tests/custom-reporter.js +./integration-tests/README.md +./integration-tests/repo-list.sh +./integration-tests/scripts/normalize-output.mjs +./integration-tests/src/CaptureLogger.ts +./integration-tests/src/check.ts +./integration-tests/src/config.ts +./integration-tests/src/configDef.ts +./integration-tests/src/outputHelper.ts +./integration-tests/src/PrefixLogger.ts +./integration-tests/src/reporter/index.ts +./integration-tests/src/reporter/reportGenerator.test.ts +./integration-tests/src/reporter/reportGenerator.ts +./integration-tests/src/reporter/stringify.ts +./integration-tests/src/repositoryHelper.test.ts +./integration-tests/src/repositoryHelper.ts +./integration-tests/src/run.ts +./integration-tests/src/sh.ts +./integration-tests/src/shouldCheckRepo.ts +./integration-tests/src/snapshots.ts +./integration-tests/src/types.ts +./integration-tests/tester.js +./lerna.json +./LICENSE +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/cspell-default.config.js +./packages/cspell-bundled-dicts/cspell-default.config.js +./packages/cspell-bundled-dicts/cspell-default.config.ts +./packages/cspell-bundled-dicts/cspell-default.config.ts +./packages/cspell-bundled-dicts/LICENSE +./packages/cspell-bundled-dicts/LICENSE +./packages/cspell-bundled-dicts/README.md +./packages/cspell-bundled-dicts/README.md +./packages/cspell-bundled-dicts/test-samples/markdown.md +./packages/cspell-bundled-dicts/test-samples/markdown.md +./packages/cspell-bundled-dicts/test-samples/sample.r +./packages/cspell-bundled-dicts/test-samples/sample.r +./packages/cspell-code-snippets/CHANGELOG.md +./packages/cspell-code-snippets/LICENSE +./packages/cspell-code-snippets/README.md +./packages/cspell-code-snippets/src/trie2/lib/index.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2.test.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2Helper.ts +./packages/cspell-code-snippets/src/trie2/lib/TrieNode2.ts +./packages/cspell-config-lib/CHANGELOG.md +./packages/cspell-config-lib/LICENSE +./packages/cspell-config-lib/README.md +./packages/cspell-config-lib/src/ConfigReadWriteHandler.ts +./packages/cspell-config-lib/src/createReaderWriter.test.ts +./packages/cspell-config-lib/src/createReaderWriter.ts +./packages/cspell-config-lib/src/CSpellConfigFile.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileInMemory.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileInMemory.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJavaScript.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJavaScript.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJson.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJson.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFilePackageJson.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileYaml.ts +./packages/cspell-config-lib/src/CSpellConfigFile/index.ts +./packages/cspell-config-lib/src/CSpellConfigFileReaderWriter.test.ts +./packages/cspell-config-lib/src/CSpellConfigFileReaderWriter.ts +./packages/cspell-config-lib/src/defaultIO.ts +./packages/cspell-config-lib/src/defaultNext.ts +./packages/cspell-config-lib/src/FileLoader.ts +./packages/cspell-config-lib/src/index.test.ts +./packages/cspell-config-lib/src/index.ts +./packages/cspell-config-lib/src/IO.ts +./packages/cspell-config-lib/src/loaders/index.ts +./packages/cspell-config-lib/src/loaders/loaderJavaScript.test.ts +./packages/cspell-config-lib/src/loaders/loaderJavaScript.ts +./packages/cspell-config-lib/src/middlewareHelper.ts +./packages/cspell-config-lib/src/Serializer.ts +./packages/cspell-config-lib/src/serializers/cspellJson.test.ts +./packages/cspell-config-lib/src/serializers/cspellJson.ts +./packages/cspell-config-lib/src/serializers/cspellYaml.test.ts +./packages/cspell-config-lib/src/serializers/cspellYaml.ts +./packages/cspell-config-lib/src/serializers/index.test.ts +./packages/cspell-config-lib/src/serializers/index.ts +./packages/cspell-config-lib/src/serializers/packageJson.test.ts +./packages/cspell-config-lib/src/serializers/packageJson.ts +./packages/cspell-config-lib/src/serializers/util.test.ts +./packages/cspell-config-lib/src/serializers/util.ts +./packages/cspell-config-lib/src/test-helpers/fixtures.ts +./packages/cspell-config-lib/src/test-helpers/util.ts +./packages/cspell-config-lib/src/TextFile.ts +./packages/cspell-config-lib/src/util/toURL.ts +./packages/cspell-dictionary/CHANGELOG.md +./packages/cspell-dictionary/LICENSE +./packages/cspell-dictionary/README.md +./packages/cspell-dictionary/src/index.test.ts +./packages/cspell-dictionary/src/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/CachingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/CachingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/createInlineSpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/createInlineSpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/createSpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/createSpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/defaults.ts +./packages/cspell-dictionary/src/SpellingDictionary/FlagWordsDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/FlagWordsDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/IgnoreWordsDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/IgnoreWordsDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryCollection.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryCollection.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryFromTrie.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryFromTrie.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryMethods.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryMethods.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestOptions.ts +./packages/cspell-dictionary/src/SpellingDictionary/Terms/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/Terms/terms.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typos.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typosParser.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typosParser.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/util.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/util.ts +./packages/cspell-dictionary/src/SpellingDictionary/TyposDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/TyposDictionary.ts +./packages/cspell-dictionary/src/util/AutoCache.test.ts +./packages/cspell-dictionary/src/util/AutoCache.ts +./packages/cspell-dictionary/src/util/AutoResolve.test.ts +./packages/cspell-dictionary/src/util/AutoResolve.ts +./packages/cspell-dictionary/src/util/braceExpansion.test.ts +./packages/cspell-dictionary/src/util/braceExpansion.ts +./packages/cspell-dictionary/src/util/clean.test.ts +./packages/cspell-dictionary/src/util/clean.ts +./packages/cspell-dictionary/src/util/IterableLike.ts +./packages/cspell-dictionary/src/util/regexHelper.ts +./packages/cspell-dictionary/src/util/repMap.test.ts +./packages/cspell-dictionary/src/util/repMap.ts +./packages/cspell-dictionary/src/util/simpleCache.test.ts +./packages/cspell-dictionary/src/util/simpleCache.ts +./packages/cspell-dictionary/src/util/text.test.ts +./packages/cspell-dictionary/src/util/text.ts +./packages/cspell-dictionary/src/util/textMappers.test.ts +./packages/cspell-dictionary/src/util/textMappers.ts +./packages/cspell-dictionary/src/util/types.ts +./packages/cspell-dictionary/src/util/util.test.ts +./packages/cspell-dictionary/src/util/util.ts +./packages/cspell-dictionary/tsconfig.esm.json +./packages/cspell-eslint-plugin/CHANGELOG.md +./packages/cspell-eslint-plugin/CHANGELOG.md +./packages/cspell-eslint-plugin/eslint.config.js +./packages/cspell-eslint-plugin/eslint.config.js +./packages/cspell-eslint-plugin/LICENSE +./packages/cspell-eslint-plugin/LICENSE +./packages/cspell-eslint-plugin/README.md +./packages/cspell-eslint-plugin/README.md +./packages/cspell-eslint-plugin/scope.md +./packages/cspell-eslint-plugin/scope.md +./packages/cspell-eslint-plugin/scripts/build-options-schema.mjs +./packages/cspell-eslint-plugin/scripts/build-options-schema.mjs +./packages/cspell-eslint-plugin/scripts/jsconfig.json +./packages/cspell-eslint-plugin/scripts/jsconfig.json +./packages/cspell-eslint-plugin/src/common/logger.cts +./packages/cspell-eslint-plugin/src/common/logger.cts +./packages/cspell-eslint-plugin/src/common/options.cts +./packages/cspell-eslint-plugin/src/common/options.cts +./packages/cspell-eslint-plugin/src/common/options.test.mts +./packages/cspell-eslint-plugin/src/common/options.test.mts +./packages/cspell-eslint-plugin/src/plugin/configs.cts +./packages/cspell-eslint-plugin/src/plugin/configs.cts +./packages/cspell-eslint-plugin/src/plugin/cspell-eslint-plugin.cts +./packages/cspell-eslint-plugin/src/plugin/cspell-eslint-plugin.cts +./packages/cspell-eslint-plugin/src/plugin/defaultCheckOptions.cts +./packages/cspell-eslint-plugin/src/plugin/defaultCheckOptions.cts +./packages/cspell-eslint-plugin/src/plugin/index.cts +./packages/cspell-eslint-plugin/src/plugin/index.cts +./packages/cspell-eslint-plugin/src/plugin/recommended.cts +./packages/cspell-eslint-plugin/src/plugin/recommended.cts +./packages/cspell-eslint-plugin/src/test-util/testEach.mts +./packages/cspell-eslint-plugin/src/test-util/testEach.mts +./packages/cspell-eslint-plugin/src/test/eslint-plugin-react.d.ts +./packages/cspell-eslint-plugin/src/test/eslint-plugin-react.d.ts +./packages/cspell-eslint-plugin/src/test/import.test.mts +./packages/cspell-eslint-plugin/src/test/import.test.mts +./packages/cspell-eslint-plugin/src/test/index.test.mts +./packages/cspell-eslint-plugin/src/test/index.test.mts +./packages/cspell-eslint-plugin/src/test/json.test.mts +./packages/cspell-eslint-plugin/src/test/json.test.mts +./packages/cspell-eslint-plugin/src/test/jsx.test.mts +./packages/cspell-eslint-plugin/src/test/jsx.test.mts +./packages/cspell-eslint-plugin/src/test/yaml.test.mts +./packages/cspell-eslint-plugin/src/test/yaml.test.mts +./packages/cspell-eslint-plugin/src/worker/ASTNode.cts +./packages/cspell-eslint-plugin/src/worker/ASTNode.cts +./packages/cspell-eslint-plugin/src/worker/ASTPath.mts +./packages/cspell-eslint-plugin/src/worker/ASTPath.mts +./packages/cspell-eslint-plugin/src/worker/customScopes.mts +./packages/cspell-eslint-plugin/src/worker/customScopes.mts +./packages/cspell-eslint-plugin/src/worker/scope.mts +./packages/cspell-eslint-plugin/src/worker/scope.mts +./packages/cspell-eslint-plugin/src/worker/scope.test.mts +./packages/cspell-eslint-plugin/src/worker/scope.test.mts +./packages/cspell-eslint-plugin/src/worker/spellCheck.mts +./packages/cspell-eslint-plugin/src/worker/spellCheck.mts +./packages/cspell-eslint-plugin/src/worker/types.cts +./packages/cspell-eslint-plugin/src/worker/types.cts +./packages/cspell-eslint-plugin/src/worker/walkTree.mts +./packages/cspell-eslint-plugin/src/worker/walkTree.mts +./packages/cspell-eslint-plugin/src/worker/worker.mjs +./packages/cspell-eslint-plugin/src/worker/worker.mjs +./packages/cspell-eslint-plugin/tsconfig.base.json +./packages/cspell-eslint-plugin/tsconfig.base.json +./packages/cspell-gitignore/bin.mjs +./packages/cspell-gitignore/bin.mjs +./packages/cspell-gitignore/CHANGELOG.md +./packages/cspell-gitignore/CHANGELOG.md +./packages/cspell-gitignore/LICENSE +./packages/cspell-gitignore/LICENSE +./packages/cspell-gitignore/README.md +./packages/cspell-gitignore/README.md +./packages/cspell-gitignore/src/app.test.ts +./packages/cspell-gitignore/src/app.test.ts +./packages/cspell-gitignore/src/app.ts +./packages/cspell-gitignore/src/app.ts +./packages/cspell-gitignore/src/GitIgnore.test.ts +./packages/cspell-gitignore/src/GitIgnore.test.ts +./packages/cspell-gitignore/src/GitIgnore.ts +./packages/cspell-gitignore/src/GitIgnore.ts +./packages/cspell-gitignore/src/GitIgnoreFile.test.ts +./packages/cspell-gitignore/src/GitIgnoreFile.test.ts +./packages/cspell-gitignore/src/GitIgnoreFile.ts +./packages/cspell-gitignore/src/GitIgnoreFile.ts +./packages/cspell-gitignore/src/helpers.test.ts +./packages/cspell-gitignore/src/helpers.test.ts +./packages/cspell-gitignore/src/helpers.ts +./packages/cspell-gitignore/src/helpers.ts +./packages/cspell-gitignore/src/index.test.ts +./packages/cspell-gitignore/src/index.test.ts +./packages/cspell-gitignore/src/index.ts +./packages/cspell-gitignore/src/index.ts +./packages/cspell-gitignore/vitest.config.mts +./packages/cspell-gitignore/vitest.config.mts +./packages/cspell-glob/CHANGELOG.md +./packages/cspell-glob/LICENSE +./packages/cspell-glob/README.md +./packages/cspell-glob/src/globHelper.test.ts +./packages/cspell-glob/src/globHelper.ts +./packages/cspell-glob/src/GlobMatcher.test.ts +./packages/cspell-glob/src/GlobMatcher.ts +./packages/cspell-glob/src/GlobMatcherTypes.ts +./packages/cspell-glob/src/index.test.ts +./packages/cspell-glob/src/index.ts +./packages/cspell-grammar/bin.mjs +./packages/cspell-grammar/CHANGELOG.md +./packages/cspell-grammar/LICENSE +./packages/cspell-grammar/README.md +./packages/cspell-grammar/src/app.test.ts +./packages/cspell-grammar/src/app.ts +./packages/cspell-grammar/src/grammars/index.ts +./packages/cspell-grammar/src/grammars/markdown.ts +./packages/cspell-grammar/src/grammars/simple.ts +./packages/cspell-grammar/src/grammars/typescript.ts +./packages/cspell-grammar/src/index.test.ts +./packages/cspell-grammar/src/index.ts +./packages/cspell-grammar/src/mappers/appendMappedText.test.ts +./packages/cspell-grammar/src/mappers/appendMappedText.ts +./packages/cspell-grammar/src/mappers/types.ts +./packages/cspell-grammar/src/mappers/typescript.test.ts +./packages/cspell-grammar/src/mappers/typescript.ts +./packages/cspell-grammar/src/parser/grammar.ts +./packages/cspell-grammar/src/parser/grammarDefinition.ts +./packages/cspell-grammar/src/parser/grammarNormalized.ts +./packages/cspell-grammar/src/parser/grammarNormalizer.test.ts +./packages/cspell-grammar/src/parser/grammarNormalizer.ts +./packages/cspell-grammar/src/parser/grammarTypesHelpers.ts +./packages/cspell-grammar/src/parser/index.ts +./packages/cspell-grammar/src/parser/matchResult.test.ts +./packages/cspell-grammar/src/parser/matchResult.ts +./packages/cspell-grammar/src/parser/parser.ts +./packages/cspell-grammar/src/parser/processors/procMatchingRule.test.ts +./packages/cspell-grammar/src/parser/processors/procMatchingRule.ts +./packages/cspell-grammar/src/parser/scope.test.ts +./packages/cspell-grammar/src/parser/scope.ts +./packages/cspell-grammar/src/parser/tokenizeLine.test.ts +./packages/cspell-grammar/src/parser/tokenizeLine.ts +./packages/cspell-grammar/src/parser/types.ts +./packages/cspell-grammar/src/parser/util.ts +./packages/cspell-grammar/src/parser/validateGrammar.test.ts +./packages/cspell-grammar/src/parser/validateGrammar.ts +./packages/cspell-grammar/src/parsers/index.ts +./packages/cspell-grammar/src/parsers/typescript/index.test.ts +./packages/cspell-grammar/src/parsers/typescript/index.ts +./packages/cspell-grammar/src/parsers/typescript/TypeScriptParser.ts +./packages/cspell-grammar/src/viewer/escapeMarkdown.test.ts +./packages/cspell-grammar/src/viewer/escapeMarkdown.ts +./packages/cspell-grammar/src/viewer/markdownHelper.ts +./packages/cspell-grammar/src/viewer/visualizeAsMD.test.ts +./packages/cspell-grammar/src/viewer/visualizeAsMD.ts +./packages/cspell-grammar/tsconfig.esm.json +./packages/cspell-io/CHANGELOG.md +./packages/cspell-io/LICENSE +./packages/cspell-io/README.md +./packages/cspell-io/src/async/asyncIterable.test.ts +./packages/cspell-io/src/async/asyncIterable.ts +./packages/cspell-io/src/common/arrayBuffers.test.ts +./packages/cspell-io/src/common/arrayBuffers.ts +./packages/cspell-io/src/common/BufferEncoding.ts +./packages/cspell-io/src/common/CFileReference.ts +./packages/cspell-io/src/common/CFileResource.test.ts +./packages/cspell-io/src/common/CFileResource.ts +./packages/cspell-io/src/common/encode-decode.test.ts +./packages/cspell-io/src/common/encode-decode.ts +./packages/cspell-io/src/common/index.ts +./packages/cspell-io/src/common/stat.test.ts +./packages/cspell-io/src/common/stat.ts +./packages/cspell-io/src/common/transformers.test.ts +./packages/cspell-io/src/common/transformers.ts +./packages/cspell-io/src/common/urlOrReferenceToUrl.ts +./packages/cspell-io/src/CSpellIO.ts +./packages/cspell-io/src/CSpellIONode.test.ts +./packages/cspell-io/src/CSpellIONode.ts +./packages/cspell-io/src/CSpellIOWeb.ts +./packages/cspell-io/src/CVirtualFS.ts +./packages/cspell-io/src/errors/assert.test.ts +./packages/cspell-io/src/errors/assert.ts +./packages/cspell-io/src/errors/error.test.ts +./packages/cspell-io/src/errors/error.ts +./packages/cspell-io/src/errors/errors.test.ts +./packages/cspell-io/src/errors/errors.ts +./packages/cspell-io/src/errors/index.ts +./packages/cspell-io/src/file/file.test.ts +./packages/cspell-io/src/file/file.ts +./packages/cspell-io/src/file/index.ts +./packages/cspell-io/src/handlers/node/file.ts +./packages/cspell-io/src/index.test.ts +./packages/cspell-io/src/index.ts +./packages/cspell-io/src/models/BufferEncoding.ts +./packages/cspell-io/src/models/disposable.ts +./packages/cspell-io/src/models/FileResource.ts +./packages/cspell-io/src/models/index.ts +./packages/cspell-io/src/models/LogEvent.ts +./packages/cspell-io/src/models/Stats.ts +./packages/cspell-io/src/node/dataUrl.test.ts +./packages/cspell-io/src/node/dataUrl.ts +./packages/cspell-io/src/node/file/_fetch.ts +./packages/cspell-io/src/node/file/fetch.test.ts +./packages/cspell-io/src/node/file/fetch.ts +./packages/cspell-io/src/node/file/FetchError.test.ts +./packages/cspell-io/src/node/file/FetchError.ts +./packages/cspell-io/src/node/file/fileWriter.test.ts +./packages/cspell-io/src/node/file/fileWriter.ts +./packages/cspell-io/src/node/file/index.ts +./packages/cspell-io/src/node/file/stat.test.ts +./packages/cspell-io/src/node/file/stat.ts +./packages/cspell-io/src/node/file/url.test.ts +./packages/cspell-io/src/node/file/url.ts +./packages/cspell-io/src/requests/index.ts +./packages/cspell-io/src/requests/RequestFsReadDirectory.ts +./packages/cspell-io/src/requests/RequestFsReadFile.ts +./packages/cspell-io/src/requests/RequestFsReadFileSync.ts +./packages/cspell-io/src/requests/RequestFsStat.ts +./packages/cspell-io/src/requests/RequestFsWriteFile.ts +./packages/cspell-io/src/requests/RequestZlibInflate.ts +./packages/cspell-io/src/test/test.helper.ts +./packages/cspell-io/src/VFileSystem.ts +./packages/cspell-io/src/VirtualFs.test.ts +./packages/cspell-io/src/VirtualFS.ts +./packages/cspell-io/src/VirtualFS/CVFileSystem.test.ts +./packages/cspell-io/src/VirtualFS/CVFileSystem.ts +./packages/cspell-io/src/VirtualFS/findUpFromUrl.test.ts +./packages/cspell-io/src/VirtualFS/findUpFromUrl.ts +./packages/cspell-io/src/VirtualFS/redirectProvider.test.ts +./packages/cspell-io/src/VirtualFS/redirectProvider.ts +./packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts +./packages/cspell-io/tsconfig.esm.json +./packages/cspell-json-reporter/CHANGELOG.md +./packages/cspell-json-reporter/README.md +./packages/cspell-json-reporter/src/CSpellJSONReporterOutput.ts +./packages/cspell-json-reporter/src/CSpellJSONReporterSettings.ts +./packages/cspell-json-reporter/src/index.test.ts +./packages/cspell-json-reporter/src/index.ts +./packages/cspell-json-reporter/src/utils/setToJSONReplacer.test.ts +./packages/cspell-json-reporter/src/utils/setToJSONReplacer.ts +./packages/cspell-json-reporter/src/utils/validateSettings.test.ts +./packages/cspell-json-reporter/src/utils/validateSettings.ts +./packages/cspell-json-reporter/tsconfig.esm.json +./packages/cspell-lib/api/api.d.ts +./packages/cspell-lib/api/api.d.ts +./packages/cspell-lib/api/rollup.config.mjs +./packages/cspell-lib/api/rollup.config.mjs +./packages/cspell-lib/CHANGELOG.md +./packages/cspell-lib/CHANGELOG.md +./packages/cspell-lib/CONTRIBUTORS.md +./packages/cspell-lib/CONTRIBUTORS.md +./packages/cspell-lib/DefaultCSpell.json +./packages/cspell-lib/DefaultCSpell.json +./packages/cspell-lib/docs/accents.md +./packages/cspell-lib/docs/accents.md +./packages/cspell-lib/docs/cache.md +./packages/cspell-lib/docs/cache.md +./packages/cspell-lib/docs/configuration.md +./packages/cspell-lib/docs/configuration.md +./packages/cspell-lib/LICENSE +./packages/cspell-lib/LICENSE +./packages/cspell-lib/README.md +./packages/cspell-lib/README.md +./packages/cspell-lib/SpellingDictionaries.md +./packages/cspell-lib/SpellingDictionaries.md +./packages/cspell-lib/src/lib-cjs/index.cjs +./packages/cspell-lib/src/lib-cjs/index.cjs +./packages/cspell-lib/src/lib-cjs/index.cts +./packages/cspell-lib/src/lib-cjs/index.cts +./packages/cspell-lib/src/lib-cjs/index.d.cts +./packages/cspell-lib/src/lib-cjs/pkg-info.cjs +./packages/cspell-lib/src/lib-cjs/pkg-info.cjs +./packages/cspell-lib/src/lib-cjs/pkg-info.cts +./packages/cspell-lib/src/lib-cjs/pkg-info.cts +./packages/cspell-lib/src/lib-cjs/pkg-info.d.cts +./packages/cspell-lib/src/lib-cjs/tsconfig.cjs.json +./packages/cspell-lib/src/lib-cjs/tsconfig.cjs.json +./packages/cspell-lib/src/lib-cjs/tsconfig.test.json +./packages/cspell-lib/src/lib-cjs/tsconfig.test.json +./packages/cspell-lib/src/lib/Cache/index.test.ts +./packages/cspell-lib/src/lib/Cache/index.test.ts +./packages/cspell-lib/src/lib/Cache/index.ts +./packages/cspell-lib/src/lib/Cache/index.ts +./packages/cspell-lib/src/lib/clearCachedFiles.test.ts +./packages/cspell-lib/src/lib/clearCachedFiles.test.ts +./packages/cspell-lib/src/lib/clearCachedFiles.ts +./packages/cspell-lib/src/lib/clearCachedFiles.ts +./packages/cspell-lib/src/lib/Document/Document.ts +./packages/cspell-lib/src/lib/Document/Document.ts +./packages/cspell-lib/src/lib/Document/index.ts +./packages/cspell-lib/src/lib/Document/index.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.test.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.test.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.ts +./packages/cspell-lib/src/lib/Document/normalizeLanguageIds.ts +./packages/cspell-lib/src/lib/Document/normalizeLanguageIds.ts +./packages/cspell-lib/src/lib/Document/resolveDocument.ts +./packages/cspell-lib/src/lib/Document/resolveDocument.ts +./packages/cspell-lib/src/lib/events/events.test.ts +./packages/cspell-lib/src/lib/events/events.test.ts +./packages/cspell-lib/src/lib/events/events.ts +./packages/cspell-lib/src/lib/events/events.ts +./packages/cspell-lib/src/lib/events/index.ts +./packages/cspell-lib/src/lib/events/index.ts +./packages/cspell-lib/src/lib/exclusionHelper.test.ts +./packages/cspell-lib/src/lib/exclusionHelper.test.ts +./packages/cspell-lib/src/lib/exclusionHelper.ts +./packages/cspell-lib/src/lib/exclusionHelper.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFalgs.test.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFalgs.test.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFlags.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFlags.ts +./packages/cspell-lib/src/lib/FeatureFlags/index.ts +./packages/cspell-lib/src/lib/FeatureFlags/index.ts +./packages/cspell-lib/src/lib/fileSystem.ts +./packages/cspell-lib/src/lib/fileSystem.ts +./packages/cspell-lib/src/lib/getDictionary.ts +./packages/cspell-lib/src/lib/getDictionary.ts +./packages/cspell-lib/src/lib/globs/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/globs/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/globs/getGlobMatcher.ts +./packages/cspell-lib/src/lib/globs/getGlobMatcher.ts +./packages/cspell-lib/src/lib/index.test.ts +./packages/cspell-lib/src/lib/index.test.ts +./packages/cspell-lib/src/lib/index.ts +./packages/cspell-lib/src/lib/index.ts +./packages/cspell-lib/src/lib/LanguageIds.test.ts +./packages/cspell-lib/src/lib/LanguageIds.test.ts +./packages/cspell-lib/src/lib/LanguageIds.ts +./packages/cspell-lib/src/lib/LanguageIds.ts +./packages/cspell-lib/src/lib/leaked-handles.d.ts +./packages/cspell-lib/src/lib/leaked-handles.d.ts +./packages/cspell-lib/src/lib/Models/CSpellSettingsInternalDef.ts +./packages/cspell-lib/src/lib/Models/CSpellSettingsInternalDef.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.test.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.test.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.ts +./packages/cspell-lib/src/lib/Models/Suggestion.ts +./packages/cspell-lib/src/lib/Models/Suggestion.ts +./packages/cspell-lib/src/lib/Models/TextDocument.test.ts +./packages/cspell-lib/src/lib/Models/TextDocument.test.ts +./packages/cspell-lib/src/lib/Models/TextDocument.ts +./packages/cspell-lib/src/lib/Models/TextDocument.ts +./packages/cspell-lib/src/lib/Models/ValidationIssue.ts +./packages/cspell-lib/src/lib/Models/ValidationIssue.ts +./packages/cspell-lib/src/lib/Models/ValidationResult.ts +./packages/cspell-lib/src/lib/Models/ValidationResult.ts +./packages/cspell-lib/src/lib/node-namespace.d.ts +./packages/cspell-lib/src/lib/node-namespace.d.ts +./packages/cspell-lib/src/lib/perf/index.ts +./packages/cspell-lib/src/lib/perf/index.ts +./packages/cspell-lib/src/lib/perf/perf.test.ts +./packages/cspell-lib/src/lib/perf/perf.test.ts +./packages/cspell-lib/src/lib/perf/perf.ts +./packages/cspell-lib/src/lib/perf/perf.ts +./packages/cspell-lib/src/lib/perf/README.md +./packages/cspell-lib/src/lib/perf/README.md +./packages/cspell-lib/src/lib/perf/timer.test.ts +./packages/cspell-lib/src/lib/perf/timer.test.ts +./packages/cspell-lib/src/lib/perf/timer.ts +./packages/cspell-lib/src/lib/perf/timer.ts +./packages/cspell-lib/src/lib/Settings/calcOverrideSettings.ts +./packages/cspell-lib/src/lib/Settings/calcOverrideSettings.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.test.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.test.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.ts +./packages/cspell-lib/src/lib/Settings/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/Settings/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/Settings/constants.ts +./packages/cspell-lib/src/lib/Settings/constants.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLocations.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLocations.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/extractImportErrors.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/extractImportErrors.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/PnPSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/PnPSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettingsFiles.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettingsFiles.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/toGlobDef.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/toGlobDef.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/types.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/types.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.ts +./packages/cspell-lib/src/lib/Settings/Controller/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.test.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.test.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.test.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.test.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.test.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.test.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.test.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.test.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.ts +./packages/cspell-lib/src/lib/Settings/index.link.ts +./packages/cspell-lib/src/lib/Settings/index.link.ts +./packages/cspell-lib/src/lib/Settings/index.ts +./packages/cspell-lib/src/lib/Settings/index.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.test.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.test.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.test.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.test.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.ts +./packages/cspell-lib/src/lib/Settings/link.test.ts +./packages/cspell-lib/src/lib/Settings/link.test.ts +./packages/cspell-lib/src/lib/Settings/link.ts +./packages/cspell-lib/src/lib/Settings/link.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.test.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.test.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.ts +./packages/cspell-lib/src/lib/Settings/mergeList.ts +./packages/cspell-lib/src/lib/Settings/mergeList.ts +./packages/cspell-lib/src/lib/Settings/patterns.test.ts +./packages/cspell-lib/src/lib/Settings/patterns.test.ts +./packages/cspell-lib/src/lib/Settings/patterns.ts +./packages/cspell-lib/src/lib/Settings/patterns.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.test.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.test.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.ts +./packages/cspell-lib/src/lib/spellCheckFile.test.ts +./packages/cspell-lib/src/lib/spellCheckFile.test.ts +./packages/cspell-lib/src/lib/spellCheckFile.ts +./packages/cspell-lib/src/lib/spellCheckFile.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionary.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionary.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionaryError.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionaryError.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/entities.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/entities.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.ts +./packages/cspell-lib/src/lib/suggestions.test.ts +./packages/cspell-lib/src/lib/suggestions.test.ts +./packages/cspell-lib/src/lib/suggestions.ts +./packages/cspell-lib/src/lib/suggestions.ts +./packages/cspell-lib/src/lib/test/bugs.spec.ts +./packages/cspell-lib/src/lib/test/bugs.spec.ts +./packages/cspell-lib/src/lib/test/dutch.spec.ts +./packages/cspell-lib/src/lib/test/dutch.spec.ts +./packages/cspell-lib/src/lib/test/english.spec.ts +./packages/cspell-lib/src/lib/test/english.spec.ts +./packages/cspell-lib/src/lib/test/fa.spec.ts +./packages/cspell-lib/src/lib/test/fa.spec.ts +./packages/cspell-lib/src/lib/test/french.spec.ts +./packages/cspell-lib/src/lib/test/french.spec.ts +./packages/cspell-lib/src/lib/test/golang.spec.ts +./packages/cspell-lib/src/lib/test/golang.spec.ts +./packages/cspell-lib/src/lib/test/python.spec.ts +./packages/cspell-lib/src/lib/test/python.spec.ts +./packages/cspell-lib/src/lib/test/README.md +./packages/cspell-lib/src/lib/test/README.md +./packages/cspell-lib/src/lib/textValidation/checkText.test.ts +./packages/cspell-lib/src/lib/textValidation/checkText.test.ts +./packages/cspell-lib/src/lib/textValidation/checkText.ts +./packages/cspell-lib/src/lib/textValidation/checkText.ts +./packages/cspell-lib/src/lib/textValidation/defaultConstants.ts +./packages/cspell-lib/src/lib/textValidation/defaultConstants.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.ts +./packages/cspell-lib/src/lib/textValidation/index.ts +./packages/cspell-lib/src/lib/textValidation/index.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.test.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.test.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.test.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.test.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.test.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.test.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.ts +./packages/cspell-lib/src/lib/textValidation/settingsToValidateOptions.ts +./packages/cspell-lib/src/lib/textValidation/settingsToValidateOptions.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.test.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.test.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.ts +./packages/cspell-lib/src/lib/textValidation/ValidateTextOptions.ts +./packages/cspell-lib/src/lib/textValidation/ValidateTextOptions.ts +./packages/cspell-lib/src/lib/textValidation/ValidationTypes.ts +./packages/cspell-lib/src/lib/textValidation/ValidationTypes.ts +./packages/cspell-lib/src/lib/textValidation/validator.test.ts +./packages/cspell-lib/src/lib/textValidation/validator.test.ts +./packages/cspell-lib/src/lib/textValidation/validator.ts +./packages/cspell-lib/src/lib/textValidation/validator.ts +./packages/cspell-lib/src/lib/trace.test.ts +./packages/cspell-lib/src/lib/trace.test.ts +./packages/cspell-lib/src/lib/trace.ts +./packages/cspell-lib/src/lib/trace.ts +./packages/cspell-lib/src/lib/util/AutoResolve.test.ts +./packages/cspell-lib/src/lib/util/AutoResolve.test.ts +./packages/cspell-lib/src/lib/util/AutoResolve.ts +./packages/cspell-lib/src/lib/util/AutoResolve.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.test.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.test.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.ts +./packages/cspell-lib/src/lib/util/Comparable.test.ts +./packages/cspell-lib/src/lib/util/Comparable.test.ts +./packages/cspell-lib/src/lib/util/Comparable.ts +./packages/cspell-lib/src/lib/util/Comparable.ts +./packages/cspell-lib/src/lib/util/errors.test.ts +./packages/cspell-lib/src/lib/util/errors.test.ts +./packages/cspell-lib/src/lib/util/errors.ts +./packages/cspell-lib/src/lib/util/errors.ts +./packages/cspell-lib/src/lib/util/fileReader.test.ts +./packages/cspell-lib/src/lib/util/fileReader.test.ts +./packages/cspell-lib/src/lib/util/fileReader.ts +./packages/cspell-lib/src/lib/util/fileReader.ts +./packages/cspell-lib/src/lib/util/findUp.test.ts +./packages/cspell-lib/src/lib/util/findUp.test.ts +./packages/cspell-lib/src/lib/util/findUp.ts +./packages/cspell-lib/src/lib/util/findUp.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.test.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.test.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.ts +./packages/cspell-lib/src/lib/util/FreqCounter.test.ts +./packages/cspell-lib/src/lib/util/FreqCounter.test.ts +./packages/cspell-lib/src/lib/util/FreqCounter.ts +./packages/cspell-lib/src/lib/util/FreqCounter.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.test.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.test.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.ts +./packages/cspell-lib/src/lib/util/IterableLike.ts +./packages/cspell-lib/src/lib/util/IterableLike.ts +./packages/cspell-lib/src/lib/util/logger.test.ts +./packages/cspell-lib/src/lib/util/logger.test.ts +./packages/cspell-lib/src/lib/util/logger.ts +./packages/cspell-lib/src/lib/util/logger.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.test.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.test.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.test.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.test.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.test.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.test.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.ts +./packages/cspell-lib/src/lib/util/PairingHeap.test.ts +./packages/cspell-lib/src/lib/util/PairingHeap.test.ts +./packages/cspell-lib/src/lib/util/PairingHeap.ts +./packages/cspell-lib/src/lib/util/PairingHeap.ts +./packages/cspell-lib/src/lib/util/regexHelper.ts +./packages/cspell-lib/src/lib/util/regexHelper.ts +./packages/cspell-lib/src/lib/util/repMap.test.ts +./packages/cspell-lib/src/lib/util/repMap.test.ts +./packages/cspell-lib/src/lib/util/repMap.ts +./packages/cspell-lib/src/lib/util/repMap.ts +./packages/cspell-lib/src/lib/util/resolveFile.test.ts +./packages/cspell-lib/src/lib/util/resolveFile.test.ts +./packages/cspell-lib/src/lib/util/resolveFile.ts +./packages/cspell-lib/src/lib/util/resolveFile.ts +./packages/cspell-lib/src/lib/util/search.test.ts +./packages/cspell-lib/src/lib/util/search.test.ts +./packages/cspell-lib/src/lib/util/search.ts +./packages/cspell-lib/src/lib/util/search.ts +./packages/cspell-lib/src/lib/util/simpleCache.test.ts +./packages/cspell-lib/src/lib/util/simpleCache.test.ts +./packages/cspell-lib/src/lib/util/simpleCache.ts +./packages/cspell-lib/src/lib/util/simpleCache.ts +./packages/cspell-lib/src/lib/util/templates.test.ts +./packages/cspell-lib/src/lib/util/templates.test.ts +./packages/cspell-lib/src/lib/util/templates.ts +./packages/cspell-lib/src/lib/util/templates.ts +./packages/cspell-lib/src/lib/util/text.test.ts +./packages/cspell-lib/src/lib/util/text.test.ts +./packages/cspell-lib/src/lib/util/text.ts +./packages/cspell-lib/src/lib/util/text.ts +./packages/cspell-lib/src/lib/util/TextMap.test.ts +./packages/cspell-lib/src/lib/util/TextMap.test.ts +./packages/cspell-lib/src/lib/util/TextMap.ts +./packages/cspell-lib/src/lib/util/TextMap.ts +./packages/cspell-lib/src/lib/util/TextRange.regexp.test.ts +./packages/cspell-lib/src/lib/util/TextRange.regexp.test.ts +./packages/cspell-lib/src/lib/util/TextRange.test.ts +./packages/cspell-lib/src/lib/util/TextRange.test.ts +./packages/cspell-lib/src/lib/util/TextRange.ts +./packages/cspell-lib/src/lib/util/TextRange.ts +./packages/cspell-lib/src/lib/util/textRegex.test.ts +./packages/cspell-lib/src/lib/util/textRegex.test.ts +./packages/cspell-lib/src/lib/util/textRegex.ts +./packages/cspell-lib/src/lib/util/textRegex.ts +./packages/cspell-lib/src/lib/util/types.ts +./packages/cspell-lib/src/lib/util/types.ts +./packages/cspell-lib/src/lib/util/Uri.test.ts +./packages/cspell-lib/src/lib/util/Uri.test.ts +./packages/cspell-lib/src/lib/util/Uri.ts +./packages/cspell-lib/src/lib/util/Uri.ts +./packages/cspell-lib/src/lib/util/url.test.ts +./packages/cspell-lib/src/lib/util/url.test.ts +./packages/cspell-lib/src/lib/util/url.ts +./packages/cspell-lib/src/lib/util/url.ts +./packages/cspell-lib/src/lib/util/util.test.ts +./packages/cspell-lib/src/lib/util/util.test.ts +./packages/cspell-lib/src/lib/util/util.ts +./packages/cspell-lib/src/lib/util/util.ts +./packages/cspell-lib/src/lib/util/wordSplitter.test.ts +./packages/cspell-lib/src/lib/util/wordSplitter.test.ts +./packages/cspell-lib/src/lib/util/wordSplitter.ts +./packages/cspell-lib/src/lib/util/wordSplitter.ts +./packages/cspell-lib/src/lib/validator.ts +./packages/cspell-lib/src/lib/validator.ts +./packages/cspell-lib/src/lib/wordListHelper.test.ts +./packages/cspell-lib/src/lib/wordListHelper.test.ts +./packages/cspell-lib/src/lib/wordListHelper.ts +./packages/cspell-lib/src/lib/wordListHelper.ts +./packages/cspell-lib/src/test-util/index.mts +./packages/cspell-lib/src/test-util/index.mts +./packages/cspell-lib/src/test-util/README.md +./packages/cspell-lib/src/test-util/README.md +./packages/cspell-lib/src/test-util/test.locations.cts +./packages/cspell-lib/src/test-util/test.locations.cts +./packages/cspell-lib/src/test-util/test.matchers.mts +./packages/cspell-lib/src/test-util/test.matchers.mts +./packages/cspell-lib/tsconfig.esm.json +./packages/cspell-lib/tsconfig.esm.json +./packages/cspell-pipe/CHANGELOG.md +./packages/cspell-pipe/CHANGELOG.md +./packages/cspell-pipe/LICENSE +./packages/cspell-pipe/LICENSE +./packages/cspell-pipe/README.md +./packages/cspell-pipe/README.md +./packages/cspell-pipe/src/async/index.test.ts +./packages/cspell-pipe/src/async/index.test.ts +./packages/cspell-pipe/src/async/index.ts +./packages/cspell-pipe/src/async/index.ts +./packages/cspell-pipe/src/helpers/distribute.test.ts +./packages/cspell-pipe/src/helpers/distribute.test.ts +./packages/cspell-pipe/src/helpers/distribute.ts +./packages/cspell-pipe/src/helpers/distribute.ts +./packages/cspell-pipe/src/helpers/index.test.ts +./packages/cspell-pipe/src/helpers/index.test.ts +./packages/cspell-pipe/src/helpers/index.ts +./packages/cspell-pipe/src/helpers/index.ts +./packages/cspell-pipe/src/helpers/interleave.test.ts +./packages/cspell-pipe/src/helpers/interleave.test.ts +./packages/cspell-pipe/src/helpers/interleave.ts +./packages/cspell-pipe/src/helpers/interleave.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.test.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.test.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.ts +./packages/cspell-pipe/src/helpers/toArray.ts +./packages/cspell-pipe/src/helpers/toArray.ts +./packages/cspell-pipe/src/helpers/toAsyncIterable.ts +./packages/cspell-pipe/src/helpers/toAsyncIterable.ts +./packages/cspell-pipe/src/helpers/util.ts +./packages/cspell-pipe/src/helpers/util.ts +./packages/cspell-pipe/src/index.test.ts +./packages/cspell-pipe/src/index.test.ts +./packages/cspell-pipe/src/index.ts +./packages/cspell-pipe/src/index.ts +./packages/cspell-pipe/src/internalTypes.ts +./packages/cspell-pipe/src/internalTypes.ts +./packages/cspell-pipe/src/operators/append.test.ts +./packages/cspell-pipe/src/operators/append.test.ts +./packages/cspell-pipe/src/operators/append.ts +./packages/cspell-pipe/src/operators/append.ts +./packages/cspell-pipe/src/operators/await.test.ts +./packages/cspell-pipe/src/operators/await.test.ts +./packages/cspell-pipe/src/operators/await.ts +./packages/cspell-pipe/src/operators/await.ts +./packages/cspell-pipe/src/operators/buffer.test.ts +./packages/cspell-pipe/src/operators/buffer.test.ts +./packages/cspell-pipe/src/operators/buffer.ts +./packages/cspell-pipe/src/operators/buffer.ts +./packages/cspell-pipe/src/operators/combine.ts +./packages/cspell-pipe/src/operators/combine.ts +./packages/cspell-pipe/src/operators/concatMap.test.ts +./packages/cspell-pipe/src/operators/concatMap.test.ts +./packages/cspell-pipe/src/operators/concatMap.ts +./packages/cspell-pipe/src/operators/concatMap.ts +./packages/cspell-pipe/src/operators/filter.test.ts +./packages/cspell-pipe/src/operators/filter.test.ts +./packages/cspell-pipe/src/operators/filter.ts +./packages/cspell-pipe/src/operators/filter.ts +./packages/cspell-pipe/src/operators/first.test.ts +./packages/cspell-pipe/src/operators/first.test.ts +./packages/cspell-pipe/src/operators/first.ts +./packages/cspell-pipe/src/operators/first.ts +./packages/cspell-pipe/src/operators/flatten.test.ts +./packages/cspell-pipe/src/operators/flatten.test.ts +./packages/cspell-pipe/src/operators/flatten.ts +./packages/cspell-pipe/src/operators/flatten.ts +./packages/cspell-pipe/src/operators/index.test.ts +./packages/cspell-pipe/src/operators/index.test.ts +./packages/cspell-pipe/src/operators/index.ts +./packages/cspell-pipe/src/operators/index.ts +./packages/cspell-pipe/src/operators/joinStrings.test.ts +./packages/cspell-pipe/src/operators/joinStrings.test.ts +./packages/cspell-pipe/src/operators/joinStrings.ts +./packages/cspell-pipe/src/operators/joinStrings.ts +./packages/cspell-pipe/src/operators/last.test.ts +./packages/cspell-pipe/src/operators/last.test.ts +./packages/cspell-pipe/src/operators/last.ts +./packages/cspell-pipe/src/operators/last.ts +./packages/cspell-pipe/src/operators/map.test.ts +./packages/cspell-pipe/src/operators/map.test.ts +./packages/cspell-pipe/src/operators/map.ts +./packages/cspell-pipe/src/operators/map.ts +./packages/cspell-pipe/src/operators/reduce.test.ts +./packages/cspell-pipe/src/operators/reduce.test.ts +./packages/cspell-pipe/src/operators/reduce.ts +./packages/cspell-pipe/src/operators/reduce.ts +./packages/cspell-pipe/src/operators/skip.test.ts +./packages/cspell-pipe/src/operators/skip.test.ts +./packages/cspell-pipe/src/operators/skip.ts +./packages/cspell-pipe/src/operators/skip.ts +./packages/cspell-pipe/src/operators/take.test.ts +./packages/cspell-pipe/src/operators/take.test.ts +./packages/cspell-pipe/src/operators/take.ts +./packages/cspell-pipe/src/operators/take.ts +./packages/cspell-pipe/src/operators/tap.test.ts +./packages/cspell-pipe/src/operators/tap.test.ts +./packages/cspell-pipe/src/operators/tap.ts +./packages/cspell-pipe/src/operators/tap.ts +./packages/cspell-pipe/src/operators/types.ts +./packages/cspell-pipe/src/operators/types.ts +./packages/cspell-pipe/src/operators/unique.test.ts +./packages/cspell-pipe/src/operators/unique.test.ts +./packages/cspell-pipe/src/operators/unique.ts +./packages/cspell-pipe/src/operators/unique.ts +./packages/cspell-pipe/src/pipe.test.ts +./packages/cspell-pipe/src/pipe.test.ts +./packages/cspell-pipe/src/pipe.ts +./packages/cspell-pipe/src/pipe.ts +./packages/cspell-pipe/src/reduce.test.ts +./packages/cspell-pipe/src/reduce.test.ts +./packages/cspell-pipe/src/reduce.ts +./packages/cspell-pipe/src/reduce.ts +./packages/cspell-pipe/src/sync/index.test.ts +./packages/cspell-pipe/src/sync/index.test.ts +./packages/cspell-pipe/src/sync/index.ts +./packages/cspell-pipe/src/sync/index.ts +./packages/cspell-pipe/src/test/fibonacci.ts +./packages/cspell-pipe/src/test/fibonacci.ts +./packages/cspell-pipe/tsconfig.esm.json +./packages/cspell-pipe/tsconfig.esm.json +./packages/cspell-resolver/CHANGELOG.md +./packages/cspell-resolver/CHANGELOG.md +./packages/cspell-resolver/LICENSE +./packages/cspell-resolver/LICENSE +./packages/cspell-resolver/README.md +./packages/cspell-resolver/README.md +./packages/cspell-resolver/src/index.mts +./packages/cspell-resolver/src/index.mts +./packages/cspell-resolver/src/index.test.mts +./packages/cspell-resolver/src/index.test.mts +./packages/cspell-resolver/src/requireResolve.test.mts +./packages/cspell-resolver/src/requireResolve.test.mts +./packages/cspell-resolver/src/requireResolve.ts +./packages/cspell-resolver/src/requireResolve.ts +./packages/cspell-resolver/src/resolveGlobal.mts +./packages/cspell-resolver/src/resolveGlobal.mts +./packages/cspell-service-bus/CHANGELOG.md +./packages/cspell-service-bus/LICENSE +./packages/cspell-service-bus/README.md +./packages/cspell-service-bus/src/assert.test.ts +./packages/cspell-service-bus/src/assert.ts +./packages/cspell-service-bus/src/bus.test.ts +./packages/cspell-service-bus/src/bus.ts +./packages/cspell-service-bus/src/createRequestHandler.ts +./packages/cspell-service-bus/src/Dispatcher.ts +./packages/cspell-service-bus/src/errors.ts +./packages/cspell-service-bus/src/handlers.ts +./packages/cspell-service-bus/src/index.test.ts +./packages/cspell-service-bus/src/index.ts +./packages/cspell-service-bus/src/request.test.ts +./packages/cspell-service-bus/src/request.ts +./packages/cspell-service-bus/src/requestFactory.ts +./packages/cspell-service-bus/src/ServiceRequestFactory.ts +./packages/cspell-service-bus/src/SystemServiceBus.test.ts +./packages/cspell-service-bus/src/SystemServiceBus.ts +./packages/cspell-service-bus/tsconfig.esm.json +./packages/cspell-strong-weak-map/CHANGELOG.md +./packages/cspell-strong-weak-map/CHANGELOG.md +./packages/cspell-strong-weak-map/LICENSE +./packages/cspell-strong-weak-map/LICENSE +./packages/cspell-strong-weak-map/README.md +./packages/cspell-strong-weak-map/README.md +./packages/cspell-strong-weak-map/src/examples/fileCache.test.ts +./packages/cspell-strong-weak-map/src/examples/fileCache.test.ts +./packages/cspell-strong-weak-map/src/examples/fileCache.ts +./packages/cspell-strong-weak-map/src/examples/fileCache.ts +./packages/cspell-strong-weak-map/src/index.ts +./packages/cspell-strong-weak-map/src/index.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.test.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.test.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.ts +./packages/cspell-strong-weak-map/tsconfig.esm.json +./packages/cspell-strong-weak-map/tsconfig.esm.json +./packages/cspell-tools/bin.mjs +./packages/cspell-tools/CHANGELOG.md +./packages/cspell-tools/LICENSE +./packages/cspell-tools/README.md +./packages/cspell-tools/src/app.test.ts +./packages/cspell-tools/src/app.ts +./packages/cspell-tools/src/AppOptions.ts +./packages/cspell-tools/src/build.test.ts +./packages/cspell-tools/src/build.ts +./packages/cspell-tools/src/compile.test.ts +./packages/cspell-tools/src/compile.ts +./packages/cspell-tools/src/compiler/compile.test.ts +./packages/cspell-tools/src/compiler/compile.ts +./packages/cspell-tools/src/compiler/CompileOptions.ts +./packages/cspell-tools/src/compiler/createCompileRequest.test.ts +./packages/cspell-tools/src/compiler/createCompileRequest.ts +./packages/cspell-tools/src/compiler/createWordsCollection.test.ts +./packages/cspell-tools/src/compiler/createWordsCollection.ts +./packages/cspell-tools/src/compiler/fileWriter.test.ts +./packages/cspell-tools/src/compiler/fileWriter.ts +./packages/cspell-tools/src/compiler/index.ts +./packages/cspell-tools/src/compiler/legacyLineToWords.test.ts +./packages/cspell-tools/src/compiler/legacyLineToWords.ts +./packages/cspell-tools/src/compiler/logger.ts +./packages/cspell-tools/src/compiler/logWithTimestamp.ts +./packages/cspell-tools/src/compiler/Reader.Dutch.test.ts +./packages/cspell-tools/src/compiler/Reader.test.ts +./packages/cspell-tools/src/compiler/Reader.ts +./packages/cspell-tools/src/compiler/readers/ReaderOptions.ts +./packages/cspell-tools/src/compiler/readers/readHunspellFiles.ts +./packages/cspell-tools/src/compiler/readers/readTextFile.ts +./packages/cspell-tools/src/compiler/readers/regHunspellFile.ts +./packages/cspell-tools/src/compiler/readers/textFileReader.ts +./packages/cspell-tools/src/compiler/readers/trieFileReader.ts +./packages/cspell-tools/src/compiler/SourceReader.test.ts +./packages/cspell-tools/src/compiler/SourceReader.ts +./packages/cspell-tools/src/compiler/splitCamelCaseIfAllowed.test.ts +./packages/cspell-tools/src/compiler/splitCamelCaseIfAllowed.ts +./packages/cspell-tools/src/compiler/streamSourceWordsFromFile.test.ts +./packages/cspell-tools/src/compiler/streamSourceWordsFromFile.ts +./packages/cspell-tools/src/compiler/text.test.ts +./packages/cspell-tools/src/compiler/text.ts +./packages/cspell-tools/src/compiler/wordListCompiler.test.ts +./packages/cspell-tools/src/compiler/wordListCompiler.ts +./packages/cspell-tools/src/compiler/wordListParser.test.ts +./packages/cspell-tools/src/compiler/wordListParser.ts +./packages/cspell-tools/src/compiler/WordsCollection.ts +./packages/cspell-tools/src/compiler/writeTextToFile.ts +./packages/cspell-tools/src/config/config.ts +./packages/cspell-tools/src/config/configUtils.test.ts +./packages/cspell-tools/src/config/configUtils.ts +./packages/cspell-tools/src/config/index.ts +./packages/cspell-tools/src/config/normalizeConfig.ts +./packages/cspell-tools/src/FeatureFlags/FeatureFalgs.test.ts +./packages/cspell-tools/src/FeatureFlags/FeatureFlags.ts +./packages/cspell-tools/src/FeatureFlags/index.ts +./packages/cspell-tools/src/FeatureFlags/parseFlags.test.ts +./packages/cspell-tools/src/FeatureFlags/parseFlags.ts +./packages/cspell-tools/src/gzip/compressFiles.test.ts +./packages/cspell-tools/src/gzip/compressFiles.ts +./packages/cspell-tools/src/gzip/gzip.ts +./packages/cspell-tools/src/gzip/index.ts +./packages/cspell-tools/src/shasum/checksum.test.ts +./packages/cspell-tools/src/shasum/checksum.ts +./packages/cspell-tools/src/shasum/index.ts +./packages/cspell-tools/src/shasum/shasum.test.ts +./packages/cspell-tools/src/shasum/shasum.ts +./packages/cspell-tools/src/test/console.ts +./packages/cspell-tools/src/test/escapeRegEx.ts +./packages/cspell-tools/src/test/normalizeOutput.ts +./packages/cspell-tools/src/test/TestHelper.ts +./packages/cspell-tools/src/util/errors.test.ts +./packages/cspell-tools/src/util/errors.ts +./packages/cspell-tools/src/util/globP.ts +./packages/cspell-tools/src/util/index.ts +./packages/cspell-tools/wordlists.md +./packages/cspell-trie-lib/api/api.d.ts +./packages/cspell-trie-lib/api/README.md +./packages/cspell-trie-lib/api/rollup.config.mjs +./packages/cspell-trie-lib/CHANGELOG.md +./packages/cspell-trie-lib/LICENSE +./packages/cspell-trie-lib/README.md +./packages/cspell-trie-lib/src/index.test.ts +./packages/cspell-trie-lib/src/index.ts +./packages/cspell-trie-lib/src/lib/Builder/BuilderCursor.ts +./packages/cspell-trie-lib/src/lib/Builder/cursor-util.test.ts +./packages/cspell-trie-lib/src/lib/Builder/cursor-util.ts +./packages/cspell-trie-lib/src/lib/Builder/index.ts +./packages/cspell-trie-lib/src/lib/Builder/TrieBuilder.ts +./packages/cspell-trie-lib/src/lib/buildITrie.test.ts +./packages/cspell-trie-lib/src/lib/buildITrie.ts +./packages/cspell-trie-lib/src/lib/consolidate.test.ts +./packages/cspell-trie-lib/src/lib/consolidate.ts +./packages/cspell-trie-lib/src/lib/constants.ts +./packages/cspell-trie-lib/src/lib/convertToTrieRefNodes.test.ts +./packages/cspell-trie-lib/src/lib/convertToTrieRefNodes.ts +./packages/cspell-trie-lib/src/lib/decodeTrie.test.ts +./packages/cspell-trie-lib/src/lib/decodeTrie.ts +./packages/cspell-trie-lib/src/lib/distance/distance.test.ts +./packages/cspell-trie-lib/src/lib/distance/distance.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStar.test.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStar.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStarWeighted.test.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStarWeighted.ts +./packages/cspell-trie-lib/src/lib/distance/formatResultEx.ts +./packages/cspell-trie-lib/src/lib/distance/index.ts +./packages/cspell-trie-lib/src/lib/distance/levenshtein.test.ts +./packages/cspell-trie-lib/src/lib/distance/levenshtein.ts +./packages/cspell-trie-lib/src/lib/distance/weightedMaps.test.ts +./packages/cspell-trie-lib/src/lib/distance/weightedMaps.ts +./packages/cspell-trie-lib/src/lib/flatten.test.ts +./packages/cspell-trie-lib/src/lib/flatten.ts +./packages/cspell-trie-lib/src/lib/index.test.ts +./packages/cspell-trie-lib/src/lib/index.ts +./packages/cspell-trie-lib/src/lib/io/constants.ts +./packages/cspell-trie-lib/src/lib/io/decode.test.ts +./packages/cspell-trie-lib/src/lib/io/decode.ts +./packages/cspell-trie-lib/src/lib/io/importExport.test.ts +./packages/cspell-trie-lib/src/lib/io/importExport.ts +./packages/cspell-trie-lib/src/lib/io/importExportV1.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV1.ts +./packages/cspell-trie-lib/src/lib/io/importExportV2.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV2.ts +./packages/cspell-trie-lib/src/lib/io/importExportV3.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV3.ts +./packages/cspell-trie-lib/src/lib/io/importExportV4.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV4.ts +./packages/cspell-trie-lib/src/lib/io/importV3.test.ts +./packages/cspell-trie-lib/src/lib/io/importV3.ts +./packages/cspell-trie-lib/src/lib/io/importV3FastBlob.test.ts +./packages/cspell-trie-lib/src/lib/io/importV3FastBlob.ts +./packages/cspell-trie-lib/src/lib/io/index.ts +./packages/cspell-trie-lib/src/lib/ITrie.test.ts +./packages/cspell-trie-lib/src/lib/ITrie.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/CompoundModes.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/find.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/find.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/FindOptions.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/index.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/ITrieNode.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/trie-util.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/trie-util.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/TrieInfo.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/hintedWalker.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/hintedWalker.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/index.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walker.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walker.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walkerTypes.ts +./packages/cspell-trie-lib/src/lib/mappers/joinLetters.ts +./packages/cspell-trie-lib/src/lib/mappers/mapCosts.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfo.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfo.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfoToWeightMap.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfoToWeightMap.ts +./packages/cspell-trie-lib/src/lib/mappers/mapHunspellInformation.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapHunspellInformation.ts +./packages/cspell-trie-lib/src/lib/mappers/mapToSuggestionCostDef.ts +./packages/cspell-trie-lib/src/lib/models/DictionaryInformation.ts +./packages/cspell-trie-lib/src/lib/models/locale/index.ts +./packages/cspell-trie-lib/src/lib/models/locale/knownLocales.ts +./packages/cspell-trie-lib/src/lib/models/locale/locale.test.ts +./packages/cspell-trie-lib/src/lib/models/locale/locale.ts +./packages/cspell-trie-lib/src/lib/models/suggestionCostsDef.ts +./packages/cspell-trie-lib/src/lib/SimpleDictionaryParser.test.ts +./packages/cspell-trie-lib/src/lib/SimpleDictionaryParser.ts +./packages/cspell-trie-lib/src/lib/suggest.ts +./packages/cspell-trie-lib/src/lib/suggestCollector.ts +./packages/cspell-trie-lib/src/lib/suggestions/collectSuggestions.ts +./packages/cspell-trie-lib/src/lib/suggestions/constants.ts +./packages/cspell-trie-lib/src/lib/suggestions/genSuggestionsOptions.ts +./packages/cspell-trie-lib/src/lib/suggestions/orthography.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/orthography.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-en.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-es.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-nl.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.legacy.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestAStar.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestAStar.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestCollector.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestCollector.ts +./packages/cspell-trie-lib/src/lib/suggestions/SuggestionTypes.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestTrieData.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestTrieData.ts +./packages/cspell-trie-lib/src/lib/trie.en.test.ts +./packages/cspell-trie-lib/src/lib/trie.test.ts +./packages/cspell-trie-lib/src/lib/trie.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/createTrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/createTrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.en.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBitMaskInfo.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobInternals.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobIRoot.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobIRoot.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/index.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/index.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/NumberSequenceByteDecoderAccumulator.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/NumberSequenceByteDecoderAccumulator.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/README.md +./packages/cspell-trie-lib/src/lib/TrieBlob/resolveMap.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlobIRoot.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlobIRoot.ts +./packages/cspell-trie-lib/src/lib/TrieBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieCursor/index.ts +./packages/cspell-trie-lib/src/lib/TrieCursor/TrieCursor.ts +./packages/cspell-trie-lib/src/lib/TrieData.ts +./packages/cspell-trie-lib/src/lib/TrieNode/compoundWalker.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/compoundWalker.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.dutch.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie-util.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie-util.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNode.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeTrie.ts +./packages/cspell-trie-lib/src/lib/trieRef.ts +./packages/cspell-trie-lib/src/lib/types.ts +./packages/cspell-trie-lib/src/lib/utils/assert.ts +./packages/cspell-trie-lib/src/lib/utils/autoCacheMap.test.ts +./packages/cspell-trie-lib/src/lib/utils/autoCacheMap.ts +./packages/cspell-trie-lib/src/lib/utils/bufferLines.test.ts +./packages/cspell-trie-lib/src/lib/utils/bufferLines.ts +./packages/cspell-trie-lib/src/lib/utils/clean.ts +./packages/cspell-trie-lib/src/lib/utils/isDefined.ts +./packages/cspell-trie-lib/src/lib/utils/memorizeLastCall.test.ts +./packages/cspell-trie-lib/src/lib/utils/memorizeLastCall.ts +./packages/cspell-trie-lib/src/lib/utils/memorizer.test.ts +./packages/cspell-trie-lib/src/lib/utils/memorizer.ts +./packages/cspell-trie-lib/src/lib/utils/mergeDefaults.ts +./packages/cspell-trie-lib/src/lib/utils/mergeOptionalWithDefaults.ts +./packages/cspell-trie-lib/src/lib/utils/normalizeWord.ts +./packages/cspell-trie-lib/src/lib/utils/PairingHeap.test.ts +./packages/cspell-trie-lib/src/lib/utils/PairingHeap.ts +./packages/cspell-trie-lib/src/lib/utils/secondChanceCache.test.ts +./packages/cspell-trie-lib/src/lib/utils/secondChanceCache.ts +./packages/cspell-trie-lib/src/lib/utils/text.test.ts +./packages/cspell-trie-lib/src/lib/utils/text.ts +./packages/cspell-trie-lib/src/lib/utils/timer.test.ts +./packages/cspell-trie-lib/src/lib/utils/timer.ts +./packages/cspell-trie-lib/src/lib/utils/util.test.ts +./packages/cspell-trie-lib/src/lib/utils/util.ts +./packages/cspell-trie-lib/src/lib/walker/hintedWalker.test.ts +./packages/cspell-trie-lib/src/lib/walker/hintedWalker.ts +./packages/cspell-trie-lib/src/lib/walker/index.ts +./packages/cspell-trie-lib/src/lib/walker/walker.test.ts +./packages/cspell-trie-lib/src/lib/walker/walker.ts +./packages/cspell-trie-lib/src/lib/walker/walkerTypes.ts +./packages/cspell-trie-lib/src/perf/en.spec.ts +./packages/cspell-trie-lib/src/perf/has.perf.ts +./packages/cspell-trie-lib/src/perf/levenshtein.ts +./packages/cspell-trie-lib/src/perf/perfSuite.perf.ts +./packages/cspell-trie-lib/src/perf/perfSuite.ts +./packages/cspell-trie-lib/src/perf/run.ts +./packages/cspell-trie-lib/src/test/dictionaries.test.helper.ts +./packages/cspell-trie-lib/src/test/reader.test.helper.ts +./packages/cspell-trie-lib/src/test/samples.ts +./packages/cspell-trie-lib/src/test/util.test.helper.ts +./packages/cspell-trie/bin.js +./packages/cspell-trie/CHANGELOG.md +./packages/cspell-trie/LICENSE +./packages/cspell-trie/README.md +./packages/cspell-trie/src/app.test.ts +./packages/cspell-trie/src/app.ts +./packages/cspell-types/CHANGELOG.md +./packages/cspell-types/LICENSE +./packages/cspell-types/README.md +./packages/cspell-types/src/configFields.ts +./packages/cspell-types/src/CSpellReporter.ts +./packages/cspell-types/src/CSpellSettingsDef.ts +./packages/cspell-types/src/defineConfig.test.ts +./packages/cspell-types/src/defineConfig.ts +./packages/cspell-types/src/DictionaryDefinition.ts +./packages/cspell-types/src/DictionaryInformation.ts +./packages/cspell-types/src/features.test.ts +./packages/cspell-types/src/features.ts +./packages/cspell-types/src/index.mts +./packages/cspell-types/src/index.test.ts +./packages/cspell-types/src/index.ts +./packages/cspell-types/src/InlineDictionary.ts +./packages/cspell-types/src/Parser/index.mts +./packages/cspell-types/src/Parser/index.ts +./packages/cspell-types/src/suggestionCostsDef.ts +./packages/cspell-types/src/TextMap.ts +./packages/cspell-types/src/TextOffset.ts +./packages/cspell-types/src/types.ts +./packages/cspell-url/CHANGELOG.md +./packages/cspell-url/CHANGELOG.md +./packages/cspell-url/LICENSE +./packages/cspell-url/LICENSE +./packages/cspell-url/README.md +./packages/cspell-url/README.md +./packages/cspell-url/src/dataUrl.mts +./packages/cspell-url/src/dataUrl.mts +./packages/cspell-url/src/defaultFileUrlBuilder.mts +./packages/cspell-url/src/defaultFileUrlBuilder.mts +./packages/cspell-url/src/fileUrl.mts +./packages/cspell-url/src/fileUrl.mts +./packages/cspell-url/src/fileUrl.test.mts +./packages/cspell-url/src/fileUrl.test.mts +./packages/cspell-url/src/FileUrlBuilder.mts +./packages/cspell-url/src/FileUrlBuilder.mts +./packages/cspell-url/src/FileUrlBuilder.test.mts +./packages/cspell-url/src/FileUrlBuilder.test.mts +./packages/cspell-url/src/index.mts +./packages/cspell-url/src/index.mts +./packages/cspell-url/src/index.test.mts +./packages/cspell-url/src/index.test.mts +./packages/cspell-url/src/url.mts +./packages/cspell-url/src/url.mts +./packages/cspell-url/src/url.test.mts +./packages/cspell-url/src/url.test.mts +./packages/cspell/api/app.d.ts +./packages/cspell/api/app.d.ts +./packages/cspell/api/application.d.ts +./packages/cspell/api/application.d.ts +./packages/cspell/api/index.d.ts +./packages/cspell/api/index.d.ts +./packages/cspell/bin.mjs +./packages/cspell/bin.mjs +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CONTRIBUTORS.md +./packages/cspell/CONTRIBUTORS.md +./packages/cspell/DefaultCSpell.json +./packages/cspell/DefaultCSpell.json +./packages/cspell/LICENSE +./packages/cspell/LICENSE +./packages/cspell/README.md +./packages/cspell/README.md +./packages/cspell/rollup.config.mjs +./packages/cspell/rollup.config.mjs +./packages/cspell/src/app/app.test.ts +./packages/cspell/src/app/app.test.ts +./packages/cspell/src/app/app.ts +./packages/cspell/src/app/app.ts +./packages/cspell/src/app/application.test.ts +./packages/cspell/src/app/application.test.ts +./packages/cspell/src/app/application.ts +./packages/cspell/src/app/application.ts +./packages/cspell/src/app/cli-reporter.test.ts +./packages/cspell/src/app/cli-reporter.test.ts +./packages/cspell/src/app/cli-reporter.ts +./packages/cspell/src/app/cli-reporter.ts +./packages/cspell/src/app/commandCheck.ts +./packages/cspell/src/app/commandCheck.ts +./packages/cspell/src/app/commandLink.ts +./packages/cspell/src/app/commandLink.ts +./packages/cspell/src/app/commandLint.ts +./packages/cspell/src/app/commandLint.ts +./packages/cspell/src/app/commandSuggestion.ts +./packages/cspell/src/app/commandSuggestion.ts +./packages/cspell/src/app/commandTrace.ts +./packages/cspell/src/app/commandTrace.ts +./packages/cspell/src/app/emitters/DictionaryPathFormat.ts +./packages/cspell/src/app/emitters/DictionaryPathFormat.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.test.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.test.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.ts +./packages/cspell/src/app/emitters/traceEmitter.test.ts +./packages/cspell/src/app/emitters/traceEmitter.test.ts +./packages/cspell/src/app/emitters/traceEmitter.ts +./packages/cspell/src/app/emitters/traceEmitter.ts +./packages/cspell/src/app/featureFlags/featureFlags.test.ts +./packages/cspell/src/app/featureFlags/featureFlags.test.ts +./packages/cspell/src/app/featureFlags/featureFlags.ts +./packages/cspell/src/app/featureFlags/featureFlags.ts +./packages/cspell/src/app/featureFlags/index.ts +./packages/cspell/src/app/featureFlags/index.ts +./packages/cspell/src/app/index.test.ts +./packages/cspell/src/app/index.test.ts +./packages/cspell/src/app/index.ts +./packages/cspell/src/app/index.ts +./packages/cspell/src/app/link.test.ts +./packages/cspell/src/app/link.test.ts +./packages/cspell/src/app/link.ts +./packages/cspell/src/app/link.ts +./packages/cspell/src/app/lint/index.ts +./packages/cspell/src/app/lint/index.ts +./packages/cspell/src/app/lint/lint.test.ts +./packages/cspell/src/app/lint/lint.test.ts +./packages/cspell/src/app/lint/lint.ts +./packages/cspell/src/app/lint/lint.ts +./packages/cspell/src/app/lint/LintRequest.test.ts +./packages/cspell/src/app/lint/LintRequest.test.ts +./packages/cspell/src/app/lint/LintRequest.ts +./packages/cspell/src/app/lint/LintRequest.ts +./packages/cspell/src/app/options.test.ts +./packages/cspell/src/app/options.test.ts +./packages/cspell/src/app/options.ts +./packages/cspell/src/app/options.ts +./packages/cspell/src/app/repl/index.ts +./packages/cspell/src/app/repl/index.ts +./packages/cspell/src/app/test/test.helper.ts +./packages/cspell/src/app/test/test.helper.ts +./packages/cspell/src/app/util/async.ts +./packages/cspell/src/app/util/async.ts +./packages/cspell/src/app/util/cache/CacheOptions.ts +./packages/cspell/src/app/util/cache/CacheOptions.ts +./packages/cspell/src/app/util/cache/createCache.test.ts +./packages/cspell/src/app/util/cache/createCache.test.ts +./packages/cspell/src/app/util/cache/createCache.ts +./packages/cspell/src/app/util/cache/createCache.ts +./packages/cspell/src/app/util/cache/CSpellLintResultCache.ts +./packages/cspell/src/app/util/cache/CSpellLintResultCache.ts +./packages/cspell/src/app/util/cache/DiskCache.test.ts +./packages/cspell/src/app/util/cache/DiskCache.test.ts +./packages/cspell/src/app/util/cache/DiskCache.ts +./packages/cspell/src/app/util/cache/DiskCache.ts +./packages/cspell/src/app/util/cache/DummyCache.ts +./packages/cspell/src/app/util/cache/DummyCache.ts +./packages/cspell/src/app/util/cache/fileEntryCache.ts +./packages/cspell/src/app/util/cache/fileEntryCache.ts +./packages/cspell/src/app/util/cache/index.ts +./packages/cspell/src/app/util/cache/index.ts +./packages/cspell/src/app/util/cache/ObjectCollection.test.ts +./packages/cspell/src/app/util/cache/ObjectCollection.test.ts +./packages/cspell/src/app/util/cache/ObjectCollection.ts +./packages/cspell/src/app/util/cache/ObjectCollection.ts +./packages/cspell/src/app/util/constants.ts +./packages/cspell/src/app/util/constants.ts +./packages/cspell/src/app/util/errors.test.ts +./packages/cspell/src/app/util/errors.test.ts +./packages/cspell/src/app/util/errors.ts +./packages/cspell/src/app/util/errors.ts +./packages/cspell/src/app/util/fileHelper.test.ts +./packages/cspell/src/app/util/fileHelper.test.ts +./packages/cspell/src/app/util/fileHelper.ts +./packages/cspell/src/app/util/fileHelper.ts +./packages/cspell/src/app/util/glob.test.ts +./packages/cspell/src/app/util/glob.test.ts +./packages/cspell/src/app/util/glob.ts +./packages/cspell/src/app/util/glob.ts +./packages/cspell/src/app/util/InMemoryReporter.ts +./packages/cspell/src/app/util/InMemoryReporter.ts +./packages/cspell/src/app/util/pad.test.ts +./packages/cspell/src/app/util/pad.test.ts +./packages/cspell/src/app/util/pad.ts +./packages/cspell/src/app/util/pad.ts +./packages/cspell/src/app/util/prefetch.test.ts +./packages/cspell/src/app/util/prefetch.test.ts +./packages/cspell/src/app/util/prefetch.ts +./packages/cspell/src/app/util/prefetch.ts +./packages/cspell/src/app/util/reporters.test.ts +./packages/cspell/src/app/util/reporters.test.ts +./packages/cspell/src/app/util/reporters.ts +./packages/cspell/src/app/util/reporters.ts +./packages/cspell/src/app/util/stdin.test.ts +./packages/cspell/src/app/util/stdin.test.ts +./packages/cspell/src/app/util/stdin.ts +./packages/cspell/src/app/util/stdin.ts +./packages/cspell/src/app/util/table.test.ts +./packages/cspell/src/app/util/table.test.ts +./packages/cspell/src/app/util/table.ts +./packages/cspell/src/app/util/table.ts +./packages/cspell/src/app/util/timer.ts +./packages/cspell/src/app/util/timer.ts +./packages/cspell/src/app/util/types.ts +./packages/cspell/src/app/util/types.ts +./packages/cspell/src/app/util/util.test.ts +./packages/cspell/src/app/util/util.test.ts +./packages/cspell/src/app/util/util.ts +./packages/cspell/src/app/util/util.ts +./packages/cspell/src/lib/file-entry-cache.cjs +./packages/cspell/src/lib/file-entry-cache.cjs +./packages/cspell/src/lib/file-entry-cache.cts +./packages/cspell/src/lib/file-entry-cache.cts +./packages/cspell/src/lib/file-entry-cache.d.cts +./packages/cspell/src/lib/pkgInfo.cjs +./packages/cspell/src/lib/pkgInfo.cjs +./packages/cspell/src/lib/pkgInfo.cts +./packages/cspell/src/lib/pkgInfo.cts +./packages/cspell/src/lib/pkgInfo.d.cts +./packages/cspell/src/lib/tsconfig.cjs.json +./packages/cspell/src/lib/tsconfig.cjs.json +./packages/cspell/src/lib/tsconfig.test.json +./packages/cspell/src/lib/tsconfig.test.json +./packages/cspell/static/help-lint.txt +./packages/cspell/static/help-lint.txt +./packages/cspell/static/help-trace.txt +./packages/cspell/static/help-trace.txt +./packages/cspell/tsconfig.esm.json +./packages/cspell/tsconfig.esm.json +./packages/cspell/vitest.config.mts +./packages/cspell/vitest.config.mts +./packages/dynamic-import/CHANGELOG.md +./packages/dynamic-import/CHANGELOG.md +./packages/dynamic-import/LICENSE +./packages/dynamic-import/LICENSE +./packages/dynamic-import/README.md +./packages/dynamic-import/README.md +./packages/dynamic-import/src/cjs/index.ts +./packages/dynamic-import/src/cjs/index.ts +./packages/dynamic-import/src/esm/dynamicImport.mts +./packages/dynamic-import/src/esm/dynamicImport.mts +./packages/dynamic-import/src/esm/index.mts +./packages/dynamic-import/src/esm/index.mts +./packages/dynamic-import/src/esm/index.test.mts +./packages/dynamic-import/src/esm/index.test.mts +./packages/dynamic-import/src/test/helper.ts +./packages/dynamic-import/src/test/helper.ts +./packages/dynamic-import/src/test/index.test.ts +./packages/dynamic-import/src/test/index.test.ts +./packages/dynamic-import/tsconfig.base.json +./packages/dynamic-import/tsconfig.base.json +./packages/dynamic-import/vitest.config.mts +./packages/dynamic-import/vitest.config.mts +./packages/hunspell-reader/bin.js +./packages/hunspell-reader/CHANGELOG.md +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README.md +./packages/hunspell-reader/LICENSE +./packages/hunspell-reader/README.md +./packages/hunspell-reader/src/aff.test.ts +./packages/hunspell-reader/src/aff.ts +./packages/hunspell-reader/src/affConstants.ts +./packages/hunspell-reader/src/affDef.ts +./packages/hunspell-reader/src/affLegacy.test.ts +./packages/hunspell-reader/src/affLegacy.ts +./packages/hunspell-reader/src/affReader.test.ts +./packages/hunspell-reader/src/affReader.ts +./packages/hunspell-reader/src/affToDicInfo.ts +./packages/hunspell-reader/src/affToDictInfo.test.ts +./packages/hunspell-reader/src/app.ts +./packages/hunspell-reader/src/commandDictInfo.ts +./packages/hunspell-reader/src/commandWords.ts +./packages/hunspell-reader/src/converter.test.ts +./packages/hunspell-reader/src/converter.ts +./packages/hunspell-reader/src/de.test.ts +./packages/hunspell-reader/src/index.ts +./packages/hunspell-reader/src/IterableHunspellReaderLegacy.test.ts +./packages/hunspell-reader/src/IterableHunspellReaderLegacy.ts +./packages/hunspell-reader/src/iterableToStream.ts +./packages/hunspell-reader/src/nl.test.ts +./packages/hunspell-reader/src/textUtils.test.ts +./packages/hunspell-reader/src/textUtils.ts +./packages/hunspell-reader/src/types.ts +./packages/hunspell-reader/src/util.test.ts +./packages/hunspell-reader/src/util.ts +./packages/hunspell-reader/testData/smallfile.txt +./pnpm-workspace.yaml +./README.md +./release-please-config.json +./rfc/drafts/onboarding/README.md +./rfc/rfc-0001 suggestions/CHANGELOG.md +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_common.typo.txt +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_GB.typo.txt +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_US.typo.txt +./rfc/rfc-0001 suggestions/README.md +./rfc/rfc-0001 suggestions/src/config-definitions.ts +./rfc/rfc-0002 improve dictionary suggestions/README.md +./rfc/rfc-0003 parsing files/README.md +./rfc/rfc-0003 parsing files/src/types.ts +./rfc/rfc-0004 known issues/README.md +./rfc/rfc-0004 known issues/types.ts +./rfc/rfc-0005 named configurations/README.md +./rfc/rfc-0005 named configurations/types.ts +./scripts/build-cspell-schema.mjs +./scripts/jsconfig.json +./scripts/remove-zero-width-space.mjs +./scripts/update-package-json.mjs +./scripts/update-release-please.mjs +./SECURITY.md +./static/footer.md +./static/sponsor.md +./static/tidelift.md +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.rollup.cjs +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.rollup.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/CHANGELOG.md +./test-packages/cspell-dictionary/test-cspell-dictionary/README.md +./test-packages/cspell-dictionary/test-cspell-dictionary/rollup.config.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/src/index.test.ts +./test-packages/cspell-dictionary/test-cspell-dictionary/src/index.ts +./test-packages/cspell-dictionary/test-cspell-dictionary/tsconfig.esm.json +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.rollup.cjs +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.rollup.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/CHANGELOG.md +./test-packages/cspell-gitignore/test-cspell-gitignore/README.md +./test-packages/cspell-gitignore/test-cspell-gitignore/rollup.config.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/src/index.test.ts +./test-packages/cspell-gitignore/test-cspell-gitignore/src/index.ts +./test-packages/cspell-gitignore/test-cspell-gitignore/tsconfig.esm.json +./test-packages/cspell-glob/test-cspell-glob/bin.mjs +./test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs +./test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs +./test-packages/cspell-glob/test-cspell-glob/CHANGELOG.md +./test-packages/cspell-glob/test-cspell-glob/README.md +./test-packages/cspell-glob/test-cspell-glob/rollup.config.mjs +./test-packages/cspell-glob/test-cspell-glob/src/index.test.ts +./test-packages/cspell-glob/test-cspell-glob/src/index.ts +./test-packages/cspell-io/test-cspell-io/bin.mjs +./test-packages/cspell-io/test-cspell-io/bin.rollup.cjs +./test-packages/cspell-io/test-cspell-io/bin.rollup.mjs +./test-packages/cspell-io/test-cspell-io/CHANGELOG.md +./test-packages/cspell-io/test-cspell-io/README.md +./test-packages/cspell-io/test-cspell-io/rollup.config.mjs +./test-packages/cspell-io/test-cspell-io/src/index.test.ts +./test-packages/cspell-io/test-cspell-io/src/index.ts +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin.cjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin/bin.cjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin/bin.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/build.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-esbuild-cjs/README.md +./test-packages/cspell-lib/test-cspell-esbuild-cjs/source/build.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/source/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-esm/bin.mjs +./test-packages/cspell-lib/test-cspell-lib-esm/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-esm/README.md +./test-packages/cspell-lib/test-cspell-lib-esm/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-rollup/bin.cjs +./test-packages/cspell-lib/test-cspell-lib-rollup/bin.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-rollup/lib/chalk.js +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/index.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/inject.d.mts +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/inject.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/src/rollup-plugin-inject-dirname.mts +./test-packages/cspell-lib/test-cspell-lib-rollup/README.md +./test-packages/cspell-lib/test-cspell-lib-rollup/rollup.config.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-webpack/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-webpack/cspell-dist.js +./test-packages/cspell-lib/test-cspell-lib-webpack/README.md +./test-packages/cspell-lib/test-cspell-lib-webpack/src/index.mts +./test-packages/cspell-lib/test-cspell-lib-webpack/webpack.config.js +./test-packages/cspell-pipe/test-cspell-pipe-esm/bin.mjs +./test-packages/cspell-pipe/test-cspell-pipe-esm/CHANGELOG.md +./test-packages/cspell-pipe/test-cspell-pipe-esm/README.md +./test-packages/cspell-pipe/test-cspell-pipe-esm/src/index.mts +./test-packages/cspell-pipe/test-cspell-pipe-esm/src/index.test.mts +./test-packages/cspell-pipe/test-cspell-pipe-rollup/bin.cjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/bin.mjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/CHANGELOG.md +./test-packages/cspell-pipe/test-cspell-pipe-rollup/README.md +./test-packages/cspell-pipe/test-cspell-pipe-rollup/rollup.config.mjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/src/index.mts +./test-packages/cspell-pipe/test-cspell-pipe-rollup/src/index.test.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/bin.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/CHANGELOG.md +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/README.md +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/src/index.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/src/index.test.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/bin.cjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/bin.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/CHANGELOG.md +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/README.md +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/rollup.config.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/src/index.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/src/index.test.mts +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.rollup.cjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.rollup.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/CHANGELOG.md +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/README.md +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/rollup.config.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/src/index.test.ts +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/src/index.ts +./test-packages/cspell-tools/test-cspell-tools/CHANGELOG.md +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/README.md +./test-packages/cspell-tools/test-cspell-tools/src/index.ts +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.rollup.cjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.rollup.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/CHANGELOG.md +./test-packages/cspell-trie-lib/test-cspell-trie-lib/README.md +./test-packages/cspell-trie-lib/test-cspell-trie-lib/rollup.config.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/src/index.test.ts +./test-packages/cspell-trie-lib/test-cspell-trie-lib/src/index.ts +./test-packages/cspell-types/test-cspell-types-cjs/bin.cjs +./test-packages/cspell-types/test-cspell-types-cjs/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-cjs/README.md +./test-packages/cspell-types/test-cspell-types-cjs/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/index.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/parser.test.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/parser.ts +./test-packages/cspell-types/test-cspell-types-esm/bin.mjs +./test-packages/cspell-types/test-cspell-types-esm/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-esm/README.md +./test-packages/cspell-types/test-cspell-types-esm/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-esm/src/index.ts +./test-packages/cspell-types/test-cspell-types-esm/src/parser.test.ts +./test-packages/cspell-types/test-cspell-types-esm/src/parser.ts +./test-packages/cspell-types/test-cspell-types-rollup/bin.cjs +./test-packages/cspell-types/test-cspell-types-rollup/bin.mjs +./test-packages/cspell-types/test-cspell-types-rollup/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-rollup/README.md +./test-packages/cspell-types/test-cspell-types-rollup/rollup.config.mjs +./test-packages/cspell-types/test-cspell-types-rollup/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-rollup/src/index.ts +./test-packages/cspell-types/validate-schema/CHANGELOG.md +./test-packages/cspell-types/validate-schema/validate-schema.mjs +./test-packages/cspell/test-cspell-cli/bin.mjs +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/LICENSE +./test-packages/cspell/test-cspell-cli/README.md +./test-packages/cspell/test-cspell-esbuild-cjs/bin.cjs +./test-packages/cspell/test-cspell-esbuild-cjs/bin.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/bin/bin.cjs +./test-packages/cspell/test-cspell-esbuild-cjs/build.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/CHANGELOG.md +./test-packages/cspell/test-cspell-esbuild-cjs/README.md +./test-packages/cspell/test-cspell-esbuild-cjs/source/build.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/source/src/index.ts +./test-packages/cspell/test-cspell-esm-reporter/CHANGELOG.md +./test-packages/cspell/test-cspell-esm-reporter/index.js +./test-packages/cspell/test-cspell-esm-reporter/LICENSE +./test-packages/cspell/test-cspell-esm-reporter/README.md +./test-packages/cspell/test-cspell-esm-reporter/src/reporter.ts +./test-packages/cspell/test-cspell/CHANGELOG.md +./test-packages/cspell/test-cspell/README.md +./test-packages/cspell/test-cspell/src/index.ts +./test-packages/dictionaries/companies/CHANGELOG.md +./test-packages/dictionaries/companies/dict/companies.txt +./test-packages/dictionaries/companies/LICENSE +./test-packages/dictionaries/companies/README.md +./test-packages/dictionaries/companies/src/companies.txt +./test-packages/dictionaries/software-terms/CHANGELOG.md +./test-packages/dictionaries/software-terms/dict/networkingTerms.txt +./test-packages/dictionaries/software-terms/dict/softwareTerms.txt +./test-packages/dictionaries/software-terms/LICENSE +./test-packages/dictionaries/software-terms/README.md +./test-packages/dictionaries/software-terms/source-files-networking.txt +./test-packages/dictionaries/software-terms/source-files.txt +./test-packages/dictionaries/software-terms/src/network-os.txt +./test-packages/dictionaries/software-terms/src/network-protocols.txt +./test-packages/dictionaries/software-terms/src/README.md +./test-packages/dictionaries/software-terms/src/software-terms.txt +./test-packages/dictionaries/software-terms/src/software-tools.txt +./test-packages/dynamic-import/test-dynamic-import-cjs/bin.cjs +./test-packages/dynamic-import/test-dynamic-import-cjs/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-cjs/README.md +./test-packages/dynamic-import/test-dynamic-import-cjs/src/index.test.ts +./test-packages/dynamic-import/test-dynamic-import-cjs/src/index.ts +./test-packages/dynamic-import/test-dynamic-import-esm/bin.mjs +./test-packages/dynamic-import/test-dynamic-import-esm/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-esm/README.md +./test-packages/dynamic-import/test-dynamic-import-esm/src/index.test.ts +./test-packages/dynamic-import/test-dynamic-import-esm/src/index.ts +./test-packages/dynamic-import/test-dynamic-import-rollup/bin.cjs +./test-packages/dynamic-import/test-dynamic-import-rollup/bin.mjs +./test-packages/dynamic-import/test-dynamic-import-rollup/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-rollup/README.md +./test-packages/dynamic-import/test-dynamic-import-rollup/rollup.config.mjs +./test-packages/dynamic-import/test-dynamic-import-rollup/src/index.mts +./test-packages/dynamic-import/test-dynamic-import-rollup/src/index.test.mts +./test-packages/examples/example-cspell-lib-single-doc/bin.js +./test-packages/examples/example-cspell-lib-single-doc/CHANGELOG.md +./test-packages/examples/example-cspell-lib-single-doc/README.md +./test-packages/examples/example-cspell-lib-single-doc/src/index.ts +./test-packages/yarn/yarn2/CHANGELOG.md +./test-packages/yarn/yarn2/CHANGELOG.md +./test-packages/yarn/yarn2/test-yarn3-med/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-med/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-med/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-med/README.md +./test-packages/yarn/yarn2/test-yarn3-med/README.md +./test-packages/yarn/yarn2/test-yarn3-med/README.md +./test-packages/yarn/yarn2/test-yarn3-med/yarn.lock +./test-packages/yarn/yarn2/test-yarn3-med/yarn.lock +./test-packages/yarn/yarn2/test-yarn3-med/yarn.lock +./test-packages/yarn/yarn2/test-yarn3-sci/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-sci/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-sci/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-sci/README.md +./test-packages/yarn/yarn2/test-yarn3-sci/README.md +./test-packages/yarn/yarn2/test-yarn3-sci/README.md +./test-packages/yarn/yarn2/test-yarn3-sci/yarn.lock +./test-packages/yarn/yarn2/test-yarn3-sci/yarn.lock +./test-packages/yarn/yarn2/test-yarn3-sci/yarn.lock +./tools/perf-chart/bin.js +./tools/perf-chart/src/app.ts +./tools/perf-chart/src/perfChart.ts +./tools/README.md +./tsconfig.base.json +./tsconfig.cjs.json +./tsconfig.esm.json +./tsconfig.full.json +./tsconfig.next.json +./vitest.config.mjs +./website/_scripts/extract-properties.mjs +./website/_scripts/extract-properties.mjs +./website/_scripts/jsconfig.json +./website/_scripts/jsconfig.json +./website/babel.config.js +./website/babel.config.js +./website/docs/case-sensitive.md +./website/docs/case-sensitive.md +./website/docs/command-check.md +./website/docs/command-check.md +./website/docs/Configuration/_category_.yaml +./website/docs/Configuration/_category_.yaml +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/document-settings.md +./website/docs/Configuration/document-settings.md +./website/docs/Configuration/imports.md +./website/docs/Configuration/imports.md +./website/docs/Configuration/index.md +./website/docs/Configuration/index.md +./website/docs/Configuration/language-settings.mdx +./website/docs/Configuration/language-settings.mdx +./website/docs/Configuration/overrides.md +./website/docs/Configuration/overrides.md +./website/docs/Configuration/patterns.md +./website/docs/Configuration/patterns.md +./website/docs/dictionaries/_category_.yaml +./website/docs/dictionaries/_category_.yaml +./website/docs/dictionaries/custom-dictionaries.md +./website/docs/dictionaries/custom-dictionaries.md +./website/docs/dictionaries/index.md +./website/docs/dictionaries/index.md +./website/docs/dictionaries/searching-dictionaries.md +./website/docs/dictionaries/searching-dictionaries.md +./website/docs/forbidden-words.md +./website/docs/forbidden-words.md +./website/docs/getting-started.mdx +./website/docs/getting-started.mdx +./website/docs/git.md +./website/docs/git.md +./website/docs/globs.md +./website/docs/globs.md +./website/docs/how-it-works.md +./website/docs/how-it-works.md +./website/docs/installation.md +./website/docs/installation.md +./website/docusaurus.config.ts +./website/docusaurus.config.ts +./website/eslint.config.mjs +./website/eslint.config.mjs +./website/README.md +./website/README.md +./website/sidebars.ts +./website/sidebars.ts +./website/src/components/HomepageFeatures/index.tsx +./website/src/components/HomepageFeatures/index.tsx +./website/src/components/HomepageFeatures/styles.module.css +./website/src/components/HomepageFeatures/styles.module.css +./website/src/css/custom.css +./website/src/css/custom.css +./website/src/pages/about.md +./website/src/pages/about.md +./website/src/pages/index.module.css +./website/src/pages/index.module.css +./website/src/pages/index.tsx +./website/src/pages/index.tsx +./website/src/pages/markdown-page.md +./website/src/pages/markdown-page.md +./website/static/img/favicon.ico +./website/static/img/favicon.ico +./bin.mjs +./CHANGELOG.md +./CODE_OF_CONDUCT.md +./codecov.yaml +./CONTRIBUTING.md +./cspell-tools.mjs +./doc-generator/README.md +./doc-generator/typedoc.json +./docs/_config.yml +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/README.md +./docs/404.html +./docs/about.md +./docs/CNAME +./docs/configuration/document-settings.md +./docs/configuration/imports.md +./docs/configuration/index.md +./docs/configuration/language-settings.md +./docs/configuration/overrides.md +./docs/configuration/patterns.md +./docs/configuration/template.md +./docs/docs/case-sensitive.md +./docs/docs/command-check.md +./docs/docs/command-trace.md +./docs/docs/dictionaries-custom.md +./docs/docs/dictionaries.md +./docs/docs/forbidden-words.md +./docs/docs/getting-started.md +./docs/docs/git.md +./docs/docs/globs.md +./docs/docs/how-it-works.md +./docs/docs/index.md +./docs/docs/installation.md +./docs/docs/template.md +./docs/drafts/import.md +./docs/drafts/index.md +./docs/Gemfile +./docs/index.md +./docs/posts/2021-08-22-getting-started.md +./docs/posts/2021-08-22-welcome-to-jekyll.markdown +./docs/posts/index.md +./docs/README.md +./docs/types/index.md +./docs/types/README.md +./eslint.config.mjs +./examples/case-sensitive.cspell.config.yaml +./examples/filetype-examples.cspell.config.yaml +./examples/ignore-words-dict.cspell.config.yaml +./examples/patterns.cspell.config.yaml +./examples/project-words.txt +./files.txt +./integration-tests/CHANGELOG.md +./integration-tests/custom-reporter.js +./integration-tests/README.md +./integration-tests/repo-list.sh +./integration-tests/scripts/normalize-output.mjs +./integration-tests/src/CaptureLogger.ts +./integration-tests/src/check.ts +./integration-tests/src/config.ts +./integration-tests/src/configDef.ts +./integration-tests/src/outputHelper.ts +./integration-tests/src/PrefixLogger.ts +./integration-tests/src/reporter/index.ts +./integration-tests/src/reporter/reportGenerator.test.ts +./integration-tests/src/reporter/reportGenerator.ts +./integration-tests/src/reporter/stringify.ts +./integration-tests/src/repositoryHelper.test.ts +./integration-tests/src/repositoryHelper.ts +./integration-tests/src/run.ts +./integration-tests/src/sh.ts +./integration-tests/src/shouldCheckRepo.ts +./integration-tests/src/snapshots.ts +./integration-tests/src/types.ts +./integration-tests/tester.js +./lerna.json +./LICENSE +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/cspell-default.config.js +./packages/cspell-bundled-dicts/cspell-default.config.ts +./packages/cspell-bundled-dicts/LICENSE +./packages/cspell-bundled-dicts/README.md +./packages/cspell-bundled-dicts/test-samples/markdown.md +./packages/cspell-bundled-dicts/test-samples/sample.r +./packages/cspell-code-snippets/CHANGELOG.md +./packages/cspell-code-snippets/LICENSE +./packages/cspell-code-snippets/README.md +./packages/cspell-code-snippets/src/trie2/lib/index.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2.test.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2.ts +./packages/cspell-code-snippets/src/trie2/lib/trie2Helper.ts +./packages/cspell-code-snippets/src/trie2/lib/TrieNode2.ts +./packages/cspell-config-lib/CHANGELOG.md +./packages/cspell-config-lib/LICENSE +./packages/cspell-config-lib/README.md +./packages/cspell-config-lib/src/ConfigReadWriteHandler.ts +./packages/cspell-config-lib/src/createReaderWriter.test.ts +./packages/cspell-config-lib/src/createReaderWriter.ts +./packages/cspell-config-lib/src/CSpellConfigFile.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileInMemory.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileInMemory.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJavaScript.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJavaScript.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJson.test.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileJson.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFilePackageJson.ts +./packages/cspell-config-lib/src/CSpellConfigFile/CSpellConfigFileYaml.ts +./packages/cspell-config-lib/src/CSpellConfigFile/index.ts +./packages/cspell-config-lib/src/CSpellConfigFileReaderWriter.test.ts +./packages/cspell-config-lib/src/CSpellConfigFileReaderWriter.ts +./packages/cspell-config-lib/src/defaultIO.ts +./packages/cspell-config-lib/src/defaultNext.ts +./packages/cspell-config-lib/src/FileLoader.ts +./packages/cspell-config-lib/src/index.test.ts +./packages/cspell-config-lib/src/index.ts +./packages/cspell-config-lib/src/IO.ts +./packages/cspell-config-lib/src/loaders/index.ts +./packages/cspell-config-lib/src/loaders/loaderJavaScript.test.ts +./packages/cspell-config-lib/src/loaders/loaderJavaScript.ts +./packages/cspell-config-lib/src/middlewareHelper.ts +./packages/cspell-config-lib/src/Serializer.ts +./packages/cspell-config-lib/src/serializers/cspellJson.test.ts +./packages/cspell-config-lib/src/serializers/cspellJson.ts +./packages/cspell-config-lib/src/serializers/cspellYaml.test.ts +./packages/cspell-config-lib/src/serializers/cspellYaml.ts +./packages/cspell-config-lib/src/serializers/index.test.ts +./packages/cspell-config-lib/src/serializers/index.ts +./packages/cspell-config-lib/src/serializers/packageJson.test.ts +./packages/cspell-config-lib/src/serializers/packageJson.ts +./packages/cspell-config-lib/src/serializers/util.test.ts +./packages/cspell-config-lib/src/serializers/util.ts +./packages/cspell-config-lib/src/test-helpers/fixtures.ts +./packages/cspell-config-lib/src/test-helpers/util.ts +./packages/cspell-config-lib/src/TextFile.ts +./packages/cspell-config-lib/src/util/toURL.ts +./packages/cspell-dictionary/CHANGELOG.md +./packages/cspell-dictionary/LICENSE +./packages/cspell-dictionary/README.md +./packages/cspell-dictionary/src/index.test.ts +./packages/cspell-dictionary/src/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/CachingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/CachingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/createInlineSpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/createInlineSpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/createSpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/createSpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/defaults.ts +./packages/cspell-dictionary/src/SpellingDictionary/FlagWordsDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/FlagWordsDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/IgnoreWordsDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/IgnoreWordsDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryCollection.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryCollection.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryFromTrie.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryFromTrie.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryMethods.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SpellingDictionaryMethods.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestDictionary.ts +./packages/cspell-dictionary/src/SpellingDictionary/SuggestOptions.ts +./packages/cspell-dictionary/src/SpellingDictionary/Terms/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/Terms/terms.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/index.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typos.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typosParser.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/typosParser.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/util.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/Typos/util.ts +./packages/cspell-dictionary/src/SpellingDictionary/TyposDictionary.test.ts +./packages/cspell-dictionary/src/SpellingDictionary/TyposDictionary.ts +./packages/cspell-dictionary/src/util/AutoCache.test.ts +./packages/cspell-dictionary/src/util/AutoCache.ts +./packages/cspell-dictionary/src/util/AutoResolve.test.ts +./packages/cspell-dictionary/src/util/AutoResolve.ts +./packages/cspell-dictionary/src/util/braceExpansion.test.ts +./packages/cspell-dictionary/src/util/braceExpansion.ts +./packages/cspell-dictionary/src/util/clean.test.ts +./packages/cspell-dictionary/src/util/clean.ts +./packages/cspell-dictionary/src/util/IterableLike.ts +./packages/cspell-dictionary/src/util/regexHelper.ts +./packages/cspell-dictionary/src/util/repMap.test.ts +./packages/cspell-dictionary/src/util/repMap.ts +./packages/cspell-dictionary/src/util/simpleCache.test.ts +./packages/cspell-dictionary/src/util/simpleCache.ts +./packages/cspell-dictionary/src/util/text.test.ts +./packages/cspell-dictionary/src/util/text.ts +./packages/cspell-dictionary/src/util/textMappers.test.ts +./packages/cspell-dictionary/src/util/textMappers.ts +./packages/cspell-dictionary/src/util/types.ts +./packages/cspell-dictionary/src/util/util.test.ts +./packages/cspell-dictionary/src/util/util.ts +./packages/cspell-dictionary/tsconfig.esm.json +./packages/cspell-eslint-plugin/CHANGELOG.md +./packages/cspell-eslint-plugin/eslint.config.js +./packages/cspell-eslint-plugin/LICENSE +./packages/cspell-eslint-plugin/README.md +./packages/cspell-eslint-plugin/scope.md +./packages/cspell-eslint-plugin/scripts/build-options-schema.mjs +./packages/cspell-eslint-plugin/scripts/jsconfig.json +./packages/cspell-eslint-plugin/src/common/logger.cts +./packages/cspell-eslint-plugin/src/common/options.cts +./packages/cspell-eslint-plugin/src/common/options.test.mts +./packages/cspell-eslint-plugin/src/plugin/configs.cts +./packages/cspell-eslint-plugin/src/plugin/cspell-eslint-plugin.cts +./packages/cspell-eslint-plugin/src/plugin/defaultCheckOptions.cts +./packages/cspell-eslint-plugin/src/plugin/index.cts +./packages/cspell-eslint-plugin/src/plugin/recommended.cts +./packages/cspell-eslint-plugin/src/test-util/testEach.mts +./packages/cspell-eslint-plugin/src/test/eslint-plugin-react.d.ts +./packages/cspell-eslint-plugin/src/test/import.test.mts +./packages/cspell-eslint-plugin/src/test/index.test.mts +./packages/cspell-eslint-plugin/src/test/json.test.mts +./packages/cspell-eslint-plugin/src/test/jsx.test.mts +./packages/cspell-eslint-plugin/src/test/yaml.test.mts +./packages/cspell-eslint-plugin/src/worker/ASTNode.cts +./packages/cspell-eslint-plugin/src/worker/ASTPath.mts +./packages/cspell-eslint-plugin/src/worker/customScopes.mts +./packages/cspell-eslint-plugin/src/worker/scope.mts +./packages/cspell-eslint-plugin/src/worker/scope.test.mts +./packages/cspell-eslint-plugin/src/worker/spellCheck.mts +./packages/cspell-eslint-plugin/src/worker/types.cts +./packages/cspell-eslint-plugin/src/worker/walkTree.mts +./packages/cspell-eslint-plugin/src/worker/worker.mjs +./packages/cspell-eslint-plugin/tsconfig.base.json +./packages/cspell-gitignore/bin.mjs +./packages/cspell-gitignore/CHANGELOG.md +./packages/cspell-gitignore/LICENSE +./packages/cspell-gitignore/README.md +./packages/cspell-gitignore/src/app.test.ts +./packages/cspell-gitignore/src/app.ts +./packages/cspell-gitignore/src/GitIgnore.test.ts +./packages/cspell-gitignore/src/GitIgnore.ts +./packages/cspell-gitignore/src/GitIgnoreFile.test.ts +./packages/cspell-gitignore/src/GitIgnoreFile.ts +./packages/cspell-gitignore/src/helpers.test.ts +./packages/cspell-gitignore/src/helpers.ts +./packages/cspell-gitignore/src/index.test.ts +./packages/cspell-gitignore/src/index.ts +./packages/cspell-gitignore/vitest.config.mts +./packages/cspell-glob/CHANGELOG.md +./packages/cspell-glob/LICENSE +./packages/cspell-glob/README.md +./packages/cspell-glob/src/globHelper.test.ts +./packages/cspell-glob/src/globHelper.ts +./packages/cspell-glob/src/GlobMatcher.test.ts +./packages/cspell-glob/src/GlobMatcher.ts +./packages/cspell-glob/src/GlobMatcherTypes.ts +./packages/cspell-glob/src/index.test.ts +./packages/cspell-glob/src/index.ts +./packages/cspell-grammar/bin.mjs +./packages/cspell-grammar/CHANGELOG.md +./packages/cspell-grammar/LICENSE +./packages/cspell-grammar/README.md +./packages/cspell-grammar/src/app.test.ts +./packages/cspell-grammar/src/app.ts +./packages/cspell-grammar/src/grammars/index.ts +./packages/cspell-grammar/src/grammars/markdown.ts +./packages/cspell-grammar/src/grammars/simple.ts +./packages/cspell-grammar/src/grammars/typescript.ts +./packages/cspell-grammar/src/index.test.ts +./packages/cspell-grammar/src/index.ts +./packages/cspell-grammar/src/mappers/appendMappedText.test.ts +./packages/cspell-grammar/src/mappers/appendMappedText.ts +./packages/cspell-grammar/src/mappers/types.ts +./packages/cspell-grammar/src/mappers/typescript.test.ts +./packages/cspell-grammar/src/mappers/typescript.ts +./packages/cspell-grammar/src/parser/grammar.ts +./packages/cspell-grammar/src/parser/grammarDefinition.ts +./packages/cspell-grammar/src/parser/grammarNormalized.ts +./packages/cspell-grammar/src/parser/grammarNormalizer.test.ts +./packages/cspell-grammar/src/parser/grammarNormalizer.ts +./packages/cspell-grammar/src/parser/grammarTypesHelpers.ts +./packages/cspell-grammar/src/parser/index.ts +./packages/cspell-grammar/src/parser/matchResult.test.ts +./packages/cspell-grammar/src/parser/matchResult.ts +./packages/cspell-grammar/src/parser/parser.ts +./packages/cspell-grammar/src/parser/processors/procMatchingRule.test.ts +./packages/cspell-grammar/src/parser/processors/procMatchingRule.ts +./packages/cspell-grammar/src/parser/scope.test.ts +./packages/cspell-grammar/src/parser/scope.ts +./packages/cspell-grammar/src/parser/tokenizeLine.test.ts +./packages/cspell-grammar/src/parser/tokenizeLine.ts +./packages/cspell-grammar/src/parser/types.ts +./packages/cspell-grammar/src/parser/util.ts +./packages/cspell-grammar/src/parser/validateGrammar.test.ts +./packages/cspell-grammar/src/parser/validateGrammar.ts +./packages/cspell-grammar/src/parsers/index.ts +./packages/cspell-grammar/src/parsers/typescript/index.test.ts +./packages/cspell-grammar/src/parsers/typescript/index.ts +./packages/cspell-grammar/src/parsers/typescript/TypeScriptParser.ts +./packages/cspell-grammar/src/viewer/escapeMarkdown.test.ts +./packages/cspell-grammar/src/viewer/escapeMarkdown.ts +./packages/cspell-grammar/src/viewer/markdownHelper.ts +./packages/cspell-grammar/src/viewer/visualizeAsMD.test.ts +./packages/cspell-grammar/src/viewer/visualizeAsMD.ts +./packages/cspell-grammar/tsconfig.esm.json +./packages/cspell-io/CHANGELOG.md +./packages/cspell-io/LICENSE +./packages/cspell-io/README.md +./packages/cspell-io/src/async/asyncIterable.test.ts +./packages/cspell-io/src/async/asyncIterable.ts +./packages/cspell-io/src/common/arrayBuffers.test.ts +./packages/cspell-io/src/common/arrayBuffers.ts +./packages/cspell-io/src/common/BufferEncoding.ts +./packages/cspell-io/src/common/CFileReference.ts +./packages/cspell-io/src/common/CFileResource.test.ts +./packages/cspell-io/src/common/CFileResource.ts +./packages/cspell-io/src/common/encode-decode.test.ts +./packages/cspell-io/src/common/encode-decode.ts +./packages/cspell-io/src/common/index.ts +./packages/cspell-io/src/common/stat.test.ts +./packages/cspell-io/src/common/stat.ts +./packages/cspell-io/src/common/transformers.test.ts +./packages/cspell-io/src/common/transformers.ts +./packages/cspell-io/src/common/urlOrReferenceToUrl.ts +./packages/cspell-io/src/CSpellIO.ts +./packages/cspell-io/src/CSpellIONode.test.ts +./packages/cspell-io/src/CSpellIONode.ts +./packages/cspell-io/src/CSpellIOWeb.ts +./packages/cspell-io/src/CVirtualFS.ts +./packages/cspell-io/src/errors/assert.test.ts +./packages/cspell-io/src/errors/assert.ts +./packages/cspell-io/src/errors/error.test.ts +./packages/cspell-io/src/errors/error.ts +./packages/cspell-io/src/errors/errors.test.ts +./packages/cspell-io/src/errors/errors.ts +./packages/cspell-io/src/errors/index.ts +./packages/cspell-io/src/file/file.test.ts +./packages/cspell-io/src/file/file.ts +./packages/cspell-io/src/file/index.ts +./packages/cspell-io/src/handlers/node/file.ts +./packages/cspell-io/src/index.test.ts +./packages/cspell-io/src/index.ts +./packages/cspell-io/src/models/BufferEncoding.ts +./packages/cspell-io/src/models/disposable.ts +./packages/cspell-io/src/models/FileResource.ts +./packages/cspell-io/src/models/index.ts +./packages/cspell-io/src/models/LogEvent.ts +./packages/cspell-io/src/models/Stats.ts +./packages/cspell-io/src/node/dataUrl.test.ts +./packages/cspell-io/src/node/dataUrl.ts +./packages/cspell-io/src/node/file/_fetch.ts +./packages/cspell-io/src/node/file/fetch.test.ts +./packages/cspell-io/src/node/file/fetch.ts +./packages/cspell-io/src/node/file/FetchError.test.ts +./packages/cspell-io/src/node/file/FetchError.ts +./packages/cspell-io/src/node/file/fileWriter.test.ts +./packages/cspell-io/src/node/file/fileWriter.ts +./packages/cspell-io/src/node/file/index.ts +./packages/cspell-io/src/node/file/stat.test.ts +./packages/cspell-io/src/node/file/stat.ts +./packages/cspell-io/src/node/file/url.test.ts +./packages/cspell-io/src/node/file/url.ts +./packages/cspell-io/src/requests/index.ts +./packages/cspell-io/src/requests/RequestFsReadDirectory.ts +./packages/cspell-io/src/requests/RequestFsReadFile.ts +./packages/cspell-io/src/requests/RequestFsReadFileSync.ts +./packages/cspell-io/src/requests/RequestFsStat.ts +./packages/cspell-io/src/requests/RequestFsWriteFile.ts +./packages/cspell-io/src/requests/RequestZlibInflate.ts +./packages/cspell-io/src/test/test.helper.ts +./packages/cspell-io/src/VFileSystem.ts +./packages/cspell-io/src/VirtualFs.test.ts +./packages/cspell-io/src/VirtualFS.ts +./packages/cspell-io/src/VirtualFS/CVFileSystem.test.ts +./packages/cspell-io/src/VirtualFS/CVFileSystem.ts +./packages/cspell-io/src/VirtualFS/findUpFromUrl.test.ts +./packages/cspell-io/src/VirtualFS/findUpFromUrl.ts +./packages/cspell-io/src/VirtualFS/redirectProvider.test.ts +./packages/cspell-io/src/VirtualFS/redirectProvider.ts +./packages/cspell-io/src/VirtualFS/WrappedProviderFs.ts +./packages/cspell-io/tsconfig.esm.json +./packages/cspell-json-reporter/CHANGELOG.md +./packages/cspell-json-reporter/README.md +./packages/cspell-json-reporter/src/CSpellJSONReporterOutput.ts +./packages/cspell-json-reporter/src/CSpellJSONReporterSettings.ts +./packages/cspell-json-reporter/src/index.test.ts +./packages/cspell-json-reporter/src/index.ts +./packages/cspell-json-reporter/src/utils/setToJSONReplacer.test.ts +./packages/cspell-json-reporter/src/utils/setToJSONReplacer.ts +./packages/cspell-json-reporter/src/utils/validateSettings.test.ts +./packages/cspell-json-reporter/src/utils/validateSettings.ts +./packages/cspell-json-reporter/tsconfig.esm.json +./packages/cspell-lib/api/api.d.ts +./packages/cspell-lib/api/rollup.config.mjs +./packages/cspell-lib/CHANGELOG.md +./packages/cspell-lib/CONTRIBUTORS.md +./packages/cspell-lib/DefaultCSpell.json +./packages/cspell-lib/docs/accents.md +./packages/cspell-lib/docs/cache.md +./packages/cspell-lib/docs/configuration.md +./packages/cspell-lib/LICENSE +./packages/cspell-lib/README.md +./packages/cspell-lib/SpellingDictionaries.md +./packages/cspell-lib/src/lib-cjs/index.cts +./packages/cspell-lib/src/lib-cjs/pkg-info.cts +./packages/cspell-lib/src/lib-cjs/tsconfig.cjs.json +./packages/cspell-lib/src/lib-cjs/tsconfig.test.json +./packages/cspell-lib/src/lib/Cache/index.test.ts +./packages/cspell-lib/src/lib/Cache/index.ts +./packages/cspell-lib/src/lib/clearCachedFiles.test.ts +./packages/cspell-lib/src/lib/clearCachedFiles.ts +./packages/cspell-lib/src/lib/Document/Document.ts +./packages/cspell-lib/src/lib/Document/index.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.test.ts +./packages/cspell-lib/src/lib/Document/isBinaryDoc.ts +./packages/cspell-lib/src/lib/Document/normalizeLanguageIds.ts +./packages/cspell-lib/src/lib/Document/resolveDocument.ts +./packages/cspell-lib/src/lib/events/events.test.ts +./packages/cspell-lib/src/lib/events/events.ts +./packages/cspell-lib/src/lib/events/index.ts +./packages/cspell-lib/src/lib/exclusionHelper.test.ts +./packages/cspell-lib/src/lib/exclusionHelper.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFalgs.test.ts +./packages/cspell-lib/src/lib/FeatureFlags/FeatureFlags.ts +./packages/cspell-lib/src/lib/FeatureFlags/index.ts +./packages/cspell-lib/src/lib/fileSystem.ts +./packages/cspell-lib/src/lib/getDictionary.ts +./packages/cspell-lib/src/lib/globs/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/globs/getGlobMatcher.ts +./packages/cspell-lib/src/lib/index.test.ts +./packages/cspell-lib/src/lib/index.ts +./packages/cspell-lib/src/lib/LanguageIds.test.ts +./packages/cspell-lib/src/lib/LanguageIds.ts +./packages/cspell-lib/src/lib/leaked-handles.d.ts +./packages/cspell-lib/src/lib/Models/CSpellSettingsInternalDef.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.test.ts +./packages/cspell-lib/src/lib/Models/PatternRegExp.ts +./packages/cspell-lib/src/lib/Models/Suggestion.ts +./packages/cspell-lib/src/lib/Models/TextDocument.test.ts +./packages/cspell-lib/src/lib/Models/TextDocument.ts +./packages/cspell-lib/src/lib/Models/ValidationIssue.ts +./packages/cspell-lib/src/lib/Models/ValidationResult.ts +./packages/cspell-lib/src/lib/node-namespace.d.ts +./packages/cspell-lib/src/lib/perf/index.ts +./packages/cspell-lib/src/lib/perf/perf.test.ts +./packages/cspell-lib/src/lib/perf/perf.ts +./packages/cspell-lib/src/lib/perf/README.md +./packages/cspell-lib/src/lib/perf/timer.test.ts +./packages/cspell-lib/src/lib/perf/timer.ts +./packages/cspell-lib/src/lib/Settings/calcOverrideSettings.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.test.ts +./packages/cspell-lib/src/lib/Settings/cfgStore.ts +./packages/cspell-lib/src/lib/Settings/checkFilenameMatchesGlob.ts +./packages/cspell-lib/src/lib/Settings/constants.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configLocations.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configSearch.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/configToRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultConfigLoader.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/defaultSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/extractImportErrors.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/normalizeRawSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/PnPSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettings.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/readSettingsFiles.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/toGlobDef.ts +./packages/cspell-lib/src/lib/Settings/Controller/configLoader/types.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/ImportError.ts +./packages/cspell-lib/src/lib/Settings/Controller/index.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.test.ts +./packages/cspell-lib/src/lib/Settings/Controller/pnpLoader.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts +./packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.test.ts +./packages/cspell-lib/src/lib/Settings/DefaultSettings.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.test.ts +./packages/cspell-lib/src/lib/Settings/DictionaryReferenceCollection.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.test.ts +./packages/cspell-lib/src/lib/Settings/DictionarySettings.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.test.ts +./packages/cspell-lib/src/lib/Settings/GlobalSettings.ts +./packages/cspell-lib/src/lib/Settings/index.link.ts +./packages/cspell-lib/src/lib/Settings/index.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.test.ts +./packages/cspell-lib/src/lib/Settings/InDocSettings.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.test.ts +./packages/cspell-lib/src/lib/Settings/LanguageSettings.ts +./packages/cspell-lib/src/lib/Settings/link.test.ts +./packages/cspell-lib/src/lib/Settings/link.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.test.ts +./packages/cspell-lib/src/lib/Settings/mergeCache.ts +./packages/cspell-lib/src/lib/Settings/mergeList.ts +./packages/cspell-lib/src/lib/Settings/patterns.test.ts +./packages/cspell-lib/src/lib/Settings/patterns.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.test.ts +./packages/cspell-lib/src/lib/Settings/RegExpPatterns.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/Settings/TextDocumentSettings.ts +./packages/cspell-lib/src/lib/spellCheckFile.test.ts +./packages/cspell-lib/src/lib/spellCheckFile.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/Dictionaries.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryController/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/DictionaryLoader.ts +./packages/cspell-lib/src/lib/SpellingDictionary/index.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionary.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SpellingDictionaryError.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/entities.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/helpers.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/suggest.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.test.ts +./packages/cspell-lib/src/lib/SpellingDictionary/SuggestExperimental/SuggestionCollector.ts +./packages/cspell-lib/src/lib/suggestions.test.ts +./packages/cspell-lib/src/lib/suggestions.ts +./packages/cspell-lib/src/lib/test/bugs.spec.ts +./packages/cspell-lib/src/lib/test/dutch.spec.ts +./packages/cspell-lib/src/lib/test/english.spec.ts +./packages/cspell-lib/src/lib/test/fa.spec.ts +./packages/cspell-lib/src/lib/test/french.spec.ts +./packages/cspell-lib/src/lib/test/golang.spec.ts +./packages/cspell-lib/src/lib/test/python.spec.ts +./packages/cspell-lib/src/lib/test/README.md +./packages/cspell-lib/src/lib/textValidation/checkText.test.ts +./packages/cspell-lib/src/lib/textValidation/checkText.ts +./packages/cspell-lib/src/lib/textValidation/defaultConstants.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.test.ts +./packages/cspell-lib/src/lib/textValidation/determineTextDocumentSettings.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/docValidator.ts +./packages/cspell-lib/src/lib/textValidation/index.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.test.ts +./packages/cspell-lib/src/lib/textValidation/isWordValid.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.test.ts +./packages/cspell-lib/src/lib/textValidation/lineValidatorFactory.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.test.ts +./packages/cspell-lib/src/lib/textValidation/parsedText.ts +./packages/cspell-lib/src/lib/textValidation/settingsToValidateOptions.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.test.ts +./packages/cspell-lib/src/lib/textValidation/textValidator.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.test.ts +./packages/cspell-lib/src/lib/textValidation/traceWord.ts +./packages/cspell-lib/src/lib/textValidation/ValidateTextOptions.ts +./packages/cspell-lib/src/lib/textValidation/ValidationTypes.ts +./packages/cspell-lib/src/lib/textValidation/validator.test.ts +./packages/cspell-lib/src/lib/textValidation/validator.ts +./packages/cspell-lib/src/lib/trace.test.ts +./packages/cspell-lib/src/lib/trace.ts +./packages/cspell-lib/src/lib/util/AutoResolve.test.ts +./packages/cspell-lib/src/lib/util/AutoResolve.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.test.ts +./packages/cspell-lib/src/lib/util/AutoResolveLRUCache.ts +./packages/cspell-lib/src/lib/util/Comparable.test.ts +./packages/cspell-lib/src/lib/util/Comparable.ts +./packages/cspell-lib/src/lib/util/errors.test.ts +./packages/cspell-lib/src/lib/util/errors.ts +./packages/cspell-lib/src/lib/util/fileReader.test.ts +./packages/cspell-lib/src/lib/util/fileReader.ts +./packages/cspell-lib/src/lib/util/findUp.test.ts +./packages/cspell-lib/src/lib/util/findUp.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.test.ts +./packages/cspell-lib/src/lib/util/findUpFromUrl.ts +./packages/cspell-lib/src/lib/util/FreqCounter.test.ts +./packages/cspell-lib/src/lib/util/FreqCounter.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.test.ts +./packages/cspell-lib/src/lib/util/iterableIteratorLib.ts +./packages/cspell-lib/src/lib/util/IterableLike.ts +./packages/cspell-lib/src/lib/util/logger.test.ts +./packages/cspell-lib/src/lib/util/logger.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.test.ts +./packages/cspell-lib/src/lib/util/memorizeLastCall.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.test.ts +./packages/cspell-lib/src/lib/util/memorizerWeak.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.test.ts +./packages/cspell-lib/src/lib/util/MinHeapQueue.ts +./packages/cspell-lib/src/lib/util/PairingHeap.test.ts +./packages/cspell-lib/src/lib/util/PairingHeap.ts +./packages/cspell-lib/src/lib/util/regexHelper.ts +./packages/cspell-lib/src/lib/util/repMap.test.ts +./packages/cspell-lib/src/lib/util/repMap.ts +./packages/cspell-lib/src/lib/util/resolveFile.test.ts +./packages/cspell-lib/src/lib/util/resolveFile.ts +./packages/cspell-lib/src/lib/util/search.test.ts +./packages/cspell-lib/src/lib/util/search.ts +./packages/cspell-lib/src/lib/util/simpleCache.test.ts +./packages/cspell-lib/src/lib/util/simpleCache.ts +./packages/cspell-lib/src/lib/util/templates.test.ts +./packages/cspell-lib/src/lib/util/templates.ts +./packages/cspell-lib/src/lib/util/text.test.ts +./packages/cspell-lib/src/lib/util/text.ts +./packages/cspell-lib/src/lib/util/TextMap.test.ts +./packages/cspell-lib/src/lib/util/TextMap.ts +./packages/cspell-lib/src/lib/util/TextRange.regexp.test.ts +./packages/cspell-lib/src/lib/util/TextRange.test.ts +./packages/cspell-lib/src/lib/util/TextRange.ts +./packages/cspell-lib/src/lib/util/textRegex.test.ts +./packages/cspell-lib/src/lib/util/textRegex.ts +./packages/cspell-lib/src/lib/util/types.ts +./packages/cspell-lib/src/lib/util/Uri.test.ts +./packages/cspell-lib/src/lib/util/Uri.ts +./packages/cspell-lib/src/lib/util/url.test.ts +./packages/cspell-lib/src/lib/util/url.ts +./packages/cspell-lib/src/lib/util/util.test.ts +./packages/cspell-lib/src/lib/util/util.ts +./packages/cspell-lib/src/lib/util/wordSplitter.test.ts +./packages/cspell-lib/src/lib/util/wordSplitter.ts +./packages/cspell-lib/src/lib/validator.ts +./packages/cspell-lib/src/lib/wordListHelper.test.ts +./packages/cspell-lib/src/lib/wordListHelper.ts +./packages/cspell-lib/src/test-util/index.mts +./packages/cspell-lib/src/test-util/README.md +./packages/cspell-lib/src/test-util/test.locations.cts +./packages/cspell-lib/src/test-util/test.matchers.mts +./packages/cspell-lib/tsconfig.esm.json +./packages/cspell-pipe/CHANGELOG.md +./packages/cspell-pipe/LICENSE +./packages/cspell-pipe/README.md +./packages/cspell-pipe/src/async/index.test.ts +./packages/cspell-pipe/src/async/index.ts +./packages/cspell-pipe/src/helpers/distribute.test.ts +./packages/cspell-pipe/src/helpers/distribute.ts +./packages/cspell-pipe/src/helpers/index.test.ts +./packages/cspell-pipe/src/helpers/index.ts +./packages/cspell-pipe/src/helpers/interleave.test.ts +./packages/cspell-pipe/src/helpers/interleave.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.test.ts +./packages/cspell-pipe/src/helpers/iteratorToIterable.ts +./packages/cspell-pipe/src/helpers/toArray.ts +./packages/cspell-pipe/src/helpers/toAsyncIterable.ts +./packages/cspell-pipe/src/helpers/util.ts +./packages/cspell-pipe/src/index.test.ts +./packages/cspell-pipe/src/index.ts +./packages/cspell-pipe/src/internalTypes.ts +./packages/cspell-pipe/src/operators/append.test.ts +./packages/cspell-pipe/src/operators/append.ts +./packages/cspell-pipe/src/operators/await.test.ts +./packages/cspell-pipe/src/operators/await.ts +./packages/cspell-pipe/src/operators/buffer.test.ts +./packages/cspell-pipe/src/operators/buffer.ts +./packages/cspell-pipe/src/operators/combine.ts +./packages/cspell-pipe/src/operators/concatMap.test.ts +./packages/cspell-pipe/src/operators/concatMap.ts +./packages/cspell-pipe/src/operators/filter.test.ts +./packages/cspell-pipe/src/operators/filter.ts +./packages/cspell-pipe/src/operators/first.test.ts +./packages/cspell-pipe/src/operators/first.ts +./packages/cspell-pipe/src/operators/flatten.test.ts +./packages/cspell-pipe/src/operators/flatten.ts +./packages/cspell-pipe/src/operators/index.test.ts +./packages/cspell-pipe/src/operators/index.ts +./packages/cspell-pipe/src/operators/joinStrings.test.ts +./packages/cspell-pipe/src/operators/joinStrings.ts +./packages/cspell-pipe/src/operators/last.test.ts +./packages/cspell-pipe/src/operators/last.ts +./packages/cspell-pipe/src/operators/map.test.ts +./packages/cspell-pipe/src/operators/map.ts +./packages/cspell-pipe/src/operators/reduce.test.ts +./packages/cspell-pipe/src/operators/reduce.ts +./packages/cspell-pipe/src/operators/skip.test.ts +./packages/cspell-pipe/src/operators/skip.ts +./packages/cspell-pipe/src/operators/take.test.ts +./packages/cspell-pipe/src/operators/take.ts +./packages/cspell-pipe/src/operators/tap.test.ts +./packages/cspell-pipe/src/operators/tap.ts +./packages/cspell-pipe/src/operators/types.ts +./packages/cspell-pipe/src/operators/unique.test.ts +./packages/cspell-pipe/src/operators/unique.ts +./packages/cspell-pipe/src/pipe.test.ts +./packages/cspell-pipe/src/pipe.ts +./packages/cspell-pipe/src/reduce.test.ts +./packages/cspell-pipe/src/reduce.ts +./packages/cspell-pipe/src/sync/index.test.ts +./packages/cspell-pipe/src/sync/index.ts +./packages/cspell-pipe/src/test/fibonacci.ts +./packages/cspell-pipe/tsconfig.esm.json +./packages/cspell-resolver/CHANGELOG.md +./packages/cspell-resolver/LICENSE +./packages/cspell-resolver/README.md +./packages/cspell-resolver/src/index.mts +./packages/cspell-resolver/src/index.test.mts +./packages/cspell-resolver/src/requireResolve.test.mts +./packages/cspell-resolver/src/requireResolve.ts +./packages/cspell-resolver/src/resolveGlobal.mts +./packages/cspell-service-bus/CHANGELOG.md +./packages/cspell-service-bus/LICENSE +./packages/cspell-service-bus/README.md +./packages/cspell-service-bus/src/assert.test.ts +./packages/cspell-service-bus/src/assert.ts +./packages/cspell-service-bus/src/bus.test.ts +./packages/cspell-service-bus/src/bus.ts +./packages/cspell-service-bus/src/createRequestHandler.ts +./packages/cspell-service-bus/src/Dispatcher.ts +./packages/cspell-service-bus/src/errors.ts +./packages/cspell-service-bus/src/handlers.ts +./packages/cspell-service-bus/src/index.test.ts +./packages/cspell-service-bus/src/index.ts +./packages/cspell-service-bus/src/request.test.ts +./packages/cspell-service-bus/src/request.ts +./packages/cspell-service-bus/src/requestFactory.ts +./packages/cspell-service-bus/src/ServiceRequestFactory.ts +./packages/cspell-service-bus/src/SystemServiceBus.test.ts +./packages/cspell-service-bus/src/SystemServiceBus.ts +./packages/cspell-service-bus/tsconfig.esm.json +./packages/cspell-strong-weak-map/CHANGELOG.md +./packages/cspell-strong-weak-map/LICENSE +./packages/cspell-strong-weak-map/README.md +./packages/cspell-strong-weak-map/src/examples/fileCache.test.ts +./packages/cspell-strong-weak-map/src/examples/fileCache.ts +./packages/cspell-strong-weak-map/src/index.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.test.ts +./packages/cspell-strong-weak-map/src/StrongWeakMap.ts +./packages/cspell-strong-weak-map/tsconfig.esm.json +./packages/cspell-tools/bin.mjs +./packages/cspell-tools/CHANGELOG.md +./packages/cspell-tools/LICENSE +./packages/cspell-tools/README.md +./packages/cspell-tools/src/app.test.ts +./packages/cspell-tools/src/app.ts +./packages/cspell-tools/src/AppOptions.ts +./packages/cspell-tools/src/build.test.ts +./packages/cspell-tools/src/build.ts +./packages/cspell-tools/src/compile.test.ts +./packages/cspell-tools/src/compile.ts +./packages/cspell-tools/src/compiler/compile.test.ts +./packages/cspell-tools/src/compiler/compile.ts +./packages/cspell-tools/src/compiler/CompileOptions.ts +./packages/cspell-tools/src/compiler/createCompileRequest.test.ts +./packages/cspell-tools/src/compiler/createCompileRequest.ts +./packages/cspell-tools/src/compiler/createWordsCollection.test.ts +./packages/cspell-tools/src/compiler/createWordsCollection.ts +./packages/cspell-tools/src/compiler/fileWriter.test.ts +./packages/cspell-tools/src/compiler/fileWriter.ts +./packages/cspell-tools/src/compiler/index.ts +./packages/cspell-tools/src/compiler/legacyLineToWords.test.ts +./packages/cspell-tools/src/compiler/legacyLineToWords.ts +./packages/cspell-tools/src/compiler/logger.ts +./packages/cspell-tools/src/compiler/logWithTimestamp.ts +./packages/cspell-tools/src/compiler/Reader.Dutch.test.ts +./packages/cspell-tools/src/compiler/Reader.test.ts +./packages/cspell-tools/src/compiler/Reader.ts +./packages/cspell-tools/src/compiler/readers/ReaderOptions.ts +./packages/cspell-tools/src/compiler/readers/readHunspellFiles.ts +./packages/cspell-tools/src/compiler/readers/readTextFile.ts +./packages/cspell-tools/src/compiler/readers/regHunspellFile.ts +./packages/cspell-tools/src/compiler/readers/textFileReader.ts +./packages/cspell-tools/src/compiler/readers/trieFileReader.ts +./packages/cspell-tools/src/compiler/SourceReader.test.ts +./packages/cspell-tools/src/compiler/SourceReader.ts +./packages/cspell-tools/src/compiler/splitCamelCaseIfAllowed.test.ts +./packages/cspell-tools/src/compiler/splitCamelCaseIfAllowed.ts +./packages/cspell-tools/src/compiler/streamSourceWordsFromFile.test.ts +./packages/cspell-tools/src/compiler/streamSourceWordsFromFile.ts +./packages/cspell-tools/src/compiler/text.test.ts +./packages/cspell-tools/src/compiler/text.ts +./packages/cspell-tools/src/compiler/wordListCompiler.test.ts +./packages/cspell-tools/src/compiler/wordListCompiler.ts +./packages/cspell-tools/src/compiler/wordListParser.test.ts +./packages/cspell-tools/src/compiler/wordListParser.ts +./packages/cspell-tools/src/compiler/WordsCollection.ts +./packages/cspell-tools/src/compiler/writeTextToFile.ts +./packages/cspell-tools/src/config/config.ts +./packages/cspell-tools/src/config/configUtils.test.ts +./packages/cspell-tools/src/config/configUtils.ts +./packages/cspell-tools/src/config/index.ts +./packages/cspell-tools/src/config/normalizeConfig.ts +./packages/cspell-tools/src/FeatureFlags/FeatureFalgs.test.ts +./packages/cspell-tools/src/FeatureFlags/FeatureFlags.ts +./packages/cspell-tools/src/FeatureFlags/index.ts +./packages/cspell-tools/src/FeatureFlags/parseFlags.test.ts +./packages/cspell-tools/src/FeatureFlags/parseFlags.ts +./packages/cspell-tools/src/gzip/compressFiles.test.ts +./packages/cspell-tools/src/gzip/compressFiles.ts +./packages/cspell-tools/src/gzip/gzip.ts +./packages/cspell-tools/src/gzip/index.ts +./packages/cspell-tools/src/shasum/checksum.test.ts +./packages/cspell-tools/src/shasum/checksum.ts +./packages/cspell-tools/src/shasum/index.ts +./packages/cspell-tools/src/shasum/shasum.test.ts +./packages/cspell-tools/src/shasum/shasum.ts +./packages/cspell-tools/src/test/console.ts +./packages/cspell-tools/src/test/escapeRegEx.ts +./packages/cspell-tools/src/test/normalizeOutput.ts +./packages/cspell-tools/src/test/TestHelper.ts +./packages/cspell-tools/src/util/errors.test.ts +./packages/cspell-tools/src/util/errors.ts +./packages/cspell-tools/src/util/globP.ts +./packages/cspell-tools/src/util/index.ts +./packages/cspell-tools/wordlists.md +./packages/cspell-trie-lib/api/api.d.ts +./packages/cspell-trie-lib/api/README.md +./packages/cspell-trie-lib/api/rollup.config.mjs +./packages/cspell-trie-lib/CHANGELOG.md +./packages/cspell-trie-lib/LICENSE +./packages/cspell-trie-lib/README.md +./packages/cspell-trie-lib/src/index.test.ts +./packages/cspell-trie-lib/src/index.ts +./packages/cspell-trie-lib/src/lib/Builder/BuilderCursor.ts +./packages/cspell-trie-lib/src/lib/Builder/cursor-util.test.ts +./packages/cspell-trie-lib/src/lib/Builder/cursor-util.ts +./packages/cspell-trie-lib/src/lib/Builder/index.ts +./packages/cspell-trie-lib/src/lib/Builder/TrieBuilder.ts +./packages/cspell-trie-lib/src/lib/buildITrie.test.ts +./packages/cspell-trie-lib/src/lib/buildITrie.ts +./packages/cspell-trie-lib/src/lib/consolidate.test.ts +./packages/cspell-trie-lib/src/lib/consolidate.ts +./packages/cspell-trie-lib/src/lib/constants.ts +./packages/cspell-trie-lib/src/lib/convertToTrieRefNodes.test.ts +./packages/cspell-trie-lib/src/lib/convertToTrieRefNodes.ts +./packages/cspell-trie-lib/src/lib/decodeTrie.test.ts +./packages/cspell-trie-lib/src/lib/decodeTrie.ts +./packages/cspell-trie-lib/src/lib/distance/distance.test.ts +./packages/cspell-trie-lib/src/lib/distance/distance.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStar.test.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStar.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStarWeighted.test.ts +./packages/cspell-trie-lib/src/lib/distance/distanceAStarWeighted.ts +./packages/cspell-trie-lib/src/lib/distance/formatResultEx.ts +./packages/cspell-trie-lib/src/lib/distance/index.ts +./packages/cspell-trie-lib/src/lib/distance/levenshtein.test.ts +./packages/cspell-trie-lib/src/lib/distance/levenshtein.ts +./packages/cspell-trie-lib/src/lib/distance/weightedMaps.test.ts +./packages/cspell-trie-lib/src/lib/distance/weightedMaps.ts +./packages/cspell-trie-lib/src/lib/flatten.test.ts +./packages/cspell-trie-lib/src/lib/flatten.ts +./packages/cspell-trie-lib/src/lib/index.test.ts +./packages/cspell-trie-lib/src/lib/index.ts +./packages/cspell-trie-lib/src/lib/io/constants.ts +./packages/cspell-trie-lib/src/lib/io/decode.test.ts +./packages/cspell-trie-lib/src/lib/io/decode.ts +./packages/cspell-trie-lib/src/lib/io/importExport.test.ts +./packages/cspell-trie-lib/src/lib/io/importExport.ts +./packages/cspell-trie-lib/src/lib/io/importExportV1.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV1.ts +./packages/cspell-trie-lib/src/lib/io/importExportV2.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV2.ts +./packages/cspell-trie-lib/src/lib/io/importExportV3.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV3.ts +./packages/cspell-trie-lib/src/lib/io/importExportV4.test.ts +./packages/cspell-trie-lib/src/lib/io/importExportV4.ts +./packages/cspell-trie-lib/src/lib/io/importV3.test.ts +./packages/cspell-trie-lib/src/lib/io/importV3.ts +./packages/cspell-trie-lib/src/lib/io/importV3FastBlob.test.ts +./packages/cspell-trie-lib/src/lib/io/importV3FastBlob.ts +./packages/cspell-trie-lib/src/lib/io/index.ts +./packages/cspell-trie-lib/src/lib/ITrie.test.ts +./packages/cspell-trie-lib/src/lib/ITrie.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/CompoundModes.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/find.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/find.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/FindOptions.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/index.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/ITrieNode.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/trie-util.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/trie-util.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/TrieInfo.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/hintedWalker.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/hintedWalker.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/index.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walker.test.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walker.ts +./packages/cspell-trie-lib/src/lib/ITrieNode/walker/walkerTypes.ts +./packages/cspell-trie-lib/src/lib/mappers/joinLetters.ts +./packages/cspell-trie-lib/src/lib/mappers/mapCosts.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfo.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfo.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfoToWeightMap.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapDictionaryInfoToWeightMap.ts +./packages/cspell-trie-lib/src/lib/mappers/mapHunspellInformation.test.ts +./packages/cspell-trie-lib/src/lib/mappers/mapHunspellInformation.ts +./packages/cspell-trie-lib/src/lib/mappers/mapToSuggestionCostDef.ts +./packages/cspell-trie-lib/src/lib/models/DictionaryInformation.ts +./packages/cspell-trie-lib/src/lib/models/locale/index.ts +./packages/cspell-trie-lib/src/lib/models/locale/knownLocales.ts +./packages/cspell-trie-lib/src/lib/models/locale/locale.test.ts +./packages/cspell-trie-lib/src/lib/models/locale/locale.ts +./packages/cspell-trie-lib/src/lib/models/suggestionCostsDef.ts +./packages/cspell-trie-lib/src/lib/SimpleDictionaryParser.test.ts +./packages/cspell-trie-lib/src/lib/SimpleDictionaryParser.ts +./packages/cspell-trie-lib/src/lib/suggest.ts +./packages/cspell-trie-lib/src/lib/suggestCollector.ts +./packages/cspell-trie-lib/src/lib/suggestions/collectSuggestions.ts +./packages/cspell-trie-lib/src/lib/suggestions/constants.ts +./packages/cspell-trie-lib/src/lib/suggestions/genSuggestionsOptions.ts +./packages/cspell-trie-lib/src/lib/suggestions/orthography.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/orthography.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-en.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-es.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest-nl.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.legacy.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggest.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestAStar.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestAStar.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestCollector.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestCollector.ts +./packages/cspell-trie-lib/src/lib/suggestions/SuggestionTypes.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestTrieData.test.ts +./packages/cspell-trie-lib/src/lib/suggestions/suggestTrieData.ts +./packages/cspell-trie-lib/src/lib/trie.en.test.ts +./packages/cspell-trie-lib/src/lib/trie.test.ts +./packages/cspell-trie-lib/src/lib/trie.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/createTrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/createTrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.en.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBitMaskInfo.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobInternals.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobIRoot.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/FastTrieBlobIRoot.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/index.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/index.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/NumberSequenceByteDecoderAccumulator.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/NumberSequenceByteDecoderAccumulator.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/README.md +./packages/cspell-trie-lib/src/lib/TrieBlob/resolveMap.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlob.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlob.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlobIRoot.test.ts +./packages/cspell-trie-lib/src/lib/TrieBlob/TrieBlobIRoot.ts +./packages/cspell-trie-lib/src/lib/TrieBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieCursor/index.ts +./packages/cspell-trie-lib/src/lib/TrieCursor/TrieCursor.ts +./packages/cspell-trie-lib/src/lib/TrieData.ts +./packages/cspell-trie-lib/src/lib/TrieNode/compoundWalker.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/compoundWalker.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.dutch.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/find.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie-util.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie-util.ts +./packages/cspell-trie-lib/src/lib/TrieNode/trie.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNode.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeBuilder.test.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeBuilder.ts +./packages/cspell-trie-lib/src/lib/TrieNode/TrieNodeTrie.ts +./packages/cspell-trie-lib/src/lib/trieRef.ts +./packages/cspell-trie-lib/src/lib/types.ts +./packages/cspell-trie-lib/src/lib/utils/assert.ts +./packages/cspell-trie-lib/src/lib/utils/autoCacheMap.test.ts +./packages/cspell-trie-lib/src/lib/utils/autoCacheMap.ts +./packages/cspell-trie-lib/src/lib/utils/bufferLines.test.ts +./packages/cspell-trie-lib/src/lib/utils/bufferLines.ts +./packages/cspell-trie-lib/src/lib/utils/clean.ts +./packages/cspell-trie-lib/src/lib/utils/isDefined.ts +./packages/cspell-trie-lib/src/lib/utils/memorizeLastCall.test.ts +./packages/cspell-trie-lib/src/lib/utils/memorizeLastCall.ts +./packages/cspell-trie-lib/src/lib/utils/memorizer.test.ts +./packages/cspell-trie-lib/src/lib/utils/memorizer.ts +./packages/cspell-trie-lib/src/lib/utils/mergeDefaults.ts +./packages/cspell-trie-lib/src/lib/utils/mergeOptionalWithDefaults.ts +./packages/cspell-trie-lib/src/lib/utils/normalizeWord.ts +./packages/cspell-trie-lib/src/lib/utils/PairingHeap.test.ts +./packages/cspell-trie-lib/src/lib/utils/PairingHeap.ts +./packages/cspell-trie-lib/src/lib/utils/secondChanceCache.test.ts +./packages/cspell-trie-lib/src/lib/utils/secondChanceCache.ts +./packages/cspell-trie-lib/src/lib/utils/text.test.ts +./packages/cspell-trie-lib/src/lib/utils/text.ts +./packages/cspell-trie-lib/src/lib/utils/timer.test.ts +./packages/cspell-trie-lib/src/lib/utils/timer.ts +./packages/cspell-trie-lib/src/lib/utils/util.test.ts +./packages/cspell-trie-lib/src/lib/utils/util.ts +./packages/cspell-trie-lib/src/lib/walker/hintedWalker.test.ts +./packages/cspell-trie-lib/src/lib/walker/hintedWalker.ts +./packages/cspell-trie-lib/src/lib/walker/index.ts +./packages/cspell-trie-lib/src/lib/walker/walker.test.ts +./packages/cspell-trie-lib/src/lib/walker/walker.ts +./packages/cspell-trie-lib/src/lib/walker/walkerTypes.ts +./packages/cspell-trie-lib/src/perf/en.spec.ts +./packages/cspell-trie-lib/src/perf/has.perf.ts +./packages/cspell-trie-lib/src/perf/levenshtein.ts +./packages/cspell-trie-lib/src/perf/perfSuite.perf.ts +./packages/cspell-trie-lib/src/perf/perfSuite.ts +./packages/cspell-trie-lib/src/perf/run.ts +./packages/cspell-trie-lib/src/test/dictionaries.test.helper.ts +./packages/cspell-trie-lib/src/test/reader.test.helper.ts +./packages/cspell-trie-lib/src/test/samples.ts +./packages/cspell-trie-lib/src/test/util.test.helper.ts +./packages/cspell-trie/bin.js +./packages/cspell-trie/CHANGELOG.md +./packages/cspell-trie/LICENSE +./packages/cspell-trie/README.md +./packages/cspell-trie/src/app.test.ts +./packages/cspell-trie/src/app.ts +./packages/cspell-types/CHANGELOG.md +./packages/cspell-types/LICENSE +./packages/cspell-types/README.md +./packages/cspell-types/src/configFields.ts +./packages/cspell-types/src/CSpellReporter.ts +./packages/cspell-types/src/CSpellSettingsDef.ts +./packages/cspell-types/src/defineConfig.test.ts +./packages/cspell-types/src/defineConfig.ts +./packages/cspell-types/src/DictionaryDefinition.ts +./packages/cspell-types/src/DictionaryInformation.ts +./packages/cspell-types/src/features.test.ts +./packages/cspell-types/src/features.ts +./packages/cspell-types/src/index.mts +./packages/cspell-types/src/index.test.ts +./packages/cspell-types/src/index.ts +./packages/cspell-types/src/InlineDictionary.ts +./packages/cspell-types/src/Parser/index.mts +./packages/cspell-types/src/Parser/index.ts +./packages/cspell-types/src/suggestionCostsDef.ts +./packages/cspell-types/src/TextMap.ts +./packages/cspell-types/src/TextOffset.ts +./packages/cspell-types/src/types.ts +./packages/cspell-url/CHANGELOG.md +./packages/cspell-url/LICENSE +./packages/cspell-url/README.md +./packages/cspell-url/src/dataUrl.mts +./packages/cspell-url/src/defaultFileUrlBuilder.mts +./packages/cspell-url/src/fileUrl.mts +./packages/cspell-url/src/fileUrl.test.mts +./packages/cspell-url/src/FileUrlBuilder.mts +./packages/cspell-url/src/FileUrlBuilder.test.mts +./packages/cspell-url/src/index.mts +./packages/cspell-url/src/index.test.mts +./packages/cspell-url/src/url.mts +./packages/cspell-url/src/url.test.mts +./packages/cspell/bin.mjs +./packages/cspell/CHANGELOG.md +./packages/cspell/CONTRIBUTORS.md +./packages/cspell/DefaultCSpell.json +./packages/cspell/LICENSE +./packages/cspell/README.md +./packages/cspell/rollup.config.mjs +./packages/cspell/src/app/app.test.ts +./packages/cspell/src/app/app.ts +./packages/cspell/src/app/application.test.ts +./packages/cspell/src/app/application.ts +./packages/cspell/src/app/cli-reporter.test.ts +./packages/cspell/src/app/cli-reporter.ts +./packages/cspell/src/app/commandCheck.ts +./packages/cspell/src/app/commandLink.ts +./packages/cspell/src/app/commandLint.ts +./packages/cspell/src/app/commandSuggestion.ts +./packages/cspell/src/app/commandTrace.ts +./packages/cspell/src/app/emitters/DictionaryPathFormat.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.test.ts +./packages/cspell/src/app/emitters/suggestionsEmitter.ts +./packages/cspell/src/app/emitters/traceEmitter.test.ts +./packages/cspell/src/app/emitters/traceEmitter.ts +./packages/cspell/src/app/featureFlags/featureFlags.test.ts +./packages/cspell/src/app/featureFlags/featureFlags.ts +./packages/cspell/src/app/featureFlags/index.ts +./packages/cspell/src/app/index.test.ts +./packages/cspell/src/app/index.ts +./packages/cspell/src/app/link.test.ts +./packages/cspell/src/app/link.ts +./packages/cspell/src/app/lint/index.ts +./packages/cspell/src/app/lint/lint.test.ts +./packages/cspell/src/app/lint/lint.ts +./packages/cspell/src/app/lint/LintRequest.test.ts +./packages/cspell/src/app/lint/LintRequest.ts +./packages/cspell/src/app/options.test.ts +./packages/cspell/src/app/options.ts +./packages/cspell/src/app/repl/index.ts +./packages/cspell/src/app/test/test.helper.ts +./packages/cspell/src/app/util/async.ts +./packages/cspell/src/app/util/cache/CacheOptions.ts +./packages/cspell/src/app/util/cache/createCache.test.ts +./packages/cspell/src/app/util/cache/createCache.ts +./packages/cspell/src/app/util/cache/CSpellLintResultCache.ts +./packages/cspell/src/app/util/cache/DiskCache.test.ts +./packages/cspell/src/app/util/cache/DiskCache.ts +./packages/cspell/src/app/util/cache/DummyCache.ts +./packages/cspell/src/app/util/cache/fileEntryCache.ts +./packages/cspell/src/app/util/cache/index.ts +./packages/cspell/src/app/util/cache/ObjectCollection.test.ts +./packages/cspell/src/app/util/cache/ObjectCollection.ts +./packages/cspell/src/app/util/constants.ts +./packages/cspell/src/app/util/errors.test.ts +./packages/cspell/src/app/util/errors.ts +./packages/cspell/src/app/util/fileHelper.test.ts +./packages/cspell/src/app/util/fileHelper.ts +./packages/cspell/src/app/util/glob.test.ts +./packages/cspell/src/app/util/glob.ts +./packages/cspell/src/app/util/InMemoryReporter.ts +./packages/cspell/src/app/util/pad.test.ts +./packages/cspell/src/app/util/pad.ts +./packages/cspell/src/app/util/prefetch.test.ts +./packages/cspell/src/app/util/prefetch.ts +./packages/cspell/src/app/util/reporters.test.ts +./packages/cspell/src/app/util/reporters.ts +./packages/cspell/src/app/util/stdin.test.ts +./packages/cspell/src/app/util/stdin.ts +./packages/cspell/src/app/util/table.test.ts +./packages/cspell/src/app/util/table.ts +./packages/cspell/src/app/util/timer.ts +./packages/cspell/src/app/util/types.ts +./packages/cspell/src/app/util/util.test.ts +./packages/cspell/src/app/util/util.ts +./packages/cspell/src/lib/file-entry-cache.cts +./packages/cspell/src/lib/pkgInfo.cts +./packages/cspell/src/lib/tsconfig.cjs.json +./packages/cspell/src/lib/tsconfig.test.json +./packages/cspell/static/help-lint.txt +./packages/cspell/static/help-trace.txt +./packages/cspell/tsconfig.esm.json +./packages/cspell/vitest.config.mts +./packages/dynamic-import/CHANGELOG.md +./packages/dynamic-import/LICENSE +./packages/dynamic-import/README.md +./packages/dynamic-import/src/cjs/index.ts +./packages/dynamic-import/src/esm/dynamicImport.mts +./packages/dynamic-import/src/esm/index.mts +./packages/dynamic-import/src/esm/index.test.mts +./packages/dynamic-import/src/test/helper.ts +./packages/dynamic-import/src/test/index.test.ts +./packages/dynamic-import/tsconfig.base.json +./packages/dynamic-import/vitest.config.mts +./packages/hunspell-reader/bin.js +./packages/hunspell-reader/CHANGELOG.md +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README.md +./packages/hunspell-reader/LICENSE +./packages/hunspell-reader/README.md +./packages/hunspell-reader/src/aff.test.ts +./packages/hunspell-reader/src/aff.ts +./packages/hunspell-reader/src/affConstants.ts +./packages/hunspell-reader/src/affDef.ts +./packages/hunspell-reader/src/affLegacy.test.ts +./packages/hunspell-reader/src/affLegacy.ts +./packages/hunspell-reader/src/affReader.test.ts +./packages/hunspell-reader/src/affReader.ts +./packages/hunspell-reader/src/affToDicInfo.ts +./packages/hunspell-reader/src/affToDictInfo.test.ts +./packages/hunspell-reader/src/app.ts +./packages/hunspell-reader/src/commandDictInfo.ts +./packages/hunspell-reader/src/commandWords.ts +./packages/hunspell-reader/src/converter.test.ts +./packages/hunspell-reader/src/converter.ts +./packages/hunspell-reader/src/de.test.ts +./packages/hunspell-reader/src/index.ts +./packages/hunspell-reader/src/IterableHunspellReaderLegacy.test.ts +./packages/hunspell-reader/src/IterableHunspellReaderLegacy.ts +./packages/hunspell-reader/src/iterableToStream.ts +./packages/hunspell-reader/src/nl.test.ts +./packages/hunspell-reader/src/textUtils.test.ts +./packages/hunspell-reader/src/textUtils.ts +./packages/hunspell-reader/src/types.ts +./packages/hunspell-reader/src/util.test.ts +./packages/hunspell-reader/src/util.ts +./packages/hunspell-reader/testData/smallfile.txt +./pnpm-workspace.yaml +./README.md +./release-please-config.json +./rfc/drafts/onboarding/README.md +./rfc/rfc-0001 suggestions/CHANGELOG.md +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_common.typo.txt +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_GB.typo.txt +./rfc/rfc-0001 suggestions/fixtures/EnglishTypos_US.typo.txt +./rfc/rfc-0001 suggestions/README.md +./rfc/rfc-0001 suggestions/src/config-definitions.ts +./rfc/rfc-0002 improve dictionary suggestions/README.md +./rfc/rfc-0003 parsing files/README.md +./rfc/rfc-0003 parsing files/src/types.ts +./rfc/rfc-0004 known issues/README.md +./rfc/rfc-0004 known issues/types.ts +./rfc/rfc-0005 named configurations/README.md +./rfc/rfc-0005 named configurations/types.ts +./scripts/build-cspell-schema.mjs +./scripts/jsconfig.json +./scripts/remove-zero-width-space.mjs +./scripts/update-package-json.mjs +./scripts/update-release-please.mjs +./SECURITY.md +./static/footer.md +./static/sponsor.md +./static/tidelift.md +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.rollup.cjs +./test-packages/cspell-dictionary/test-cspell-dictionary/bin.rollup.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/CHANGELOG.md +./test-packages/cspell-dictionary/test-cspell-dictionary/README.md +./test-packages/cspell-dictionary/test-cspell-dictionary/rollup.config.mjs +./test-packages/cspell-dictionary/test-cspell-dictionary/src/index.test.ts +./test-packages/cspell-dictionary/test-cspell-dictionary/src/index.ts +./test-packages/cspell-dictionary/test-cspell-dictionary/tsconfig.esm.json +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.rollup.cjs +./test-packages/cspell-gitignore/test-cspell-gitignore/bin.rollup.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/CHANGELOG.md +./test-packages/cspell-gitignore/test-cspell-gitignore/README.md +./test-packages/cspell-gitignore/test-cspell-gitignore/rollup.config.mjs +./test-packages/cspell-gitignore/test-cspell-gitignore/src/index.test.ts +./test-packages/cspell-gitignore/test-cspell-gitignore/src/index.ts +./test-packages/cspell-gitignore/test-cspell-gitignore/tsconfig.esm.json +./test-packages/cspell-glob/test-cspell-glob/bin.mjs +./test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs +./test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs +./test-packages/cspell-glob/test-cspell-glob/CHANGELOG.md +./test-packages/cspell-glob/test-cspell-glob/README.md +./test-packages/cspell-glob/test-cspell-glob/rollup.config.mjs +./test-packages/cspell-glob/test-cspell-glob/src/index.test.ts +./test-packages/cspell-glob/test-cspell-glob/src/index.ts +./test-packages/cspell-io/test-cspell-io/bin.mjs +./test-packages/cspell-io/test-cspell-io/bin.rollup.cjs +./test-packages/cspell-io/test-cspell-io/bin.rollup.mjs +./test-packages/cspell-io/test-cspell-io/CHANGELOG.md +./test-packages/cspell-io/test-cspell-io/README.md +./test-packages/cspell-io/test-cspell-io/rollup.config.mjs +./test-packages/cspell-io/test-cspell-io/src/index.test.ts +./test-packages/cspell-io/test-cspell-io/src/index.ts +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin.cjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin/bin.cjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/bin/bin.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/build.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-esbuild-cjs/README.md +./test-packages/cspell-lib/test-cspell-esbuild-cjs/source/build.mjs +./test-packages/cspell-lib/test-cspell-esbuild-cjs/source/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-esm/bin.mjs +./test-packages/cspell-lib/test-cspell-lib-esm/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-esm/README.md +./test-packages/cspell-lib/test-cspell-lib-esm/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-rollup/bin.cjs +./test-packages/cspell-lib/test-cspell-lib-rollup/bin.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-rollup/lib/chalk.js +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/index.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/inject.d.mts +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/inject.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/plugin/src/rollup-plugin-inject-dirname.mts +./test-packages/cspell-lib/test-cspell-lib-rollup/README.md +./test-packages/cspell-lib/test-cspell-lib-rollup/rollup.config.mjs +./test-packages/cspell-lib/test-cspell-lib-rollup/src/index.ts +./test-packages/cspell-lib/test-cspell-lib-webpack/CHANGELOG.md +./test-packages/cspell-lib/test-cspell-lib-webpack/cspell-dist.js +./test-packages/cspell-lib/test-cspell-lib-webpack/README.md +./test-packages/cspell-lib/test-cspell-lib-webpack/src/index.mts +./test-packages/cspell-lib/test-cspell-lib-webpack/webpack.config.js +./test-packages/cspell-pipe/test-cspell-pipe-esm/bin.mjs +./test-packages/cspell-pipe/test-cspell-pipe-esm/CHANGELOG.md +./test-packages/cspell-pipe/test-cspell-pipe-esm/README.md +./test-packages/cspell-pipe/test-cspell-pipe-esm/src/index.mts +./test-packages/cspell-pipe/test-cspell-pipe-esm/src/index.test.mts +./test-packages/cspell-pipe/test-cspell-pipe-rollup/bin.cjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/bin.mjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/CHANGELOG.md +./test-packages/cspell-pipe/test-cspell-pipe-rollup/README.md +./test-packages/cspell-pipe/test-cspell-pipe-rollup/rollup.config.mjs +./test-packages/cspell-pipe/test-cspell-pipe-rollup/src/index.mts +./test-packages/cspell-pipe/test-cspell-pipe-rollup/src/index.test.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/bin.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/CHANGELOG.md +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/README.md +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/src/index.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-esm/src/index.test.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/bin.cjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/bin.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/CHANGELOG.md +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/README.md +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/rollup.config.mjs +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/src/index.mts +./test-packages/cspell-service-bus/test-cspell-service-bus-rollup/src/index.test.mts +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.rollup.cjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/bin.rollup.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/CHANGELOG.md +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/README.md +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/rollup.config.mjs +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/src/index.test.ts +./test-packages/cspell-strong-weak-map/test-cspell-strong-weak-map/src/index.ts +./test-packages/cspell-tools/test-cspell-tools/CHANGELOG.md +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/README.md +./test-packages/cspell-tools/test-cspell-tools/src/index.ts +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.rollup.cjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/bin.rollup.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/CHANGELOG.md +./test-packages/cspell-trie-lib/test-cspell-trie-lib/README.md +./test-packages/cspell-trie-lib/test-cspell-trie-lib/rollup.config.mjs +./test-packages/cspell-trie-lib/test-cspell-trie-lib/src/index.test.ts +./test-packages/cspell-trie-lib/test-cspell-trie-lib/src/index.ts +./test-packages/cspell-types/test-cspell-types-cjs/bin.cjs +./test-packages/cspell-types/test-cspell-types-cjs/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-cjs/README.md +./test-packages/cspell-types/test-cspell-types-cjs/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/index.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/parser.test.ts +./test-packages/cspell-types/test-cspell-types-cjs/src/parser.ts +./test-packages/cspell-types/test-cspell-types-esm/bin.mjs +./test-packages/cspell-types/test-cspell-types-esm/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-esm/README.md +./test-packages/cspell-types/test-cspell-types-esm/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-esm/src/index.ts +./test-packages/cspell-types/test-cspell-types-esm/src/parser.test.ts +./test-packages/cspell-types/test-cspell-types-esm/src/parser.ts +./test-packages/cspell-types/test-cspell-types-rollup/bin.cjs +./test-packages/cspell-types/test-cspell-types-rollup/bin.mjs +./test-packages/cspell-types/test-cspell-types-rollup/CHANGELOG.md +./test-packages/cspell-types/test-cspell-types-rollup/README.md +./test-packages/cspell-types/test-cspell-types-rollup/rollup.config.mjs +./test-packages/cspell-types/test-cspell-types-rollup/src/index.test.ts +./test-packages/cspell-types/test-cspell-types-rollup/src/index.ts +./test-packages/cspell-types/validate-schema/CHANGELOG.md +./test-packages/cspell-types/validate-schema/validate-schema.mjs +./test-packages/cspell/test-cspell-cli/bin.mjs +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/LICENSE +./test-packages/cspell/test-cspell-cli/README.md +./test-packages/cspell/test-cspell-esbuild-cjs/bin.cjs +./test-packages/cspell/test-cspell-esbuild-cjs/bin.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/bin/bin.cjs +./test-packages/cspell/test-cspell-esbuild-cjs/build.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/CHANGELOG.md +./test-packages/cspell/test-cspell-esbuild-cjs/README.md +./test-packages/cspell/test-cspell-esbuild-cjs/source/build.mjs +./test-packages/cspell/test-cspell-esbuild-cjs/source/src/index.ts +./test-packages/cspell/test-cspell-esm-reporter/CHANGELOG.md +./test-packages/cspell/test-cspell-esm-reporter/index.js +./test-packages/cspell/test-cspell-esm-reporter/LICENSE +./test-packages/cspell/test-cspell-esm-reporter/README.md +./test-packages/cspell/test-cspell-esm-reporter/src/reporter.ts +./test-packages/cspell/test-cspell/CHANGELOG.md +./test-packages/cspell/test-cspell/README.md +./test-packages/cspell/test-cspell/src/index.ts +./test-packages/dictionaries/companies/CHANGELOG.md +./test-packages/dictionaries/companies/dict/companies.txt +./test-packages/dictionaries/companies/LICENSE +./test-packages/dictionaries/companies/README.md +./test-packages/dictionaries/companies/src/companies.txt +./test-packages/dictionaries/software-terms/CHANGELOG.md +./test-packages/dictionaries/software-terms/dict/networkingTerms.txt +./test-packages/dictionaries/software-terms/dict/softwareTerms.txt +./test-packages/dictionaries/software-terms/LICENSE +./test-packages/dictionaries/software-terms/README.md +./test-packages/dictionaries/software-terms/source-files-networking.txt +./test-packages/dictionaries/software-terms/source-files.txt +./test-packages/dictionaries/software-terms/src/network-os.txt +./test-packages/dictionaries/software-terms/src/network-protocols.txt +./test-packages/dictionaries/software-terms/src/README.md +./test-packages/dictionaries/software-terms/src/software-terms.txt +./test-packages/dictionaries/software-terms/src/software-tools.txt +./test-packages/dynamic-import/test-dynamic-import-cjs/bin.cjs +./test-packages/dynamic-import/test-dynamic-import-cjs/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-cjs/README.md +./test-packages/dynamic-import/test-dynamic-import-cjs/src/index.test.ts +./test-packages/dynamic-import/test-dynamic-import-cjs/src/index.ts +./test-packages/dynamic-import/test-dynamic-import-esm/bin.mjs +./test-packages/dynamic-import/test-dynamic-import-esm/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-esm/README.md +./test-packages/dynamic-import/test-dynamic-import-esm/src/index.test.ts +./test-packages/dynamic-import/test-dynamic-import-esm/src/index.ts +./test-packages/dynamic-import/test-dynamic-import-rollup/bin.cjs +./test-packages/dynamic-import/test-dynamic-import-rollup/bin.mjs +./test-packages/dynamic-import/test-dynamic-import-rollup/CHANGELOG.md +./test-packages/dynamic-import/test-dynamic-import-rollup/README.md +./test-packages/dynamic-import/test-dynamic-import-rollup/rollup.config.mjs +./test-packages/dynamic-import/test-dynamic-import-rollup/src/index.mts +./test-packages/dynamic-import/test-dynamic-import-rollup/src/index.test.mts +./test-packages/examples/example-cspell-lib-single-doc/bin.js +./test-packages/examples/example-cspell-lib-single-doc/CHANGELOG.md +./test-packages/examples/example-cspell-lib-single-doc/README.md +./test-packages/examples/example-cspell-lib-single-doc/src/index.ts +./test-packages/yarn/yarn2/CHANGELOG.md +./test-packages/yarn/yarn2/test-yarn3-med/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-med/README.md +./test-packages/yarn/yarn2/test-yarn3-sci/custom-terms.txt +./test-packages/yarn/yarn2/test-yarn3-sci/README.md +./tools/perf-chart/bin.js +./tools/perf-chart/src/app.ts +./tools/perf-chart/src/perfChart.ts +./tools/README.md +./tsconfig.base.json +./tsconfig.cjs.json +./tsconfig.esm.json +./tsconfig.full.json +./tsconfig.next.json +./vitest.config.mjs +./website/_scripts/extract-properties.mjs +./website/_scripts/jsconfig.json +./website/babel.config.js +./website/docs/case-sensitive.md +./website/docs/command-check.md +./website/docs/Configuration/_category_.yaml +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/document-settings.md +./website/docs/Configuration/imports.md +./website/docs/Configuration/index.md +./website/docs/Configuration/language-settings.mdx +./website/docs/Configuration/overrides.md +./website/docs/Configuration/patterns.md +./website/docs/dictionaries/_category_.yaml +./website/docs/dictionaries/custom-dictionaries.md +./website/docs/dictionaries/index.md +./website/docs/dictionaries/searching-dictionaries.md +./website/docs/forbidden-words.md +./website/docs/getting-started.mdx +./website/docs/git.md +./website/docs/globs.md +./website/docs/how-it-works.md +./website/docs/installation.md +./website/docusaurus.config.ts +./website/eslint.config.mjs +./website/README.md +./website/sidebars.ts +./website/src/components/HomepageFeatures/index.tsx +./website/src/components/HomepageFeatures/styles.module.css +./website/src/css/custom.css +./website/src/pages/about.md +./website/src/pages/index.module.css +./website/src/pages/index.tsx +./website/src/pages/markdown-page.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/README.md +./docs/_includes/generated-docs/help-lint.md +./docs/_includes/generated-docs/README.md +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./files.txt +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell-bundled-dicts/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/cspell/CHANGELOG.md +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/da_DK.aff +./packages/hunspell-reader/dictionaries/da_DK.dic +./packages/hunspell-reader/dictionaries/en_GB.aff +./packages/hunspell-reader/dictionaries/en_GB.dic +./packages/hunspell-reader/dictionaries/en_US.aff +./packages/hunspell-reader/dictionaries/en_US.dic +./packages/hunspell-reader/dictionaries/es_ANY.aff +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/es_ANY.dic +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/fr-classique.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/et-EE/index.aff +./packages/hunspell-reader/dictionaries/et-EE/index.dic +./packages/hunspell-reader/dictionaries/et-EE/LICENSE +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-classique.dic +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.aff +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/fr-moderne.dic +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/eu/eu.aff +./packages/hunspell-reader/dictionaries/eu/eu.dic +./packages/hunspell-reader/dictionaries/eu/README.md +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.aff +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/fr-reforme1990.dic +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.aff +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/nl.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.aff +./packages/hunspell-reader/dictionaries/hu_hu/hu_HU.dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).aff +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).dic +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/hu/hu.aff +./packages/hunspell-reader/dictionaries/hu/hu.dic +./packages/hunspell-reader/dictionaries/hu/README_hu.txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/Portuguese (Brazilian).txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./packages/hunspell-reader/dictionaries/README_en_US.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell-tools/test-cspell-tools/dict/companies.txt +./test-packages/cspell-tools/test-cspell-tools/dict/node.txt +./test-packages/cspell-tools/test-cspell-tools/dict/php.txt +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./test-packages/cspell/test-cspell-cli/CHANGELOG.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md +./website/docs/Configuration/auto_properties.md diff --git a/test-fixtures/perf/cspell-glob/data/patterns.jsonc b/test-fixtures/perf/cspell-glob/data/patterns.jsonc new file mode 100644 index 00000000000..82c57ebaf2c --- /dev/null +++ b/test-fixtures/perf/cspell-glob/data/patterns.jsonc @@ -0,0 +1,41 @@ +[ +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"node_modules/**","root":""}]}, +{"options":{"root":"","dot":false,"nested":false,"mode":"include","cwd":""},"patterns":[{"glob":"**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"node_modules/**","root":""}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.eslintignore","root":""},{"glob":"**/.eslintignore/**","root":""},{"glob":"**/.git","root":""},{"glob":"**/.git/**","root":""},{"glob":"**/.gitattributes","root":""},{"glob":"**/.gitattributes/**","root":""},{"glob":"**/.gitignore","root":""},{"glob":"**/.gitignore/**","root":""},{"glob":".github/integrations.json","root":""},{"glob":".github/integrations.json/**","root":""},{"glob":"**/.pnp.{js,cjs}","root":""},{"glob":"**/.pnp.{js,cjs}/**","root":""},{"glob":"**/.prettierignore","root":""},{"glob":"**/.prettierignore/**","root":""},{"glob":"**/.yarn","root":""},{"glob":"**/.yarn/**","root":""},{"glob":"**/*.{png,jpg,pdf,svg}","root":""},{"glob":"**/*.{png,jpg,pdf,svg}/**","root":""},{"glob":"**/*.cpuprofile","root":""},{"glob":"**/*.cpuprofile/**","root":""},{"glob":"**/*.heapprofile","root":""},{"glob":"**/*.heapprofile/**","root":""},{"glob":"**/emoji*.txt","root":""},{"glob":"**/emoji*.txt/**","root":""},{"glob":"**/.docusaurus/**"},{"glob":"**/.gitignore"},{"glob":"**/.gitignore/**"},{"glob":"**/.vscode/**"},{"glob":"**/{cspell.*,cSpell.*,.cspell.*,cspell.config.*}"},{"glob":"**/{cspell.*,cSpell.*,.cspell.*,cspell.config.*}/**"},{"glob":"**/*.schema.json"},{"glob":"**/*.schema.json/**"},{"glob":"**/*.snap"},{"glob":"**/*.snap/**"},{"glob":"**/*.trie"},{"glob":"**/*.trie/**"},{"glob":"**/coverage/**"},{"glob":"**/dist/**"},{"glob":"**/jest.config.js"},{"glob":"**/jest.config.js/**"},{"glob":"**/node_modules/**"},{"glob":"**/tsconfig.json"},{"glob":"**/tsconfig.json/**"},{"glob":"tools/*/lib/**","root":""},{"glob":"cspell-dict.txt","root":""},{"glob":"cspell-dict.txt/**","root":""},{"glob":"cspell-ignore-words.txt","root":""},{"glob":"cspell-ignore-words.txt/**","root":""},{"glob":"docs/docsV2/**","root":""},{"glob":"docs/types/cspell-types","root":""},{"glob":"docs/types/cspell-types/**","root":""},{"glob":".cspell","root":""},{"glob":".cspell/**","root":""},{"glob":"**/cspell*.{json,yaml}","root":""},{"glob":"**/cspell*.{json,yaml}/**","root":""},{"glob":"integration-tests/config/config.json","root":""},{"glob":"integration-tests/config/config.json/**","root":""},{"glob":"integration-tests/config/repositories/**","root":""},{"glob":"integration-tests/perf/**","root":""},{"glob":"integration-tests/repositories/**","root":""},{"glob":"integration-tests/snapshots/**","root":""},{"glob":"**/lcov.info","root":""},{"glob":"**/lcov.info/**","root":""},{"glob":"**/lib-bundled","root":""},{"glob":"**/lib-bundled/**","root":""},{"glob":"**/package.json","root":""},{"glob":"**/package.json/**","root":""},{"glob":"**/*-lock.{json,yaml}","root":""},{"glob":"**/*-lock.{json,yaml}/**","root":""},{"glob":"packages/*/fixtures/**","root":""},{"glob":"packages/*/Samples/**","root":""},{"glob":"packages/*/samples/**","root":""},{"glob":"packages/Samples/**","root":""},{"glob":"packages/cspell-lib/fixtures/**","root":""},{"glob":"**/temp","root":""},{"glob":"**/temp/**","root":""},{"glob":"test-fixtures/**","root":""},{"glob":"test-packages/*/test-cspell-eslint-plugin*/**","root":""},{"glob":"test-packages/examples/example-cspell-lib-single-doc/samples/**","root":""},{"glob":"test-packages/*/test-cspell-tools/src/*.txt","root":""},{"glob":"test-packages/*/test-cspell-tools/src/*.txt/**","root":""},{"glob":"node_modules/**","root":""}]}, +{"options":{"root":"","dot":false,"nested":false,"mode":"include","cwd":""},"patterns":[{"glob":"**","root":""}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/logs","root":""},{"glob":"**/logs/**","root":""},{"glob":"**/_.log","root":""},{"glob":"**/_.log/**","root":""},{"glob":"**/_.cpuprofile","root":""},{"glob":"**/_.cpuprofile/**","root":""},{"glob":"**/npm-debug.log*","root":""},{"glob":"**/npm-debug.log*/**","root":""},{"glob":"**/yarn-debug.log*","root":""},{"glob":"**/yarn-debug.log*/**","root":""},{"glob":"**/yarn-error.log\\*","root":""},{"glob":"**/yarn-error.log\\*/**","root":""},{"glob":"**/pids","root":""},{"glob":"**/pids/**","root":""},{"glob":"**/_.pid","root":""},{"glob":"**/_.pid/**","root":""},{"glob":"**/_.seed","root":""},{"glob":"**/_.seed/**","root":""},{"glob":"**/\\*.pid.lock","root":""},{"glob":"**/\\*.pid.lock/**","root":""},{"glob":"**/lib-cov","root":""},{"glob":"**/lib-cov/**","root":""},{"glob":"**/coverage","root":""},{"glob":"**/coverage/**","root":""},{"glob":"**/.coverage","root":""},{"glob":"**/.coverage/**","root":""},{"glob":"**/lcov.info","root":""},{"glob":"**/lcov.info/**","root":""},{"glob":"**/.nyc_output","root":""},{"glob":"**/.nyc_output/**","root":""},{"glob":"**/.rollup.cache","root":""},{"glob":"**/.rollup.cache/**","root":""},{"glob":"**/dist","root":""},{"glob":"**/dist/**","root":""},{"glob":"**/out","root":""},{"glob":"**/out/**","root":""},{"glob":"**/*.d.cts","root":""},{"glob":"**/*.d.cts/**","root":""},{"glob":"**/temp","root":""},{"glob":"**/temp/**","root":""},{"glob":"**/.temp","root":""},{"glob":"**/.temp/**","root":""},{"glob":"**/tmp","root":""},{"glob":"**/tmp/**","root":""},{"glob":"**/*.log","root":""},{"glob":"**/*.log/**","root":""},{"glob":"**/node_modules/**/*","root":""},{"glob":"**/typings/**/*","root":""},{"glob":"**/.npm","root":""},{"glob":"**/.npm/**","root":""},{"glob":"**/.eslintcache","root":""},{"glob":"**/.eslintcache/**","root":""},{"glob":"**/.node_repl_history","root":""},{"glob":"**/.node_repl_history/**","root":""},{"glob":"**/*.tgz","root":""},{"glob":"**/*.tgz/**","root":""},{"glob":"**/.yarn-integrity","root":""},{"glob":"**/.yarn-integrity/**","root":""},{"glob":"**/.env","root":""},{"glob":"**/.env/**","root":""},{"glob":"**/.next","root":""},{"glob":"**/.next/**","root":""},{"glob":"**/.coveralls.yml","root":""},{"glob":"**/.coveralls.yml/**","root":""},{"glob":"**/.tsbuildinfo","root":""},{"glob":"**/.tsbuildinfo/**","root":""},{"glob":"**/.cspellcache","root":""},{"glob":"**/.cspellcache/**","root":""},{"glob":"**/*.cpuprofile","root":""},{"glob":"**/*.cpuprofile/**","root":""},{"glob":"**/*.heapprofile","root":""},{"glob":"**/*.heapprofile/**","root":""},{"glob":"docs/docsV2","root":""},{"glob":"docs/docsV2/**","root":""}]}, +{"options":{"root":"docs","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/_site","root":"docs"},{"glob":"**/_site/**","root":"docs"},{"glob":"**/.sass-cache","root":"docs"},{"glob":"**/.sass-cache/**","root":"docs"},{"glob":"**/.jekyll-cache","root":"docs"},{"glob":"**/.jekyll-cache/**","root":"docs"},{"glob":"**/.jekyll-metadata","root":"docs"},{"glob":"**/.jekyll-metadata/**","root":"docs"},{"glob":"**/vendor","root":"docs"},{"glob":"**/vendor/**","root":"docs"}]}, +{"options":{"root":"packages/cspell-bundled-dicts","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[]}, +{"options":{"root":"packages/cspell-eslint-plugin","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-eslint-plugin"},{"glob":"**/dist/**","root":"packages/cspell-eslint-plugin"},{"glob":"**/temp","root":"packages/cspell-eslint-plugin"},{"glob":"**/temp/**","root":"packages/cspell-eslint-plugin"}]}, +{"options":{"root":"packages/cspell-gitignore","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-gitignore"},{"glob":"**/dist/**","root":"packages/cspell-gitignore"},{"glob":"**/temp","root":"packages/cspell-gitignore"},{"glob":"**/temp/**","root":"packages/cspell-gitignore"}]}, +{"options":{"root":"packages/cspell-lib","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"src/**/*.cjs","root":"packages/cspell-lib"},{"glob":"src/**/*.cjs/**","root":"packages/cspell-lib"}]}, +{"options":{"root":"packages/cspell-pipe","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-pipe"},{"glob":"**/dist/**","root":"packages/cspell-pipe"},{"glob":"**/temp","root":"packages/cspell-pipe"},{"glob":"**/temp/**","root":"packages/cspell-pipe"}]}, +{"options":{"root":"packages/cspell-resolver","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-resolver"},{"glob":"**/dist/**","root":"packages/cspell-resolver"},{"glob":"**/temp","root":"packages/cspell-resolver"},{"glob":"**/temp/**","root":"packages/cspell-resolver"}]}, +{"options":{"root":"packages/cspell-strong-weak-map","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-strong-weak-map"},{"glob":"**/dist/**","root":"packages/cspell-strong-weak-map"},{"glob":"**/temp","root":"packages/cspell-strong-weak-map"},{"glob":"**/temp/**","root":"packages/cspell-strong-weak-map"}]}, +{"options":{"root":"packages/cspell-url","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/cspell-url"},{"glob":"**/dist/**","root":"packages/cspell-url"},{"glob":"**/temp","root":"packages/cspell-url"},{"glob":"**/temp/**","root":"packages/cspell-url"}]}, +{"options":{"root":"packages/cspell","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"api","root":"packages/cspell"},{"glob":"api/**","root":"packages/cspell"},{"glob":"src/lib/*.map","root":"packages/cspell"},{"glob":"src/lib/*.map/**","root":"packages/cspell"},{"glob":"src/lib/*.d.cts","root":"packages/cspell"},{"glob":"src/lib/*.d.cts/**","root":"packages/cspell"},{"glob":"src/lib/*.cjs","root":"packages/cspell"},{"glob":"src/lib/*.cjs/**","root":"packages/cspell"},{"glob":"dist.*/**","root":"packages/cspell"},{"glob":"esm","root":"packages/cspell"},{"glob":"esm/**","root":"packages/cspell"},{"glob":"dist","root":"packages/cspell"},{"glob":"dist/**","root":"packages/cspell"}]}, +{"options":{"root":"packages/dynamic-import","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dist","root":"packages/dynamic-import"},{"glob":"**/dist/**","root":"packages/dynamic-import"},{"glob":"**/temp","root":"packages/dynamic-import"},{"glob":"**/temp/**","root":"packages/dynamic-import"}]}, +{"options":{"root":"test-packages/yarn/yarn2","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.yarn/cache"},{"glob":"**/.yarn/cache/**"},{"glob":"**/install-state.gz","root":"test-packages/yarn/yarn2"},{"glob":"**/install-state.gz/**","root":"test-packages/yarn/yarn2"},{"glob":"**/.pnp.js","root":"test-packages/yarn/yarn2"},{"glob":"**/.pnp.js/**","root":"test-packages/yarn/yarn2"},{"glob":"**/.pnp.cjs","root":"test-packages/yarn/yarn2"},{"glob":"**/.pnp.cjs/**","root":"test-packages/yarn/yarn2"}]}, +{"options":{"root":"test-packages/yarn/yarn2/test-yarn3-med","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":".yarn/cache","root":"test-packages/yarn/yarn2/test-yarn3-med"},{"glob":".yarn/cache/**","root":"test-packages/yarn/yarn2/test-yarn3-med"},{"glob":"**/install-state.gz","root":"test-packages/yarn/yarn2/test-yarn3-med"},{"glob":"**/install-state.gz/**","root":"test-packages/yarn/yarn2/test-yarn3-med"},{"glob":"**/.pnp.js","root":"test-packages/yarn/yarn2/test-yarn3-med"},{"glob":"**/.pnp.js/**","root":"test-packages/yarn/yarn2/test-yarn3-med"}]}, +{"options":{"root":"test-packages/yarn/yarn2/test-yarn3-sci","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":".yarn/cache","root":"test-packages/yarn/yarn2/test-yarn3-sci"},{"glob":".yarn/cache/**","root":"test-packages/yarn/yarn2/test-yarn3-sci"},{"glob":"**/install-state.gz","root":"test-packages/yarn/yarn2/test-yarn3-sci"},{"glob":"**/install-state.gz/**","root":"test-packages/yarn/yarn2/test-yarn3-sci"},{"glob":"**/.pnp.js","root":"test-packages/yarn/yarn2/test-yarn3-sci"},{"glob":"**/.pnp.js/**","root":"test-packages/yarn/yarn2/test-yarn3-sci"}]}, +{"options":{"root":"website","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"node_modules","root":"website"},{"glob":"node_modules/**","root":"website"},{"glob":"build","root":"website"},{"glob":"build/**","root":"website"},{"glob":"**/.docusaurus","root":"website"},{"glob":"**/.docusaurus/**","root":"website"},{"glob":"**/.cache-loader","root":"website"},{"glob":"**/.cache-loader/**","root":"website"},{"glob":"**/.DS_Store","root":"website"},{"glob":"**/.DS_Store/**","root":"website"},{"glob":"**/.env.local","root":"website"},{"glob":"**/.env.local/**","root":"website"},{"glob":"**/.env.development.local","root":"website"},{"glob":"**/.env.development.local/**","root":"website"},{"glob":"**/.env.test.local","root":"website"},{"glob":"**/.env.test.local/**","root":"website"},{"glob":"**/.env.production.local","root":"website"},{"glob":"**/.env.production.local/**","root":"website"},{"glob":"**/npm-debug.log*","root":"website"},{"glob":"**/npm-debug.log*/**","root":"website"},{"glob":"**/yarn-debug.log*","root":"website"},{"glob":"**/yarn-debug.log*/**","root":"website"},{"glob":"**/yarn-error.log*","root":"website"},{"glob":"**/yarn-error.log*/**","root":"website"},{"glob":"docs/api/*/**/*","root":"website"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"_site/**","root":"docs"},{"glob":"_includes/generated-docs","root":"docs"},{"glob":"_includes/generated-docs/**","root":"docs"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.{adb,ads}","root":""},{"glob":"**/*.{adb,ads}/**","root":""}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/Dockerfile"},{"glob":"**/Dockerfile/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.git/COMMIT_EDITMSG"},{"glob":"**/.git/COMMIT_EDITMSG/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.git/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.jl"},{"glob":"**/*.jl/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/makefile"},{"glob":"**/makefile/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.svelte"},{"glob":"**/*.svelte/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.tf"},{"glob":"**/*.tf/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/CHANGELOG.md"},{"glob":"**/CHANGELOG.md/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.git/info/refs"},{"glob":"**/.git/info/refs/**"},{"glob":"**/.git/{logs,objects,packed-refs,refs}"},{"glob":"**/.git/{logs,objects,packed-refs,refs}/**"},{"glob":"**/.git/HEAD"},{"glob":"**/.git/HEAD/**"},{"glob":"**/.git/index"},{"glob":"**/.git/index/**"},{"glob":"**/.git/FETCH_HEAD"},{"glob":"**/.git/FETCH_HEAD/**"},{"glob":"**/.git/ORIGIN_HEAD"},{"glob":"**/.git/ORIGIN_HEAD/**"},{"glob":"**/CHANGELOG.md","root":"packages/cspell-bundled-dicts"},{"glob":"**/CHANGELOG.md/**","root":"packages/cspell-bundled-dicts"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/.eslintignore","root":""},{"glob":"**/.eslintignore/**","root":""},{"glob":"**/.git","root":""},{"glob":"**/.git/**","root":""},{"glob":"**/.gitattributes","root":""},{"glob":"**/.gitattributes/**","root":""},{"glob":"**/.gitignore","root":""},{"glob":"**/.gitignore/**","root":""},{"glob":".github/integrations.json","root":""},{"glob":".github/integrations.json/**","root":""},{"glob":"**/.pnp.{js,cjs}","root":""},{"glob":"**/.pnp.{js,cjs}/**","root":""},{"glob":"**/.prettierignore","root":""},{"glob":"**/.prettierignore/**","root":""},{"glob":"**/.yarn","root":""},{"glob":"**/.yarn/**","root":""},{"glob":"**/*.{png,jpg,pdf,svg}","root":""},{"glob":"**/*.{png,jpg,pdf,svg}/**","root":""},{"glob":"**/*.cpuprofile","root":""},{"glob":"**/*.cpuprofile/**","root":""},{"glob":"**/*.heapprofile","root":""},{"glob":"**/*.heapprofile/**","root":""},{"glob":"**/emoji*.txt","root":""},{"glob":"**/emoji*.txt/**","root":""},{"glob":"**/.docusaurus/**"},{"glob":"**/.gitignore"},{"glob":"**/.gitignore/**"},{"glob":"**/.vscode/**"},{"glob":"**/{cspell.*,cSpell.*,.cspell.*,cspell.config.*}"},{"glob":"**/{cspell.*,cSpell.*,.cspell.*,cspell.config.*}/**"},{"glob":"**/*.schema.json"},{"glob":"**/*.schema.json/**"},{"glob":"**/*.snap"},{"glob":"**/*.snap/**"},{"glob":"**/*.trie"},{"glob":"**/*.trie/**"},{"glob":"**/coverage/**"},{"glob":"**/dist/**"},{"glob":"**/jest.config.js"},{"glob":"**/jest.config.js/**"},{"glob":"**/node_modules/**"},{"glob":"**/tsconfig.json"},{"glob":"**/tsconfig.json/**"},{"glob":"tools/*/lib/**","root":""},{"glob":"cspell-dict.txt","root":""},{"glob":"cspell-dict.txt/**","root":""},{"glob":"cspell-ignore-words.txt","root":""},{"glob":"cspell-ignore-words.txt/**","root":""},{"glob":"docs/docsV2/**","root":""},{"glob":"docs/types/cspell-types","root":""},{"glob":"docs/types/cspell-types/**","root":""},{"glob":".cspell","root":""},{"glob":".cspell/**","root":""},{"glob":"**/cspell*.{json,yaml}","root":""},{"glob":"**/cspell*.{json,yaml}/**","root":""},{"glob":"integration-tests/config/config.json","root":""},{"glob":"integration-tests/config/config.json/**","root":""},{"glob":"integration-tests/config/repositories/**","root":""},{"glob":"integration-tests/perf/**","root":""},{"glob":"integration-tests/repositories/**","root":""},{"glob":"integration-tests/snapshots/**","root":""},{"glob":"**/lcov.info","root":""},{"glob":"**/lcov.info/**","root":""},{"glob":"**/lib-bundled","root":""},{"glob":"**/lib-bundled/**","root":""},{"glob":"**/package.json","root":""},{"glob":"**/package.json/**","root":""},{"glob":"**/*-lock.{json,yaml}","root":""},{"glob":"**/*-lock.{json,yaml}/**","root":""},{"glob":"packages/*/fixtures/**","root":""},{"glob":"packages/*/Samples/**","root":""},{"glob":"packages/*/samples/**","root":""},{"glob":"packages/Samples/**","root":""},{"glob":"packages/cspell-lib/fixtures/**","root":""},{"glob":"**/temp","root":""},{"glob":"**/temp/**","root":""},{"glob":"test-fixtures/**","root":""},{"glob":"test-packages/*/test-cspell-eslint-plugin*/**","root":""},{"glob":"test-packages/examples/example-cspell-lib-single-doc/samples/**","root":""},{"glob":"test-packages/*/test-cspell-tools/src/*.txt","root":""},{"glob":"test-packages/*/test-cspell-tools/src/*.txt/**","root":""}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/CHANGELOG.md"},{"glob":"**/CHANGELOG.md/**"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.snap","root":"packages/cspell"},{"glob":"**/*.snap/**","root":"packages/cspell"},{"glob":"**/node_modules","root":"packages/cspell"},{"glob":"**/node_modules/**","root":"packages/cspell"},{"glob":"**/package-lock.json","root":"packages/cspell"},{"glob":"**/package-lock.json/**","root":"packages/cspell"},{"glob":"coverage/**","root":"packages/cspell"},{"glob":"dist/**","root":"packages/cspell"},{"glob":"dist.*/**","root":"packages/cspell"},{"glob":"temp/**","root":"packages/cspell"},{"glob":"**/CHANGELOG.md","root":"packages/cspell"},{"glob":"**/CHANGELOG.md/**","root":"packages/cspell"},{"glob":"**/package.json","root":"packages/cspell"},{"glob":"**/package.json/**","root":"packages/cspell"},{"glob":"**/.cspell.json","root":"packages/cspell"},{"glob":"**/.cspell.json/**","root":"packages/cspell"},{"glob":"**/cspell.json","root":"packages/cspell"},{"glob":"**/cspell.json/**","root":"packages/cspell"},{"glob":".vscode/**","root":"packages/cspell"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"dictionaries","root":"packages/hunspell-reader"},{"glob":"dictionaries/**","root":"packages/hunspell-reader"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/dict","root":"test-packages/cspell-tools/test-cspell-tools"},{"glob":"**/dict/**","root":"test-packages/cspell-tools/test-cspell-tools"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/node_modules","root":"test-packages"},{"glob":"**/node_modules/**","root":"test-packages"},{"glob":"**/CHANGELOG.md","root":"test-packages"},{"glob":"**/CHANGELOG.md/**","root":"test-packages"}]}, +{"options":{"root":"","dot":true,"nested":true,"mode":"exclude","cwd":""},"patterns":[{"glob":"**/*.svg","root":"website"},{"glob":"**/*.svg/**","root":"website"},{"glob":"build","root":"website"},{"glob":"build/**","root":"website"},{"glob":"**/cspell.*","root":"website"},{"glob":"**/cspell.*/**","root":"website"},{"glob":"**/auto_*.md","root":"website"},{"glob":"**/auto_*.md/**","root":"website"}]} +] diff --git a/test-packages/cspell-glob/test-cspell-glob/bin.mjs b/test-packages/cspell-glob/test-cspell-glob/bin.mjs index 89f09c85d63..8292401f916 100755 --- a/test-packages/cspell-glob/test-cspell-glob/bin.mjs +++ b/test-packages/cspell-glob/test-cspell-glob/bin.mjs @@ -8,11 +8,12 @@ import { run } from './dist/esm/index.mjs'; const __filename = fileURLToPath(import.meta.url); -const expected = basename(__filename); +const expected = '/' + basename(__filename); async function main() { assert(typeof run === 'function'); - assert(run(__filename) === expected); + const result = run(__filename); + assert(result === expected, `Expect "${result}" to equal "${expected}"`); console.log('done.'); } diff --git a/test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs b/test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs index 7fc7e47399f..ac0b7fcd240 100755 --- a/test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs +++ b/test-packages/cspell-glob/test-cspell-glob/bin.rollup.cjs @@ -4,11 +4,12 @@ const assert = require('node:assert'); const { basename } = require('node:path'); const { run } = require('./dist/rollup/cjs/index.cjs'); -const expected = basename(__filename); +const expected = '/' + basename(__filename); async function main() { assert(typeof run === 'function'); - assert(run(__filename) === expected); + const result = run(__filename); + assert(result === expected, `Expect "${result}" to equal "${expected}"`); console.log('done.'); } diff --git a/test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs b/test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs index 89f09c85d63..8292401f916 100755 --- a/test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs +++ b/test-packages/cspell-glob/test-cspell-glob/bin.rollup.mjs @@ -8,11 +8,12 @@ import { run } from './dist/esm/index.mjs'; const __filename = fileURLToPath(import.meta.url); -const expected = basename(__filename); +const expected = '/' + basename(__filename); async function main() { assert(typeof run === 'function'); - assert(run(__filename) === expected); + const result = run(__filename); + assert(result === expected, `Expect "${result}" to equal "${expected}"`); console.log('done.'); } diff --git a/test-packages/cspell-glob/test-cspell-glob/src/index.test.ts b/test-packages/cspell-glob/test-cspell-glob/src/index.test.ts index 422b76040d0..67f3c5c06bb 100644 --- a/test-packages/cspell-glob/test-cspell-glob/src/index.test.ts +++ b/test-packages/cspell-glob/test-cspell-glob/src/index.test.ts @@ -7,7 +7,7 @@ import { run } from './index.js'; describe('run', () => { test.each` glob | expected - ${__filename} | ${'src/' + basename(__filename)} + ${__filename} | ${'/' + basename(__filename)} ${'*.md'} | ${'*.md'} `('run', ({ glob, expected }) => { expect(run(glob)).toBe(expected);