cspell-lib 10.0.1 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -95,6 +95,7 @@ export interface IConfigLoader {
95
95
  getStats(): Readonly<Record<string, Readonly<Record<string, number>>>>;
96
96
  readonly isTrusted: boolean;
97
97
  setIsTrusted(isTrusted: boolean): void;
98
+ isTrustedUrl(url: URL): boolean;
98
99
  }
99
100
  export declare const defaultExtensionsAll: string[];
100
101
  export declare class ConfigLoader implements IConfigLoader {
@@ -166,6 +167,7 @@ export declare class ConfigLoader implements IConfigLoader {
166
167
  private resolveFilename;
167
168
  get isTrusted(): boolean;
168
169
  setIsTrusted(isTrusted: boolean): void;
170
+ isTrustedUrl(url: URL): boolean;
169
171
  }
170
172
  declare class ConfigLoaderInternal extends ConfigLoader {
171
173
  constructor(vfs: VFileSystem);
@@ -176,7 +176,8 @@ export class ConfigLoader {
176
176
  async resolveDefaultConfig() {
177
177
  const r = await this.fileResolver.resolveFile(defaultConfigFileModuleRef, srcDirectory);
178
178
  const url = toFileURL(r.filename);
179
- this.cspellConfigFileReaderWriter.setTrustedUrls([new URL('../..', url)]);
179
+ const baseUrl = new URL('../..', url); // go up two directories to get out of the node_modules directory.
180
+ this.cspellConfigFileReaderWriter.setTrustedUrls([baseUrl]);
180
181
  return url;
181
182
  }
182
183
  importSettings(fileRef, pnpSettings, backReferences) {
@@ -250,6 +251,8 @@ export class ConfigLoader {
250
251
  }
251
252
  }
252
253
  async setupPnp(cfgFile, pnpSettings) {
254
+ if (!this.#isTrusted)
255
+ return;
253
256
  if (!pnpSettings?.usePnP || pnpSettings === defaultPnPSettings)
254
257
  return;
255
258
  if (cfgFile.url.protocol !== 'file:')
@@ -410,6 +413,14 @@ export class ConfigLoader {
410
413
  this.configSearch = new ConfigSearch(searchPlaces, isTrusted ? trustedSearch : unTrustedSearch, this.fs);
411
414
  this.cspellConfigFileReaderWriter.setUntrustedExtensions(isTrusted ? [] : defaultJsExtensions);
412
415
  }
416
+ isTrustedUrl(url) {
417
+ if (!this.#isTrusted) {
418
+ const ext = path.extname(url.pathname).toLowerCase();
419
+ if (defaultJsExtensions.includes(ext))
420
+ return false;
421
+ }
422
+ return this.cspellConfigFileReaderWriter.isTrusted(url);
423
+ }
413
424
  async #extractStopSearchAtURLs(options) {
414
425
  if (!options?.stopSearchAt)
415
426
  return undefined;
@@ -106,7 +106,8 @@ export class DocumentValidator {
106
106
  this.addPossibleError(`Missing substitutions: ${sub.missing.join(', ')}`);
107
107
  }
108
108
  const validateOptions = { ...settingsToValidateOptions(finalSettings), transformer: sub.transformer };
109
- const includeRanges = calcTextInclusionRanges(this._document.text, validateOptions);
109
+ const rangeTransformer = finalSettings.substitutions?.length ? sub.transformer : undefined;
110
+ const includeRanges = calcTextInclusionRanges(this._document.text, validateOptions, rangeTransformer);
110
111
  const segmenter = createMappedTextSegmenter(includeRanges);
111
112
  const textValidator = textValidatorFactory(dict, validateOptions);
112
113
  recFinalizeTime();
@@ -143,7 +144,8 @@ export class DocumentValidator {
143
144
  this.addPossibleError(`Missing substitutions: ${sub.missing.join(', ')}`);
144
145
  }
145
146
  const validateOptions = { ...settingsToValidateOptions(finalSettings), transformer: sub.transformer };
146
- const includeRanges = calcTextInclusionRanges(this._document.text, validateOptions);
147
+ const rangeTransformer = finalSettings.substitutions?.length ? sub.transformer : undefined;
148
+ const includeRanges = calcTextInclusionRanges(this._document.text, validateOptions, rangeTransformer);
147
149
  const segmenter = createMappedTextSegmenter(includeRanges);
148
150
  const textValidator = textValidatorFactory(dict, validateOptions);
149
151
  this._preparations = {
@@ -1,5 +1,6 @@
1
1
  import type { SpellingDictionary } from 'cspell-dictionary';
2
2
  import type { ValidationResult } from '../Models/ValidationResult.js';
3
+ import type { SubstitutionTransformer } from '../Transform/index.js';
3
4
  import * as TextRange from '../Transform/index.js';
4
5
  import type { IncludeExcludeOptions, LineSegment, ValidationOptions } from './ValidationTypes.js';
5
6
  /**
@@ -7,7 +8,7 @@ import type { IncludeExcludeOptions, LineSegment, ValidationOptions } from './Va
7
8
  * @deprecation Use spellCheckDocument
8
9
  */
9
10
  export declare function validateText(text: string, dict: SpellingDictionary, options: ValidationOptions): Iterable<ValidationResult>;
10
- export declare function calcTextInclusionRanges(text: string, options: IncludeExcludeOptions): TextRange.MatchRange[];
11
+ export declare function calcTextInclusionRanges(text: string, options: IncludeExcludeOptions, transformer?: SubstitutionTransformer): TextRange.MatchRange[];
11
12
  /**
12
13
  * Returns a mapper function that will segment a TextOffset based upon the includeRanges.
13
14
  * This function is optimized for forward scanning. It will perform poorly for randomly ordered offsets.
@@ -23,13 +23,22 @@ export function validateText(text, dict, options) {
23
23
  }), opTake(maxNumberOfProblems));
24
24
  return iter;
25
25
  }
26
- export function calcTextInclusionRanges(text, options) {
26
+ export function calcTextInclusionRanges(text, options, transformer) {
27
27
  const { ignoreRegExpList = [], includeRegExpList = [] } = options;
28
28
  const filteredIncludeList = includeRegExpList.filter((a) => !!a);
29
29
  const finalIncludeList = filteredIncludeList.length ? filteredIncludeList : [/.*/gim];
30
- const includeRanges = TextRange.excludeRanges(TextRange.findMatchingRangesForPatterns(finalIncludeList, text), TextRange.findMatchingRangesForPatterns(ignoreRegExpList, text));
30
+ const excludeRanges = TextRange.findMatchingRangesForPatterns(ignoreRegExpList, text).filter((range) => !isFullySubstitutedRange(text, range, transformer));
31
+ const includeRanges = TextRange.excludeRanges(TextRange.findMatchingRangesForPatterns(finalIncludeList, text), excludeRanges);
31
32
  return includeRanges;
32
33
  }
34
+ function isFullySubstitutedRange(text, range, transformer) {
35
+ if (!transformer)
36
+ return false;
37
+ const source = text.slice(range.startPos, range.endPos);
38
+ const transformed = transformer.transform(source);
39
+ // One source-map segment means a single substitution consumed the entire ignored range.
40
+ return transformed.text !== source && transformed.map?.length === 2 && transformed.map[0] === source.length;
41
+ }
33
42
  function mapLineToLineSegments(includeRanges) {
34
43
  const mapAgainstRanges = mapLineSegmentAgainstRangesFactory(includeRanges);
35
44
  return (line) => {
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public",
5
5
  "provenance": true
6
6
  },
7
- "version": "10.0.1",
7
+ "version": "10.1.1",
8
8
  "description": "A library of useful functions used across various cspell tools.",
9
9
  "type": "module",
10
10
  "sideEffects": false,
@@ -75,22 +75,22 @@
75
75
  },
76
76
  "homepage": "https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell-lib#readme",
77
77
  "dependencies": {
78
- "@cspell/cspell-bundled-dicts": "10.0.1",
79
- "@cspell/cspell-performance-monitor": "10.0.1",
80
- "@cspell/cspell-pipe": "10.0.1",
81
- "@cspell/cspell-resolver": "10.0.1",
82
- "@cspell/cspell-types": "10.0.1",
83
- "@cspell/dynamic-import": "10.0.1",
84
- "@cspell/filetypes": "10.0.1",
85
- "@cspell/rpc": "10.0.1",
86
- "@cspell/strong-weak-map": "10.0.1",
87
- "@cspell/url": "10.0.1",
88
- "cspell-config-lib": "10.0.1",
89
- "cspell-dictionary": "10.0.1",
90
- "cspell-glob": "10.0.1",
91
- "cspell-grammar": "10.0.1",
92
- "cspell-io": "10.0.1",
93
- "cspell-trie-lib": "10.0.1",
78
+ "@cspell/cspell-bundled-dicts": "10.1.1",
79
+ "@cspell/cspell-performance-monitor": "10.1.1",
80
+ "@cspell/cspell-pipe": "10.1.1",
81
+ "@cspell/cspell-resolver": "10.1.1",
82
+ "@cspell/cspell-types": "10.1.1",
83
+ "@cspell/dynamic-import": "10.1.1",
84
+ "@cspell/filetypes": "10.1.1",
85
+ "@cspell/rpc": "10.1.1",
86
+ "@cspell/strong-weak-map": "10.1.1",
87
+ "@cspell/url": "10.1.1",
88
+ "cspell-config-lib": "10.1.1",
89
+ "cspell-dictionary": "10.1.1",
90
+ "cspell-glob": "10.1.1",
91
+ "cspell-grammar": "10.1.1",
92
+ "cspell-io": "10.1.1",
93
+ "cspell-trie-lib": "10.1.1",
94
94
  "env-paths": "^4.0.0",
95
95
  "gensequence": "^8.0.8",
96
96
  "import-fresh": "^4.0.0",
@@ -103,24 +103,24 @@
103
103
  "node": ">=22.18.0"
104
104
  },
105
105
  "devDependencies": {
106
- "@cspell/cspell-tools": "10.0.1",
107
- "@cspell/dict-cpp": "^7.0.2",
106
+ "@cspell/cspell-tools": "10.1.1",
107
+ "@cspell/dict-cpp": "^7.1.0",
108
108
  "@cspell/dict-csharp": "^4.0.8",
109
- "@cspell/dict-css": "^4.1.1",
110
- "@cspell/dict-en_us": "^4.4.33",
109
+ "@cspell/dict-css": "^4.1.2",
110
+ "@cspell/dict-en_us": "^4.4.36",
111
111
  "@cspell/dict-fa-ir": "^4.0.5",
112
112
  "@cspell/dict-fr-fr": "^2.3.2",
113
- "@cspell/dict-html": "^4.0.15",
113
+ "@cspell/dict-html": "^4.0.16",
114
114
  "@cspell/dict-nl-nl": "^2.4.2",
115
- "@cspell/dict-python": "^4.2.26",
115
+ "@cspell/dict-python": "^4.4.0",
116
116
  "@cspell/dictionary-bundler-plugin": "",
117
117
  "@types/configstore": "^6.0.2",
118
118
  "comment-json": "^5.0.0",
119
119
  "configstore": "^8.0.0",
120
120
  "cspell-dict-nl-nl": "^1.1.2",
121
121
  "leaked-handles": "^5.2.0",
122
- "lorem-ipsum": "^2.0.10",
122
+ "lorem-ipsum": "^3.0.0",
123
123
  "perf-insight": "^2.0.1"
124
124
  },
125
- "gitHead": "0f43abf29e5da0ecbcb08214055cdc1e3267c3ea"
125
+ "gitHead": "bc3bc22aa1aa1b3073768f2ac9cf0d9a06f65177"
126
126
  }