@@ -15,30 +15,72 @@ export interface PatchedPackageDetails extends PackageDetails {
15
15
isDevOnly : boolean
16
16
}
17
17
18
- function parseNameAndVersion (
19
- s : string ,
18
+ export function parseNameAndVersion (
19
+ str : string ,
20
20
) : {
21
- name : string
21
+ packageName : string
22
22
version ?: string
23
+ sequenceName ?: string
24
+ sequenceNumber ?: number
23
25
} | null {
24
- const parts = s . split ( "+" )
25
- switch ( parts . length ) {
26
+ const parts = str
27
+ . split ( "+" )
28
+ . map ( ( s ) => s . trim ( ) )
29
+ . filter ( Boolean )
30
+ if ( parts . length === 0 ) {
31
+ return null
32
+ }
33
+ if ( parts . length === 1 ) {
34
+ return { packageName : str }
35
+ }
36
+ const versionIndex = parts . findIndex ( ( part ) =>
37
+ part . match ( / ^ \d + \. \d + \. \d + .* $ / ) ,
38
+ )
39
+ if ( versionIndex === - 1 ) {
40
+ const [ scope , name ] = parts
41
+ return { packageName : `${ scope } /${ name } ` }
42
+ }
43
+ const nameParts = parts . slice ( 0 , versionIndex )
44
+ let packageName
45
+ switch ( nameParts . length ) {
46
+ case 0 :
47
+ return null
48
+ case 1 :
49
+ packageName = nameParts [ 0 ]
50
+ break
51
+ case 2 :
52
+ const [ scope , name ] = nameParts
53
+ packageName = `${ scope } /${ name } `
54
+ break
55
+ default :
56
+ return null
57
+ }
58
+
59
+ const version = parts [ versionIndex ]
60
+ const sequenceParts = parts . slice ( versionIndex + 1 )
61
+ if ( sequenceParts . length === 0 ) {
62
+ return { packageName, version }
63
+ }
64
+
65
+ // expect sequenceParts[0] to be a number, strip leading 0s
66
+ const sequenceNumber = parseInt ( sequenceParts [ 0 ] . replace ( / ^ 0 + / , "" ) , 10 )
67
+ if ( isNaN ( sequenceNumber ) ) {
68
+ return null
69
+ }
70
+ switch ( sequenceParts . length ) {
26
71
case 1 : {
27
- return { name : parts [ 0 ] }
72
+ return { packageName , version , sequenceNumber }
28
73
}
29
74
case 2 : {
30
- const [ nameOrScope , versionOrName ] = parts
31
- if ( versionOrName . match ( / ^ \d + / ) ) {
32
- return {
33
- name : nameOrScope ,
34
- version : versionOrName ,
35
- }
75
+ return {
76
+ packageName,
77
+ version,
78
+ sequenceName : sequenceParts [ 1 ] ,
79
+ sequenceNumber,
36
80
}
37
- return { name : `${ nameOrScope } /${ versionOrName } ` }
38
81
}
39
- case 3 : {
40
- const [ scope , name , version ] = parts
41
- return { name : `${ scope } /${ name } ` , version }
82
+ default : {
83
+ return null
42
84
}
43
85
}
44
86
return null
@@ -85,17 +127,19 @@ export function getPackageDetailsFromPatchFilename(
85
127
}
86
128
87
129
return {
88
- name : lastPart . name ,
130
+ name : lastPart . packageName ,
89
131
version : lastPart . version ,
90
132
path : join (
91
133
"node_modules" ,
92
- parts . map ( ( { name } ) => name ) . join ( "/node_modules/" ) ,
134
+ parts . map ( ( { packageName : name } ) => name ) . join ( "/node_modules/" ) ,
93
135
) ,
94
136
patchFilename,
95
- pathSpecifier : parts . map ( ( { name } ) => name ) . join ( "/" ) ,
96
- humanReadablePathSpecifier : parts . map ( ( { name } ) => name ) . join ( " => " ) ,
137
+ pathSpecifier : parts . map ( ( { packageName : name } ) => name ) . join ( "/" ) ,
138
+ humanReadablePathSpecifier : parts
139
+ . map ( ( { packageName : name } ) => name )
140
+ . join ( " => " ) ,
97
141
isNested : parts . length > 1 ,
98
- packageNames : parts . map ( ( { name } ) => name ) ,
142
+ packageNames : parts . map ( ( { packageName : name } ) => name ) ,
99
143
isDevOnly : patchFilename . endsWith ( ".dev.patch" ) ,
100
144
}
101
145
}
0 commit comments