Skip to content

Commit b8dd2d0

Browse files
committed
feat(internal): invalidSegmentRegex
Signed-off-by: Lexus Drumgold <unicornware@flexdevelopment.llc>
1 parent 606c796 commit b8dd2d0

File tree

3 files changed

+65
-19
lines changed

3 files changed

+65
-19
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* @file Unit Tests - invalidSegmentRegex
3+
* @module mlly/internal/tests/unit/invalidSegmentRegex
4+
*/
5+
6+
import testSubject from '../regex-invalid-segment'
7+
8+
describe('unit:internal/invalidSegmentRegex', () => {
9+
let flags: string
10+
let pattern: string
11+
12+
beforeAll(() => {
13+
flags = 'i'
14+
pattern =
15+
'(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))'
16+
})
17+
18+
it('should return deprecated RegExp matching invalid path segment', () => {
19+
// Arrange
20+
const source: string = pattern + '(\\\\|\\/|$)'
21+
22+
// Act
23+
const result = testSubject('deprecated')
24+
25+
// Expect
26+
expect(result).to.have.property('flags').equal(flags)
27+
expect(result).to.have.property('source').equal(source)
28+
})
29+
30+
it('should return RegExp matching invalid path segment', () => {
31+
// Arrange
32+
const source: string = pattern + '?(\\\\|\\/|$)'
33+
34+
// Act
35+
const result = testSubject()
36+
37+
// Expect
38+
expect(result).to.have.property('flags').equal(flags)
39+
expect(result).to.have.property('source').equal(source)
40+
})
41+
})

src/internal/regex-invalid-segment.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @file Internal - invalidSegmentRegex
3+
* @module mlly/internal/invalidSegmentRegex
4+
*/
5+
6+
/**
7+
* Returns a regular expression matching invalid path segments.
8+
*
9+
* @see https://github.com/nodejs/node/blob/v19.6.1/lib/internal/modules/esm/resolve.js#L299-L300
10+
*
11+
* @param {'deprecated'?} type - Pattern type
12+
* @return {RegExp} Regular expression matching invalid path segments
13+
*/
14+
const invalidSegmentRegex = (type?: 'deprecated'): RegExp => {
15+
return new RegExp(
16+
`(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))${
17+
type === 'deprecated' ? '' : '?'
18+
}(\\\\|\\/|$)`,
19+
'i'
20+
)
21+
}
22+
23+
export default invalidSegmentRegex

src/internal/resolver.ts

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import regexp from './escape-reg-exp'
4545
import isArrayIndex from './is-array-index'
4646
import isDirectory from './is-directory'
4747
import isFile from './is-file'
48+
import invalidSegmentRegex from './regex-invalid-segment'
4849
import PACKAGE_NAME_REGEX from './regex-package-name'
4950
import PACKAGE_PATH_REGEX from './regex-package-path'
5051

@@ -691,25 +692,6 @@ class Resolver {
691692
url = this.resolvePackage(target, parent, condition, conditions)
692693
break
693694
case target.startsWith('.' + pathe.sep):
694-
/**
695-
* Returns a regex pattern matching invalid path segments.
696-
*
697-
* Invalid segments include:
698-
*
699-
* - `'node_modules/'` (decoded and encoded)
700-
*
701-
* @param {'deprecated'?} type - Pattern type
702-
* @return {RegExp} Regex pattern matching invalid path segments
703-
*/
704-
const invalidSegmentRegex = (type?: 'deprecated'): RegExp => {
705-
return new RegExp(
706-
`(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))${
707-
type === 'deprecated' ? '' : '?'
708-
}(\\\\|\\/|$)`,
709-
'i'
710-
)
711-
}
712-
713695
// check target for invalid segments
714696
if (invalidSegmentRegex().test(target.slice(2))) {
715697
if (invalidSegmentRegex('deprecated').test(target.slice(2))) {

0 commit comments

Comments
 (0)