@pattern-algebra/core 0.0.0
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.
- package/README.md +571 -0
- package/dist/automaton/complement.d.ts +20 -0
- package/dist/automaton/complement.d.ts.map +1 -0
- package/dist/automaton/complement.js +36 -0
- package/dist/automaton/complement.js.map +1 -0
- package/dist/automaton/complement.test.d.ts +2 -0
- package/dist/automaton/complement.test.d.ts.map +1 -0
- package/dist/automaton/complement.test.js +114 -0
- package/dist/automaton/complement.test.js.map +1 -0
- package/dist/automaton/determinize.d.ts +41 -0
- package/dist/automaton/determinize.d.ts.map +1 -0
- package/dist/automaton/determinize.js +310 -0
- package/dist/automaton/determinize.js.map +1 -0
- package/dist/automaton/determinize.test.d.ts +2 -0
- package/dist/automaton/determinize.test.d.ts.map +1 -0
- package/dist/automaton/determinize.test.js +134 -0
- package/dist/automaton/determinize.test.js.map +1 -0
- package/dist/automaton/emptiness.d.ts +41 -0
- package/dist/automaton/emptiness.d.ts.map +1 -0
- package/dist/automaton/emptiness.js +262 -0
- package/dist/automaton/emptiness.js.map +1 -0
- package/dist/automaton/emptiness.test.d.ts +2 -0
- package/dist/automaton/emptiness.test.d.ts.map +1 -0
- package/dist/automaton/emptiness.test.js +154 -0
- package/dist/automaton/emptiness.test.js.map +1 -0
- package/dist/automaton/index.d.ts +10 -0
- package/dist/automaton/index.d.ts.map +1 -0
- package/dist/automaton/index.js +11 -0
- package/dist/automaton/index.js.map +1 -0
- package/dist/automaton/intersect.d.ts +35 -0
- package/dist/automaton/intersect.d.ts.map +1 -0
- package/dist/automaton/intersect.js +302 -0
- package/dist/automaton/intersect.js.map +1 -0
- package/dist/automaton/pattern-algebra.d.ts +62 -0
- package/dist/automaton/pattern-algebra.d.ts.map +1 -0
- package/dist/automaton/pattern-algebra.js +309 -0
- package/dist/automaton/pattern-algebra.js.map +1 -0
- package/dist/automaton/pattern-algebra.test.d.ts +2 -0
- package/dist/automaton/pattern-algebra.test.d.ts.map +1 -0
- package/dist/automaton/pattern-algebra.test.js +223 -0
- package/dist/automaton/pattern-algebra.test.js.map +1 -0
- package/dist/compile/automaton-builder.d.ts +47 -0
- package/dist/compile/automaton-builder.d.ts.map +1 -0
- package/dist/compile/automaton-builder.js +211 -0
- package/dist/compile/automaton-builder.js.map +1 -0
- package/dist/compile/compiler.d.ts +32 -0
- package/dist/compile/compiler.d.ts.map +1 -0
- package/dist/compile/compiler.js +47 -0
- package/dist/compile/compiler.js.map +1 -0
- package/dist/compile/index.d.ts +8 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +8 -0
- package/dist/compile/index.js.map +1 -0
- package/dist/compile/quick-reject.d.ts +28 -0
- package/dist/compile/quick-reject.d.ts.map +1 -0
- package/dist/compile/quick-reject.js +147 -0
- package/dist/compile/quick-reject.js.map +1 -0
- package/dist/containment/analysis.d.ts +60 -0
- package/dist/containment/analysis.d.ts.map +1 -0
- package/dist/containment/analysis.js +378 -0
- package/dist/containment/analysis.js.map +1 -0
- package/dist/containment/containment.d.ts +23 -0
- package/dist/containment/containment.d.ts.map +1 -0
- package/dist/containment/containment.js +681 -0
- package/dist/containment/containment.js.map +1 -0
- package/dist/containment/containment.test.d.ts +2 -0
- package/dist/containment/containment.test.d.ts.map +1 -0
- package/dist/containment/containment.test.js +209 -0
- package/dist/containment/containment.test.js.map +1 -0
- package/dist/containment/index.d.ts +7 -0
- package/dist/containment/index.d.ts.map +1 -0
- package/dist/containment/index.js +7 -0
- package/dist/containment/index.js.map +1 -0
- package/dist/core-alpha.d.ts +1253 -0
- package/dist/core-beta.d.ts +1253 -0
- package/dist/core-public.d.ts +1253 -0
- package/dist/core-unstripped.d.ts +1253 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/match/index.d.ts +8 -0
- package/dist/match/index.d.ts.map +1 -0
- package/dist/match/index.js +8 -0
- package/dist/match/index.js.map +1 -0
- package/dist/match/matcher.d.ts +40 -0
- package/dist/match/matcher.d.ts.map +1 -0
- package/dist/match/matcher.js +256 -0
- package/dist/match/matcher.js.map +1 -0
- package/dist/match/matcher.test.d.ts +2 -0
- package/dist/match/matcher.test.d.ts.map +1 -0
- package/dist/match/matcher.test.js +185 -0
- package/dist/match/matcher.test.js.map +1 -0
- package/dist/match/path-utils.d.ts +132 -0
- package/dist/match/path-utils.d.ts.map +1 -0
- package/dist/match/path-utils.js +223 -0
- package/dist/match/path-utils.js.map +1 -0
- package/dist/match/path-utils.test.d.ts +2 -0
- package/dist/match/path-utils.test.d.ts.map +1 -0
- package/dist/match/path-utils.test.js +193 -0
- package/dist/match/path-utils.test.js.map +1 -0
- package/dist/match/segment-matcher.d.ts +25 -0
- package/dist/match/segment-matcher.d.ts.map +1 -0
- package/dist/match/segment-matcher.js +267 -0
- package/dist/match/segment-matcher.js.map +1 -0
- package/dist/parse/brace-expansion.d.ts +34 -0
- package/dist/parse/brace-expansion.d.ts.map +1 -0
- package/dist/parse/brace-expansion.js +294 -0
- package/dist/parse/brace-expansion.js.map +1 -0
- package/dist/parse/brace-expansion.test.d.ts +2 -0
- package/dist/parse/brace-expansion.test.d.ts.map +1 -0
- package/dist/parse/brace-expansion.test.js +105 -0
- package/dist/parse/brace-expansion.test.js.map +1 -0
- package/dist/parse/index.d.ts +8 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +8 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/parser.d.ts +15 -0
- package/dist/parse/parser.d.ts.map +1 -0
- package/dist/parse/parser.js +526 -0
- package/dist/parse/parser.js.map +1 -0
- package/dist/parse/parser.test.d.ts +2 -0
- package/dist/parse/parser.test.d.ts.map +1 -0
- package/dist/parse/parser.test.js +266 -0
- package/dist/parse/parser.test.js.map +1 -0
- package/dist/parse/validator.d.ts +30 -0
- package/dist/parse/validator.d.ts.map +1 -0
- package/dist/parse/validator.js +115 -0
- package/dist/parse/validator.js.map +1 -0
- package/dist/parse/validator.test.d.ts +2 -0
- package/dist/parse/validator.test.d.ts.map +1 -0
- package/dist/parse/validator.test.js +45 -0
- package/dist/parse/validator.test.js.map +1 -0
- package/dist/types/ast.d.ts +158 -0
- package/dist/types/ast.d.ts.map +1 -0
- package/dist/types/ast.js +2 -0
- package/dist/types/ast.js.map +1 -0
- package/dist/types/automaton.d.ts +150 -0
- package/dist/types/automaton.d.ts.map +1 -0
- package/dist/types/automaton.js +2 -0
- package/dist/types/automaton.js.map +1 -0
- package/dist/types/containment.d.ts +257 -0
- package/dist/types/containment.d.ts.map +1 -0
- package/dist/types/containment.js +5 -0
- package/dist/types/containment.js.map +1 -0
- package/dist/types/errors.d.ts +37 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +24 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +48 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Pattern Language Library
|
|
3
|
+
*
|
|
4
|
+
* A library for parsing, compiling, matching, and comparing path patterns
|
|
5
|
+
* (globs and restricted regexes). Designed for downstream use by policy systems.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Library version.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export declare const version = "0.0.0";
|
|
14
|
+
export type { PathPattern, PatternNode, SegmentSequence, Alternation, Segment, LiteralSegment, WildcardSegment, WildcardPart, GlobstarSegment, CharClassSegment, CharRange, CompositeSegment, SegmentPart, CompiledPattern, QuickRejectFilter, SegmentAutomaton, AutomatonState, AutomatonTransition, LiteralTransition, WildcardTransition, GlobstarTransition, EpsilonTransition, PatternRelationship, ContainmentFailureReason, WitnessPath, WitnessCategory, ContainmentExplanation, SegmentComparisonEntry, SegmentConstraint, SegmentConstraintType, StructuralDifferences, DepthComparison, PrefixComparison, SuffixComparison, AnchoringComparison, ContainmentResult, PatternDescription, PatternAnalysis, PatternErrorCode, PatternError, } from './types';
|
|
15
|
+
export { AutomatonLimitError } from './types';
|
|
16
|
+
export { parsePattern } from './parse';
|
|
17
|
+
export { validatePattern, isValidPattern } from './parse';
|
|
18
|
+
export { expandBraces, countBraceExpansions } from './parse';
|
|
19
|
+
export { compilePattern } from './compile';
|
|
20
|
+
export { buildAutomaton, getMinSegments, getMaxSegments, isUnbounded } from './compile';
|
|
21
|
+
export { buildQuickRejectFilter, applyQuickReject } from './compile';
|
|
22
|
+
export { matchPath, matchPathWithContext, matchPathDirect } from './match';
|
|
23
|
+
export { matchSegment, segmentToRegex } from './match';
|
|
24
|
+
export { normalizePath, pathToSegments, segmentsToPath, isAbsolutePath, getExtension, getBasename, getDirname, isAncestorPath, commonPrefix, type PathContext, } from './match';
|
|
25
|
+
export { determinize, DEFAULT_MAX_DFA_STATES, type DeterminizeOptions } from './automaton';
|
|
26
|
+
export { complement } from './automaton';
|
|
27
|
+
export { intersect, union } from './automaton';
|
|
28
|
+
export { isEmpty, findWitness, countPaths } from './automaton';
|
|
29
|
+
export { patternIntersect, patternUnion, patternComplement, patternDifference } from './automaton';
|
|
30
|
+
export { checkContainment } from './containment';
|
|
31
|
+
export { analyzePatterns, areEquivalent, hasOverlap, areDisjoint, summarizeRelationship } from './containment';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO,UAAU,CAAA;AAM9B,YAAY,EAEV,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,WAAW,EAEX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAEjB,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAEf,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAM5D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAMpE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,SAAS,CAAA;AAMhB,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAM9D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAMlG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Pattern Language Library
|
|
3
|
+
*
|
|
4
|
+
* A library for parsing, compiling, matching, and comparing path patterns
|
|
5
|
+
* (globs and restricted regexes). Designed for downstream use by policy systems.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Library version.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export const version = '0.0.0';
|
|
14
|
+
export { AutomatonLimitError } from './types';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Parsing
|
|
17
|
+
// =============================================================================
|
|
18
|
+
export { parsePattern } from './parse';
|
|
19
|
+
export { validatePattern, isValidPattern } from './parse';
|
|
20
|
+
export { expandBraces, countBraceExpansions } from './parse';
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Compilation
|
|
23
|
+
// =============================================================================
|
|
24
|
+
export { compilePattern } from './compile';
|
|
25
|
+
export { buildAutomaton, getMinSegments, getMaxSegments, isUnbounded } from './compile';
|
|
26
|
+
export { buildQuickRejectFilter, applyQuickReject } from './compile';
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Matching
|
|
29
|
+
// =============================================================================
|
|
30
|
+
export { matchPath, matchPathWithContext, matchPathDirect } from './match';
|
|
31
|
+
export { matchSegment, segmentToRegex } from './match';
|
|
32
|
+
export { normalizePath, pathToSegments, segmentsToPath, isAbsolutePath, getExtension, getBasename, getDirname, isAncestorPath, commonPrefix, } from './match';
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Automaton Operations
|
|
35
|
+
// =============================================================================
|
|
36
|
+
export { determinize, DEFAULT_MAX_DFA_STATES } from './automaton';
|
|
37
|
+
export { complement } from './automaton';
|
|
38
|
+
export { intersect, union } from './automaton';
|
|
39
|
+
export { isEmpty, findWitness, countPaths } from './automaton';
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// Pattern Algebra (Set Operations)
|
|
42
|
+
// =============================================================================
|
|
43
|
+
export { patternIntersect, patternUnion, patternComplement, patternDifference } from './automaton';
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Containment Checking
|
|
46
|
+
// =============================================================================
|
|
47
|
+
export { checkContainment } from './containment';
|
|
48
|
+
export { analyzePatterns, areEquivalent, hasOverlap, areDisjoint, summarizeRelationship } from './containment';
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA;AAoD9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE7C,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE5D,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAEpE,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,GAEb,MAAM,SAAS,CAAA;AAEhB,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAA2B,MAAM,aAAa,CAAA;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE9D,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAElG,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching utilities.
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export { normalizePath, pathToSegments, segmentsToPath, isAbsolutePath, getExtension, getBasename, getDirname, isAncestorPath, commonPrefix, type PathContext, } from './path-utils';
|
|
6
|
+
export { matchPath, matchPathWithContext, matchPathDirect } from './matcher';
|
|
7
|
+
export { matchSegment, segmentToRegex } from './segment-matcher';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/match/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching utilities.
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export { normalizePath, pathToSegments, segmentsToPath, isAbsolutePath, getExtension, getBasename, getDirname, isAncestorPath, commonPrefix, } from './path-utils';
|
|
6
|
+
export { matchPath, matchPathWithContext, matchPathDirect } from './matcher';
|
|
7
|
+
export { matchSegment, segmentToRegex } from './segment-matcher';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/match/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,GAEb,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching - matches paths against compiled patterns.
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import type { CompiledPattern, PathPattern } from '../types';
|
|
6
|
+
import { type PathContext } from './path-utils';
|
|
7
|
+
/**
|
|
8
|
+
* Test if a path matches a compiled pattern.
|
|
9
|
+
*
|
|
10
|
+
* @param path - Absolute, normalized path (e.g., "/home/user/dev/foo.ts")
|
|
11
|
+
* @param pattern - Compiled pattern
|
|
12
|
+
* @returns true if path matches
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export declare function matchPath(path: string, pattern: CompiledPattern): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Match a path with context (for ~ expansion and relative paths).
|
|
19
|
+
*
|
|
20
|
+
* @param path - Path to match (may be relative or contain ~)
|
|
21
|
+
* @param pattern - Compiled pattern
|
|
22
|
+
* @param context - Path context for normalization
|
|
23
|
+
* @returns true if normalized path matches
|
|
24
|
+
*
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export declare function matchPathWithContext(path: string, pattern: CompiledPattern, context: PathContext): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Match a path against a pattern AST directly (without compilation).
|
|
30
|
+
*
|
|
31
|
+
* This is less efficient than using compiled patterns but useful for one-off matching.
|
|
32
|
+
*
|
|
33
|
+
* @param path - Normalized path
|
|
34
|
+
* @param pattern - Pattern AST
|
|
35
|
+
* @returns true if path matches
|
|
36
|
+
*
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
export declare function matchPathDirect(path: string, pattern: PathPattern): boolean;
|
|
40
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/match/matcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAyC,WAAW,EAAE,MAAM,UAAU,CAAA;AACnG,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAI9E;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAMzE;AAyBD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAG1G;AA8JD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAG3E"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching - matches paths against compiled patterns.
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import { pathToSegments, normalizePath } from './path-utils';
|
|
6
|
+
import { applyQuickReject } from '../compile/quick-reject';
|
|
7
|
+
import { matchSegment } from './segment-matcher';
|
|
8
|
+
/**
|
|
9
|
+
* Test if a path matches a compiled pattern.
|
|
10
|
+
*
|
|
11
|
+
* @param path - Absolute, normalized path (e.g., "/home/user/dev/foo.ts")
|
|
12
|
+
* @param pattern - Compiled pattern
|
|
13
|
+
* @returns true if path matches
|
|
14
|
+
*
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export function matchPath(path, pattern) {
|
|
18
|
+
// Match against the underlying pattern (ignoring negation for now)
|
|
19
|
+
const matches = matchPathUnderlying(path, pattern);
|
|
20
|
+
// Apply negation
|
|
21
|
+
return pattern.ast.isNegation ? !matches : matches;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Match against the underlying pattern (without negation).
|
|
25
|
+
*/
|
|
26
|
+
function matchPathUnderlying(path, pattern) {
|
|
27
|
+
// Quick-reject filter
|
|
28
|
+
if (!applyQuickReject(path, pattern.quickReject)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// Split into segments
|
|
32
|
+
const segments = pathToSegments(path);
|
|
33
|
+
// Check segment count bounds
|
|
34
|
+
if (segments.length < pattern.minSegments) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (pattern.maxSegments !== undefined && segments.length > pattern.maxSegments) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return simulateNFA(pattern.automaton, segments);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Match a path with context (for ~ expansion and relative paths).
|
|
44
|
+
*
|
|
45
|
+
* @param path - Path to match (may be relative or contain ~)
|
|
46
|
+
* @param pattern - Compiled pattern
|
|
47
|
+
* @param context - Path context for normalization
|
|
48
|
+
* @returns true if normalized path matches
|
|
49
|
+
*
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export function matchPathWithContext(path, pattern, context) {
|
|
53
|
+
const normalized = normalizePath(path, context);
|
|
54
|
+
return matchPath(normalized, pattern);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Simulate NFA on path segments.
|
|
58
|
+
*
|
|
59
|
+
* Uses set-based simulation to handle non-determinism.
|
|
60
|
+
* For deterministic automata, prefers literal transitions over wildcards
|
|
61
|
+
* to correctly handle complement operations.
|
|
62
|
+
*/
|
|
63
|
+
function simulateNFA(automaton, segments) {
|
|
64
|
+
// Start with epsilon closure of initial state
|
|
65
|
+
let currentStates = epsilonClosure(automaton, new Set([automaton.initialState]));
|
|
66
|
+
// Process each segment
|
|
67
|
+
for (const segment of segments) {
|
|
68
|
+
const nextStates = new Set();
|
|
69
|
+
for (const stateId of currentStates) {
|
|
70
|
+
const state = automaton.states[stateId];
|
|
71
|
+
// For DFAs (used in complement), prefer literal transitions over wildcards
|
|
72
|
+
// This ensures complement works correctly when we have catch-all wildcards
|
|
73
|
+
if (automaton.isDeterministic) {
|
|
74
|
+
const target = getDeterministicTarget(state.transitions, segment);
|
|
75
|
+
if (target !== null) {
|
|
76
|
+
nextStates.add(target);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// NFA: explore all matching transitions
|
|
81
|
+
for (const transition of state.transitions) {
|
|
82
|
+
if (matchTransition(transition, segment)) {
|
|
83
|
+
const target = getTransitionTarget(transition, segment);
|
|
84
|
+
if (target !== null) {
|
|
85
|
+
nextStates.add(target);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Compute epsilon closure of next states
|
|
92
|
+
currentStates = epsilonClosure(automaton, nextStates);
|
|
93
|
+
if (currentStates.size === 0) {
|
|
94
|
+
return false; // No valid states - no match possible
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Check if any current state is accepting
|
|
98
|
+
for (const stateId of currentStates) {
|
|
99
|
+
if (automaton.states[stateId].accepting) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the deterministic target state for a segment.
|
|
107
|
+
* Prefers literal matches over wildcard matches.
|
|
108
|
+
*/
|
|
109
|
+
function getDeterministicTarget(transitions, segment) {
|
|
110
|
+
// First, try literal match (highest priority)
|
|
111
|
+
for (const transition of transitions) {
|
|
112
|
+
if (transition.type === 'literal' && transition.segment === segment) {
|
|
113
|
+
return transition.target;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Then, try wildcard match
|
|
117
|
+
for (const transition of transitions) {
|
|
118
|
+
if (transition.type === 'wildcard' && transition.pattern.test(segment)) {
|
|
119
|
+
return transition.target;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Then, try globstar
|
|
123
|
+
for (const transition of transitions) {
|
|
124
|
+
if (transition.type === 'globstar') {
|
|
125
|
+
return transition.selfLoop;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Compute epsilon closure of a set of states.
|
|
132
|
+
*
|
|
133
|
+
* Includes all states reachable via epsilon transitions and globstar "exit" transitions.
|
|
134
|
+
*/
|
|
135
|
+
function epsilonClosure(automaton, states) {
|
|
136
|
+
const closure = new Set(states);
|
|
137
|
+
const worklist = [...states];
|
|
138
|
+
while (worklist.length > 0) {
|
|
139
|
+
const stateId = worklist.pop();
|
|
140
|
+
const state = automaton.states[stateId];
|
|
141
|
+
for (const transition of state.transitions) {
|
|
142
|
+
if (transition.type === 'epsilon') {
|
|
143
|
+
if (!closure.has(transition.target)) {
|
|
144
|
+
closure.add(transition.target);
|
|
145
|
+
worklist.push(transition.target);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (transition.type === 'globstar') {
|
|
149
|
+
// Globstar can exit without consuming (epsilon to exit state)
|
|
150
|
+
if (!closure.has(transition.exit)) {
|
|
151
|
+
closure.add(transition.exit);
|
|
152
|
+
worklist.push(transition.exit);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return closure;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a transition matches a segment.
|
|
161
|
+
*/
|
|
162
|
+
function matchTransition(transition, segment) {
|
|
163
|
+
switch (transition.type) {
|
|
164
|
+
case 'literal':
|
|
165
|
+
return transition.segment === segment;
|
|
166
|
+
case 'wildcard':
|
|
167
|
+
return transition.pattern.test(segment);
|
|
168
|
+
case 'globstar':
|
|
169
|
+
// Globstar always matches (can consume any segment)
|
|
170
|
+
return true;
|
|
171
|
+
case 'epsilon':
|
|
172
|
+
// Epsilon transitions don't consume input
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get the target state for a transition after consuming a segment.
|
|
178
|
+
*/
|
|
179
|
+
function getTransitionTarget(transition, _segment) {
|
|
180
|
+
switch (transition.type) {
|
|
181
|
+
case 'literal':
|
|
182
|
+
case 'wildcard':
|
|
183
|
+
return transition.target;
|
|
184
|
+
case 'globstar':
|
|
185
|
+
// Globstar stays in self-loop when consuming
|
|
186
|
+
return transition.selfLoop;
|
|
187
|
+
case 'epsilon':
|
|
188
|
+
return null; // Epsilon doesn't consume
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Match a path against a pattern AST directly (without compilation).
|
|
193
|
+
*
|
|
194
|
+
* This is less efficient than using compiled patterns but useful for one-off matching.
|
|
195
|
+
*
|
|
196
|
+
* @param path - Normalized path
|
|
197
|
+
* @param pattern - Pattern AST
|
|
198
|
+
* @returns true if path matches
|
|
199
|
+
*
|
|
200
|
+
* @public
|
|
201
|
+
*/
|
|
202
|
+
export function matchPathDirect(path, pattern) {
|
|
203
|
+
const segments = pathToSegments(path);
|
|
204
|
+
return matchPatternNode(segments, 0, pattern.root) !== null;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Recursive pattern matching on segments.
|
|
208
|
+
* Returns the number of segments consumed, or null if no match.
|
|
209
|
+
*/
|
|
210
|
+
function matchPatternNode(segments, startIndex, node) {
|
|
211
|
+
if (node.type === 'sequence') {
|
|
212
|
+
return matchSequence(segments, startIndex, node.segments);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Alternation: try each branch
|
|
216
|
+
for (const branch of node.branches) {
|
|
217
|
+
const result = matchPatternNode(segments, startIndex, branch);
|
|
218
|
+
if (result !== null) {
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Match a sequence of segment patterns.
|
|
227
|
+
*/
|
|
228
|
+
function matchSequence(segments, startIndex, patterns) {
|
|
229
|
+
return matchSequenceRecursive(segments, startIndex, patterns, 0);
|
|
230
|
+
}
|
|
231
|
+
function matchSequenceRecursive(segments, segIndex, patterns, patIndex) {
|
|
232
|
+
// Base case: consumed all patterns
|
|
233
|
+
if (patIndex >= patterns.length) {
|
|
234
|
+
return segIndex; // Must have consumed all segments for full match
|
|
235
|
+
}
|
|
236
|
+
const pattern = patterns[patIndex];
|
|
237
|
+
if (pattern.type === 'globstar') {
|
|
238
|
+
// Globstar: try consuming 0, 1, 2, ... segments
|
|
239
|
+
for (let consume = 0; consume <= segments.length - segIndex; consume++) {
|
|
240
|
+
const result = matchSequenceRecursive(segments, segIndex + consume, patterns, patIndex + 1);
|
|
241
|
+
if (result !== null && result === segments.length) {
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
// Regular segment: must match current segment
|
|
248
|
+
if (segIndex >= segments.length) {
|
|
249
|
+
return null; // No more segments to match
|
|
250
|
+
}
|
|
251
|
+
if (!matchSegment(segments[segIndex], pattern)) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
return matchSequenceRecursive(segments, segIndex + 1, patterns, patIndex + 1);
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/match/matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.test.d.ts","sourceRoot":"","sources":["../../src/match/matcher.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parsePattern } from '../parse';
|
|
3
|
+
import { compilePattern } from '../compile';
|
|
4
|
+
import { matchPath, matchPathDirect } from './matcher';
|
|
5
|
+
describe('matchPath', () => {
|
|
6
|
+
describe('literal patterns', () => {
|
|
7
|
+
it('matches exact path', () => {
|
|
8
|
+
const pattern = compilePattern(parsePattern('src/index.ts'));
|
|
9
|
+
expect(matchPath('/src/index.ts', pattern)).toBe(true);
|
|
10
|
+
expect(matchPath('/src/other.ts', pattern)).toBe(false);
|
|
11
|
+
expect(matchPath('/lib/index.ts', pattern)).toBe(false);
|
|
12
|
+
});
|
|
13
|
+
it('matches multi-segment path', () => {
|
|
14
|
+
const pattern = compilePattern(parsePattern('a/b/c/d'));
|
|
15
|
+
expect(matchPath('/a/b/c/d', pattern)).toBe(true);
|
|
16
|
+
expect(matchPath('/a/b/c', pattern)).toBe(false);
|
|
17
|
+
expect(matchPath('/a/b/c/d/e', pattern)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('single wildcard (*)', () => {
|
|
21
|
+
it('matches any single segment with *', () => {
|
|
22
|
+
const pattern = compilePattern(parsePattern('src/*'));
|
|
23
|
+
expect(matchPath('/src/foo', pattern)).toBe(true);
|
|
24
|
+
expect(matchPath('/src/bar', pattern)).toBe(true);
|
|
25
|
+
expect(matchPath('/src/foo/bar', pattern)).toBe(false);
|
|
26
|
+
expect(matchPath('/lib/foo', pattern)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('matches file extension pattern', () => {
|
|
29
|
+
const pattern = compilePattern(parsePattern('*.ts'));
|
|
30
|
+
expect(matchPath('/index.ts', pattern)).toBe(true);
|
|
31
|
+
expect(matchPath('/foo.ts', pattern)).toBe(true);
|
|
32
|
+
expect(matchPath('/foo.js', pattern)).toBe(false);
|
|
33
|
+
expect(matchPath('/src/foo.ts', pattern)).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
it('matches complex wildcard', () => {
|
|
36
|
+
const pattern = compilePattern(parsePattern('test-*-spec.js'));
|
|
37
|
+
expect(matchPath('/test-unit-spec.js', pattern)).toBe(true);
|
|
38
|
+
expect(matchPath('/test-integration-spec.js', pattern)).toBe(true);
|
|
39
|
+
expect(matchPath('/test-spec.js', pattern)).toBe(false); // Missing middle part? Actually * can match zero chars
|
|
40
|
+
});
|
|
41
|
+
it('matches prefix wildcard', () => {
|
|
42
|
+
const pattern = compilePattern(parsePattern('*-config.json'));
|
|
43
|
+
expect(matchPath('/app-config.json', pattern)).toBe(true);
|
|
44
|
+
expect(matchPath('/db-config.json', pattern)).toBe(true);
|
|
45
|
+
expect(matchPath('/config.json', pattern)).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('globstar (**)', () => {
|
|
49
|
+
it('matches zero segments', () => {
|
|
50
|
+
const pattern = compilePattern(parsePattern('src/**/*.ts'));
|
|
51
|
+
expect(matchPath('/src/foo.ts', pattern)).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it('matches one segment', () => {
|
|
54
|
+
const pattern = compilePattern(parsePattern('src/**/*.ts'));
|
|
55
|
+
expect(matchPath('/src/lib/foo.ts', pattern)).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it('matches multiple segments', () => {
|
|
58
|
+
const pattern = compilePattern(parsePattern('src/**/*.ts'));
|
|
59
|
+
expect(matchPath('/src/a/b/c/foo.ts', pattern)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it('matches at end', () => {
|
|
62
|
+
const pattern = compilePattern(parsePattern('src/**'));
|
|
63
|
+
expect(matchPath('/src', pattern)).toBe(false); // Need at least one segment? Actually ** matches zero
|
|
64
|
+
expect(matchPath('/src/foo', pattern)).toBe(true);
|
|
65
|
+
expect(matchPath('/src/a/b/c', pattern)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('matches at start', () => {
|
|
68
|
+
const pattern = compilePattern(parsePattern('**/*.ts'));
|
|
69
|
+
expect(matchPath('/foo.ts', pattern)).toBe(true);
|
|
70
|
+
expect(matchPath('/src/foo.ts', pattern)).toBe(true);
|
|
71
|
+
expect(matchPath('/a/b/c/foo.ts', pattern)).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('matches in middle', () => {
|
|
74
|
+
const pattern = compilePattern(parsePattern('src/**/test/*.ts'));
|
|
75
|
+
expect(matchPath('/src/test/foo.ts', pattern)).toBe(true);
|
|
76
|
+
expect(matchPath('/src/lib/test/foo.ts', pattern)).toBe(true);
|
|
77
|
+
expect(matchPath('/src/a/b/test/foo.ts', pattern)).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('matches multiple globstars', () => {
|
|
80
|
+
const pattern = compilePattern(parsePattern('**/node_modules/**'));
|
|
81
|
+
expect(matchPath('/node_modules/foo', pattern)).toBe(true);
|
|
82
|
+
expect(matchPath('/src/node_modules/bar', pattern)).toBe(true);
|
|
83
|
+
expect(matchPath('/a/b/node_modules/c/d', pattern)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('question mark (?)', () => {
|
|
87
|
+
it('matches single character', () => {
|
|
88
|
+
const pattern = compilePattern(parsePattern('file?.txt'));
|
|
89
|
+
expect(matchPath('/file1.txt', pattern)).toBe(true);
|
|
90
|
+
expect(matchPath('/fileA.txt', pattern)).toBe(true);
|
|
91
|
+
expect(matchPath('/file.txt', pattern)).toBe(false);
|
|
92
|
+
expect(matchPath('/file12.txt', pattern)).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
it('matches multiple question marks', () => {
|
|
95
|
+
const pattern = compilePattern(parsePattern('???.md'));
|
|
96
|
+
expect(matchPath('/abc.md', pattern)).toBe(true);
|
|
97
|
+
expect(matchPath('/xyz.md', pattern)).toBe(true);
|
|
98
|
+
expect(matchPath('/ab.md', pattern)).toBe(false);
|
|
99
|
+
expect(matchPath('/abcd.md', pattern)).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('character classes', () => {
|
|
103
|
+
it('matches character set', () => {
|
|
104
|
+
const pattern = compilePattern(parsePattern('file[abc].txt'));
|
|
105
|
+
expect(matchPath('/filea.txt', pattern)).toBe(true);
|
|
106
|
+
expect(matchPath('/fileb.txt', pattern)).toBe(true);
|
|
107
|
+
expect(matchPath('/filec.txt', pattern)).toBe(true);
|
|
108
|
+
expect(matchPath('/filed.txt', pattern)).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it('matches character range', () => {
|
|
111
|
+
const pattern = compilePattern(parsePattern('file[0-9].txt'));
|
|
112
|
+
expect(matchPath('/file0.txt', pattern)).toBe(true);
|
|
113
|
+
expect(matchPath('/file5.txt', pattern)).toBe(true);
|
|
114
|
+
expect(matchPath('/file9.txt', pattern)).toBe(true);
|
|
115
|
+
expect(matchPath('/filea.txt', pattern)).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
it('matches negated class', () => {
|
|
118
|
+
const pattern = compilePattern(parsePattern('file[!0-9].txt'));
|
|
119
|
+
expect(matchPath('/filea.txt', pattern)).toBe(true);
|
|
120
|
+
expect(matchPath('/filez.txt', pattern)).toBe(true);
|
|
121
|
+
expect(matchPath('/file5.txt', pattern)).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
it('matches complex class', () => {
|
|
124
|
+
const pattern = compilePattern(parsePattern('[a-zA-Z0-9_].txt'));
|
|
125
|
+
expect(matchPath('/a.txt', pattern)).toBe(true);
|
|
126
|
+
expect(matchPath('/Z.txt', pattern)).toBe(true);
|
|
127
|
+
expect(matchPath('/5.txt', pattern)).toBe(true);
|
|
128
|
+
expect(matchPath('/_.txt', pattern)).toBe(true);
|
|
129
|
+
expect(matchPath('/-.txt', pattern)).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('brace expansion', () => {
|
|
133
|
+
it('matches alternatives', () => {
|
|
134
|
+
const pattern = compilePattern(parsePattern('{src,lib}/**/*.ts'));
|
|
135
|
+
expect(matchPath('/src/foo.ts', pattern)).toBe(true);
|
|
136
|
+
expect(matchPath('/lib/bar.ts', pattern)).toBe(true);
|
|
137
|
+
expect(matchPath('/test/foo.ts', pattern)).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('matches file extensions', () => {
|
|
140
|
+
const pattern = compilePattern(parsePattern('*.{js,ts,jsx,tsx}'));
|
|
141
|
+
expect(matchPath('/foo.js', pattern)).toBe(true);
|
|
142
|
+
expect(matchPath('/foo.ts', pattern)).toBe(true);
|
|
143
|
+
expect(matchPath('/foo.jsx', pattern)).toBe(true);
|
|
144
|
+
expect(matchPath('/foo.tsx', pattern)).toBe(true);
|
|
145
|
+
expect(matchPath('/foo.css', pattern)).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('negation', () => {
|
|
149
|
+
it('inverts match result', () => {
|
|
150
|
+
const pattern = compilePattern(parsePattern('!*.test.ts'));
|
|
151
|
+
expect(matchPath('/foo.test.ts', pattern)).toBe(false);
|
|
152
|
+
expect(matchPath('/foo.ts', pattern)).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('edge cases', () => {
|
|
156
|
+
it('handles empty pattern', () => {
|
|
157
|
+
const pattern = compilePattern(parsePattern(''));
|
|
158
|
+
expect(matchPath('/', pattern)).toBe(true);
|
|
159
|
+
expect(matchPath('/foo', pattern)).toBe(false);
|
|
160
|
+
});
|
|
161
|
+
it('handles dotfiles', () => {
|
|
162
|
+
const pattern = compilePattern(parsePattern('.gitignore'));
|
|
163
|
+
expect(matchPath('/.gitignore', pattern)).toBe(true);
|
|
164
|
+
expect(matchPath('/gitignore', pattern)).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
it('handles hidden directories', () => {
|
|
167
|
+
const pattern = compilePattern(parsePattern('**/.git/**'));
|
|
168
|
+
expect(matchPath('/.git/config', pattern)).toBe(true);
|
|
169
|
+
expect(matchPath('/src/.git/HEAD', pattern)).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
it('handles paths with special characters', () => {
|
|
172
|
+
const pattern = compilePattern(parsePattern('file-name_123.txt'));
|
|
173
|
+
expect(matchPath('/file-name_123.txt', pattern)).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('matchPathDirect', () => {
|
|
178
|
+
it('matches without compilation', () => {
|
|
179
|
+
const pattern = parsePattern('src/**/*.ts');
|
|
180
|
+
expect(matchPathDirect('/src/foo.ts', pattern)).toBe(true);
|
|
181
|
+
expect(matchPathDirect('/src/lib/bar.ts', pattern)).toBe(true);
|
|
182
|
+
expect(matchPathDirect('/lib/foo.ts', pattern)).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=matcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.test.js","sourceRoot":"","sources":["../../src/match/matcher.test.ts"],"names":[],"mappings":"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"}
|