@@ -36,87 +36,79 @@ const mockPackageTarGz = gzipSync(Buffer.concat([
36
36
Buffer . alloc ( 1024 ) ,
37
37
] ) ) ;
38
38
const shasum = createHash ( `sha1` ) . update ( mockPackageTarGz ) . digest ( `hex` ) ;
39
-
39
+ const integrity = `sha512-${ createHash ( `sha512` ) . update ( mockPackageTarGz ) . digest ( `base64` ) } ` ;
40
+
41
+ const registry = {
42
+ __proto__ : null ,
43
+ yarn : [ `1.9998.9999` ] ,
44
+ pnpm : [ `1.9998.9999` ] ,
45
+ // eslint-disable-next-line @typescript-eslint/naming-convention
46
+ '@yarnpkg/cli-dist' : [ `5.9999.9999` ] ,
47
+ customPkgManager : [ `1.0.0` ] ,
48
+ } ;
49
+
50
+ function generateVersionMetadata ( packageName , version ) {
51
+ return {
52
+ name : packageName ,
53
+ version,
54
+ bin : {
55
+ [ packageName ] : `./bin/${ packageName } .js` ,
56
+ } ,
57
+ dist : {
58
+ integrity,
59
+ shasum,
60
+ size : mockPackageTarGz . length ,
61
+ noattachment : false ,
62
+ tarball : `${ process . env . COREPACK_NPM_REGISTRY } /${ packageName } /-/${ packageName } -${ version } .tgz` ,
63
+ } ,
64
+ } ;
65
+ }
40
66
41
67
const server = createServer ( ( req , res ) => {
42
68
const auth = req . headers . authorization ;
43
69
if ( ! auth ?. startsWith ( `Bearer ` ) || Buffer . from ( auth . slice ( `Bearer ` . length ) , `base64` ) . toString ( ) !== `user:pass` ) {
44
- res . statusCode = 401 ;
45
- res . end ( `Unauthorized` ) ;
70
+ res . writeHead ( 401 ) . end ( `Unauthorized` ) ;
46
71
return ;
47
72
}
48
- switch ( req . url ) {
49
- case `/yarn` : {
50
- res . end ( JSON . stringify ( { "dist-tags" : {
51
- latest : `1.9998.9999` ,
52
- } , versions : { '1.9998.9999' : {
53
- dist : {
54
- shasum,
55
- size : mockPackageTarGz . length ,
56
- noattachment : false ,
57
- tarball : `${ process . env . COREPACK_NPM_REGISTRY } /yarn.tgz` ,
58
- } ,
59
- } } } ) ) ;
60
- break ;
61
- }
62
73
63
- case `/pnpm` : {
64
- res . end ( JSON . stringify ( { "dist-tags" : {
65
- latest : `1.9998.9999` ,
66
- } , versions : { '1.9998.9999' : {
67
- dist : {
68
- shasum,
69
- size : mockPackageTarGz . length ,
70
- noattachment : false ,
71
- tarball : `${ process . env . COREPACK_NPM_REGISTRY } /pnpm/-/pnpm-1.9998.9999.tgz` ,
72
- } ,
73
- } } } ) ) ;
74
- break ;
75
- }
74
+ let slashPosition = req . url . indexOf ( `/` , 1 ) ;
75
+ if ( req . url . charAt ( 1 ) === `@` ) slashPosition = req . url . indexOf ( `/` , slashPosition + 1 ) ;
76
76
77
- case `/@yarnpkg/cli-dist` : {
77
+ const packageName = req . url . slice ( 1 , slashPosition === - 1 ? undefined : slashPosition ) ;
78
+ if ( packageName in registry ) {
79
+ if ( req . url === `/${ packageName } ` ) {
80
+ // eslint-disable-next-line @typescript-eslint/naming-convention
78
81
res . end ( JSON . stringify ( { "dist-tags" : {
79
- latest : `5.9999.9999` ,
80
- } , versions : { '5.9999.9999' : {
81
- bin : {
82
- yarn : `./bin/yarn.js` ,
83
- yarnpkg : `./bin/yarn.js` ,
84
- } ,
85
- dist : {
86
- shasum,
87
- size : mockPackageTarGz . length ,
88
- noattachment : false ,
89
- tarball : `${ process . env . COREPACK_NPM_REGISTRY } /yarn.tgz` ,
90
- } ,
91
- } } } ) ) ;
92
- break ;
82
+ latest : registry [ packageName ] . at ( - 1 ) ,
83
+ } , versions : Object . fromEntries ( registry [ packageName ] . map ( version =>
84
+ [ version , generateVersionMetadata ( packageName , version ) ] ,
85
+ ) ) } ) ) ;
86
+ return ;
93
87
}
94
-
95
- case `/customPkgManager` : {
96
- res . end ( JSON . stringify ( { "dist-tags" : {
97
- latest : `1.0.0` ,
98
- } , versions : { '1.0.0' : {
99
- bin : {
100
- customPkgManager : `./bin/customPkgManager.js` ,
101
- } ,
102
- dist : {
103
- shasum,
104
- size : mockPackageTarGz . length ,
105
- noattachment : false ,
106
- tarball : `${ process . env . COREPACK_NPM_REGISTRY } /customPkgManager/-/customPkgManager-1.0.0.tgz` ,
107
- } ,
108
- } } } ) ) ;
109
- break ;
88
+ const isDownloadingRequest = req . url . slice ( packageName . length + 1 , packageName . length + 4 ) === `/-/` ;
89
+ let version ;
90
+ if ( isDownloadingRequest ) {
91
+ const match = / ^ ( .+ ) - ( .+ ) \. t g z $ / . exec ( req . url . slice ( packageName . length + 4 ) ) ;
92
+ if ( match ?. [ 1 ] === packageName ) {
93
+ version = match [ 2 ] ;
94
+ }
95
+ } else {
96
+ version = req . url . slice ( packageName . length + 2 ) ;
110
97
}
111
-
112
- case `/pnpm/-/pnpm-1.9998.9999.tgz` :
113
- case `/yarn.tgz` :
114
- case `/customPkgManager/-/customPkgManager-1.0.0.tgz` :
115
- res . end ( mockPackageTarGz ) ;
116
- break ;
117
-
118
- default :
119
- throw new Error ( `unsupported request` , { cause : req . url } ) ;
98
+ if ( version === `latest` ) version = registry [ packageName ] . at ( - 1 ) ;
99
+ if ( registry [ packageName ] . includes ( version ) ) {
100
+ res . end (
101
+ isDownloadingRequest ?
102
+ mockPackageTarGz :
103
+ JSON . stringify ( generateVersionMetadata ( packageName , version ) ) ,
104
+ ) ;
105
+ } else {
106
+ res . writeHead ( 404 ) . end ( `Not Found` ) ;
107
+ throw new Error ( `unsupported request` , { cause : { url : req . url , packageName, version, isDownloadingRequest} } ) ;
108
+ }
109
+ } else {
110
+ res . writeHead ( 500 ) . end ( `Internal Error` ) ;
111
+ throw new Error ( `unsupported request` , { cause : { url : req . url , packageName} } ) ;
120
112
}
121
113
} ) . listen ( 0 , `localhost` ) ;
122
114
0 commit comments