22
33const NAME_RE = / ^ [ \d a - z - ] { 1 , 32 } $ / ,
44 VALUE_RE = / ^ [ \d + . / A - Z a - z - ] + $ / ,
5+ INTEGER_RE = / ^ - ? (?: 0 | [ 1 - 9 ] \d * ) $ / ,
56 PHC_RE = new RegExp ( String . raw `^` +
67 String . raw `\$(?<id>[\da-z-]{1,32})` + // id
78 String . raw `(?:\$v=(?<version>\d+))?` + // version
@@ -100,7 +101,7 @@ export function toPhc ( { id, version, params, salt, hash, defaultParams, sortPa
100101 return string ;
101102}
102103
103- export function fromPhc ( string , { defaultParams, decodeSalt = true , decodeHash = true } = { } ) {
104+ export function fromPhc ( string , { defaultParams, decodeNumbers = true , decodeSalt = true , decodeHash = true } = { } ) {
104105 const match = string . match ( PHC_RE ) ;
105106 if ( ! match ) throw "PHC string is not valid" ;
106107
@@ -130,7 +131,13 @@ export function fromPhc ( string, { defaultParams, decodeSalt = true, decodeHash
130131 }
131132 else {
132133 data . params ??= { } ;
133- data . params [ name ] = value ;
134+
135+ if ( decodeNumbers && typeof value === "string" && INTEGER_RE . test ( value ) ) {
136+ data . params [ name ] = Number . parseInt ( value ) ;
137+ }
138+ else {
139+ data . params [ name ] = value ;
140+ }
134141 }
135142 }
136143 }
@@ -147,9 +154,14 @@ export function fromPhc ( string, { defaultParams, decodeSalt = true, decodeHash
147154 for ( const param of match . groups . params . split ( "," ) ) {
148155 const [ name , value ] = param . split ( "=" ) ;
149156
150- if ( name === "v" ) throw "PHC params are not valid" ;
157+ if ( name === "v" ) continue ;
151158
152- data . params [ name ] = value ;
159+ if ( decodeNumbers && INTEGER_RE . test ( value ) ) {
160+ data . params [ name ] = Number . parseInt ( value ) ;
161+ }
162+ else {
163+ data . params [ name ] = value ;
164+ }
153165 }
154166 }
155167
0 commit comments