@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.
Files changed (154) hide show
  1. package/README.md +571 -0
  2. package/dist/automaton/complement.d.ts +20 -0
  3. package/dist/automaton/complement.d.ts.map +1 -0
  4. package/dist/automaton/complement.js +36 -0
  5. package/dist/automaton/complement.js.map +1 -0
  6. package/dist/automaton/complement.test.d.ts +2 -0
  7. package/dist/automaton/complement.test.d.ts.map +1 -0
  8. package/dist/automaton/complement.test.js +114 -0
  9. package/dist/automaton/complement.test.js.map +1 -0
  10. package/dist/automaton/determinize.d.ts +41 -0
  11. package/dist/automaton/determinize.d.ts.map +1 -0
  12. package/dist/automaton/determinize.js +310 -0
  13. package/dist/automaton/determinize.js.map +1 -0
  14. package/dist/automaton/determinize.test.d.ts +2 -0
  15. package/dist/automaton/determinize.test.d.ts.map +1 -0
  16. package/dist/automaton/determinize.test.js +134 -0
  17. package/dist/automaton/determinize.test.js.map +1 -0
  18. package/dist/automaton/emptiness.d.ts +41 -0
  19. package/dist/automaton/emptiness.d.ts.map +1 -0
  20. package/dist/automaton/emptiness.js +262 -0
  21. package/dist/automaton/emptiness.js.map +1 -0
  22. package/dist/automaton/emptiness.test.d.ts +2 -0
  23. package/dist/automaton/emptiness.test.d.ts.map +1 -0
  24. package/dist/automaton/emptiness.test.js +154 -0
  25. package/dist/automaton/emptiness.test.js.map +1 -0
  26. package/dist/automaton/index.d.ts +10 -0
  27. package/dist/automaton/index.d.ts.map +1 -0
  28. package/dist/automaton/index.js +11 -0
  29. package/dist/automaton/index.js.map +1 -0
  30. package/dist/automaton/intersect.d.ts +35 -0
  31. package/dist/automaton/intersect.d.ts.map +1 -0
  32. package/dist/automaton/intersect.js +302 -0
  33. package/dist/automaton/intersect.js.map +1 -0
  34. package/dist/automaton/pattern-algebra.d.ts +62 -0
  35. package/dist/automaton/pattern-algebra.d.ts.map +1 -0
  36. package/dist/automaton/pattern-algebra.js +309 -0
  37. package/dist/automaton/pattern-algebra.js.map +1 -0
  38. package/dist/automaton/pattern-algebra.test.d.ts +2 -0
  39. package/dist/automaton/pattern-algebra.test.d.ts.map +1 -0
  40. package/dist/automaton/pattern-algebra.test.js +223 -0
  41. package/dist/automaton/pattern-algebra.test.js.map +1 -0
  42. package/dist/compile/automaton-builder.d.ts +47 -0
  43. package/dist/compile/automaton-builder.d.ts.map +1 -0
  44. package/dist/compile/automaton-builder.js +211 -0
  45. package/dist/compile/automaton-builder.js.map +1 -0
  46. package/dist/compile/compiler.d.ts +32 -0
  47. package/dist/compile/compiler.d.ts.map +1 -0
  48. package/dist/compile/compiler.js +47 -0
  49. package/dist/compile/compiler.js.map +1 -0
  50. package/dist/compile/index.d.ts +8 -0
  51. package/dist/compile/index.d.ts.map +1 -0
  52. package/dist/compile/index.js +8 -0
  53. package/dist/compile/index.js.map +1 -0
  54. package/dist/compile/quick-reject.d.ts +28 -0
  55. package/dist/compile/quick-reject.d.ts.map +1 -0
  56. package/dist/compile/quick-reject.js +147 -0
  57. package/dist/compile/quick-reject.js.map +1 -0
  58. package/dist/containment/analysis.d.ts +60 -0
  59. package/dist/containment/analysis.d.ts.map +1 -0
  60. package/dist/containment/analysis.js +378 -0
  61. package/dist/containment/analysis.js.map +1 -0
  62. package/dist/containment/containment.d.ts +23 -0
  63. package/dist/containment/containment.d.ts.map +1 -0
  64. package/dist/containment/containment.js +681 -0
  65. package/dist/containment/containment.js.map +1 -0
  66. package/dist/containment/containment.test.d.ts +2 -0
  67. package/dist/containment/containment.test.d.ts.map +1 -0
  68. package/dist/containment/containment.test.js +209 -0
  69. package/dist/containment/containment.test.js.map +1 -0
  70. package/dist/containment/index.d.ts +7 -0
  71. package/dist/containment/index.d.ts.map +1 -0
  72. package/dist/containment/index.js +7 -0
  73. package/dist/containment/index.js.map +1 -0
  74. package/dist/core-alpha.d.ts +1253 -0
  75. package/dist/core-beta.d.ts +1253 -0
  76. package/dist/core-public.d.ts +1253 -0
  77. package/dist/core-unstripped.d.ts +1253 -0
  78. package/dist/index.d.ts +32 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +49 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/match/index.d.ts +8 -0
  83. package/dist/match/index.d.ts.map +1 -0
  84. package/dist/match/index.js +8 -0
  85. package/dist/match/index.js.map +1 -0
  86. package/dist/match/matcher.d.ts +40 -0
  87. package/dist/match/matcher.d.ts.map +1 -0
  88. package/dist/match/matcher.js +256 -0
  89. package/dist/match/matcher.js.map +1 -0
  90. package/dist/match/matcher.test.d.ts +2 -0
  91. package/dist/match/matcher.test.d.ts.map +1 -0
  92. package/dist/match/matcher.test.js +185 -0
  93. package/dist/match/matcher.test.js.map +1 -0
  94. package/dist/match/path-utils.d.ts +132 -0
  95. package/dist/match/path-utils.d.ts.map +1 -0
  96. package/dist/match/path-utils.js +223 -0
  97. package/dist/match/path-utils.js.map +1 -0
  98. package/dist/match/path-utils.test.d.ts +2 -0
  99. package/dist/match/path-utils.test.d.ts.map +1 -0
  100. package/dist/match/path-utils.test.js +193 -0
  101. package/dist/match/path-utils.test.js.map +1 -0
  102. package/dist/match/segment-matcher.d.ts +25 -0
  103. package/dist/match/segment-matcher.d.ts.map +1 -0
  104. package/dist/match/segment-matcher.js +267 -0
  105. package/dist/match/segment-matcher.js.map +1 -0
  106. package/dist/parse/brace-expansion.d.ts +34 -0
  107. package/dist/parse/brace-expansion.d.ts.map +1 -0
  108. package/dist/parse/brace-expansion.js +294 -0
  109. package/dist/parse/brace-expansion.js.map +1 -0
  110. package/dist/parse/brace-expansion.test.d.ts +2 -0
  111. package/dist/parse/brace-expansion.test.d.ts.map +1 -0
  112. package/dist/parse/brace-expansion.test.js +105 -0
  113. package/dist/parse/brace-expansion.test.js.map +1 -0
  114. package/dist/parse/index.d.ts +8 -0
  115. package/dist/parse/index.d.ts.map +1 -0
  116. package/dist/parse/index.js +8 -0
  117. package/dist/parse/index.js.map +1 -0
  118. package/dist/parse/parser.d.ts +15 -0
  119. package/dist/parse/parser.d.ts.map +1 -0
  120. package/dist/parse/parser.js +526 -0
  121. package/dist/parse/parser.js.map +1 -0
  122. package/dist/parse/parser.test.d.ts +2 -0
  123. package/dist/parse/parser.test.d.ts.map +1 -0
  124. package/dist/parse/parser.test.js +266 -0
  125. package/dist/parse/parser.test.js.map +1 -0
  126. package/dist/parse/validator.d.ts +30 -0
  127. package/dist/parse/validator.d.ts.map +1 -0
  128. package/dist/parse/validator.js +115 -0
  129. package/dist/parse/validator.js.map +1 -0
  130. package/dist/parse/validator.test.d.ts +2 -0
  131. package/dist/parse/validator.test.d.ts.map +1 -0
  132. package/dist/parse/validator.test.js +45 -0
  133. package/dist/parse/validator.test.js.map +1 -0
  134. package/dist/types/ast.d.ts +158 -0
  135. package/dist/types/ast.d.ts.map +1 -0
  136. package/dist/types/ast.js +2 -0
  137. package/dist/types/ast.js.map +1 -0
  138. package/dist/types/automaton.d.ts +150 -0
  139. package/dist/types/automaton.d.ts.map +1 -0
  140. package/dist/types/automaton.js +2 -0
  141. package/dist/types/automaton.js.map +1 -0
  142. package/dist/types/containment.d.ts +257 -0
  143. package/dist/types/containment.d.ts.map +1 -0
  144. package/dist/types/containment.js +5 -0
  145. package/dist/types/containment.js.map +1 -0
  146. package/dist/types/errors.d.ts +37 -0
  147. package/dist/types/errors.d.ts.map +1 -0
  148. package/dist/types/errors.js +24 -0
  149. package/dist/types/errors.js.map +1 -0
  150. package/dist/types/index.d.ts +10 -0
  151. package/dist/types/index.d.ts.map +1 -0
  152. package/dist/types/index.js +6 -0
  153. package/dist/types/index.js.map +1 -0
  154. package/package.json +48 -0
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=matcher.test.d.ts.map
@@ -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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"}