diff --git a/packages/angular_devkit/core/BUILD.bazel b/packages/angular_devkit/core/BUILD.bazel index d7c0d766b565..78a56a278daa 100644 --- a/packages/angular_devkit/core/BUILD.bazel +++ b/packages/angular_devkit/core/BUILD.bazel @@ -34,9 +34,11 @@ ts_library( module_root = "src/index.d.ts", deps = [ "@npm//@types/node", + "@npm//@types/picomatch", "@npm//ajv", "@npm//ajv-formats", "@npm//jsonc-parser", + "@npm//picomatch", "@npm//rxjs", "@npm//source-map", # @node_module: typescript:es2015.proxy diff --git a/packages/angular_devkit/core/package.json b/packages/angular_devkit/core/package.json index 7c92a3a7a6e7..879cb06b02ff 100644 --- a/packages/angular_devkit/core/package.json +++ b/packages/angular_devkit/core/package.json @@ -28,6 +28,7 @@ "ajv-formats": "2.1.1", "ajv": "8.12.0", "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, diff --git a/packages/angular_devkit/core/src/virtual-fs/host/pattern.ts b/packages/angular_devkit/core/src/virtual-fs/host/pattern.ts index bcf74f1c87f9..a410e36c426e 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/pattern.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/pattern.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import { parse as parseGlob } from 'picomatch'; import { Path } from '../path'; import { ResolverHost } from './resolver'; @@ -17,28 +18,11 @@ export class PatternMatchingHost extends ResolverHos protected _patterns = new Map(); addPattern(pattern: string | string[], replacementFn: ReplacementFunction) { - // Simple GLOB pattern replacement. - const reString = - '^(' + - (Array.isArray(pattern) ? pattern : [pattern]) - .map( - (ex) => - '(' + - ex - .split(/[/\\]/g) - .map((f) => - f - .replace(/[-[\]{}()+?.^$|]/g, '\\$&') - .replace(/^\*\*/g, '(.+?)?') - .replace(/\*/g, '[^/\\\\]*'), - ) - .join('[/\\\\]') + - ')', - ) - .join('|') + - ')($|/|\\\\)'; - - this._patterns.set(new RegExp(reString), replacementFn); + const patterns = Array.isArray(pattern) ? pattern : [pattern]; + for (const glob of patterns) { + const { output } = parseGlob(glob); + this._patterns.set(new RegExp(`^${output}$`), replacementFn); + } } protected _resolve(path: Path) {