1- import { abbreviateCommitHash } from ' @pkg-pr-new/utils'
2- import { normalizeKey } from ' unstorage'
3- import { z } from 'zod'
1+ import { abbreviateCommitHash } from " @pkg-pr-new/utils" ;
2+ import { normalizeKey } from " unstorage" ;
3+ import { WorkflowData } from "../../../types" ;
44
5- const paramsSchema = z . object ( {
6- owner : z . string ( ) ,
7- repo : z . string ( ) ,
8- packageAndRefOrSha : z . string ( ) ,
9- } )
5+ type Params = Omit < WorkflowData , "sha" | "ref" > & {
6+ packageAndRefOrSha : string ;
7+ } ;
108
119export default eventHandler ( async ( event ) => {
12- const params = await getValidatedRouterParams ( event , paramsSchema . parse )
13- let [ encodedPackageName , longerRefOrSha ] = params . packageAndRefOrSha . split ( '@' )
14- const packageName = decodeURIComponent ( encodedPackageName )
15- longerRefOrSha = longerRefOrSha . split ( '.tgz' ) [ 0 ] // yarn support
16- const isSha = isValidGitHash ( longerRefOrSha )
17- const refOrSha = isSha ? abbreviateCommitHash ( longerRefOrSha ) : longerRefOrSha
18-
19- const base = `${ params . owner } :${ params . repo } :${ refOrSha } `
20- let packageKey = `${ base } :${ packageName } `
21-
22- const cursorKey = base
23-
24- const packagesBucket = usePackagesBucket ( event )
25- const downloadedAtBucket = useDownloadedAtBucket ( event )
26- const cursorBucket = useCursorsBucket ( event )
10+ const params = getRouterParams ( event ) as Params ;
11+ // eslint-disable-next-line prefer-const
12+ let [ encodedPackageName , longerRefOrSha ] =
13+ params . packageAndRefOrSha . split ( "@" ) ;
14+ const packageName = decodeURIComponent ( encodedPackageName ) ;
15+ longerRefOrSha = longerRefOrSha . split ( ".tgz" ) [ 0 ] ; // yarn support
16+ const isSha = isValidGitHash ( longerRefOrSha ) ;
17+ const refOrSha = isSha
18+ ? abbreviateCommitHash ( longerRefOrSha )
19+ : longerRefOrSha ;
20+
21+ const base = `${ params . owner } :${ params . repo } :${ refOrSha } ` ;
22+ let packageKey = `${ base } :${ packageName } ` ;
23+
24+ const cursorKey = base ;
25+
26+ const packagesBucket = usePackagesBucket ( event ) ;
27+ const downloadedAtBucket = useDownloadedAtBucket ( event ) ;
28+ const cursorBucket = useCursorsBucket ( event ) ;
2729
2830 if ( await cursorBucket . hasItem ( cursorKey ) ) {
29- const currentCursor = ( await cursorBucket . getItem ( cursorKey ) ) !
31+ const currentCursor = ( await cursorBucket . getItem ( cursorKey ) ) ! ;
3032
3133 sendRedirect (
3234 event ,
3335 `/${ params . owner } /${ params . repo } /${ packageName } @${ currentCursor . sha } ` ,
34- )
35- return
36+ ) ;
37+ return ;
3638 }
3739
3840 // longer sha support with precision
39- const binding = useBinding ( event )
40- const { objects } = await binding . list ( { prefix : `${ usePackagesBucket . base } :${ base } ` } )
41+ const binding = useBinding ( event ) ;
42+ const { objects } = await binding . list ( {
43+ prefix : `${ usePackagesBucket . base } :${ base } ` ,
44+ } ) ;
4145 for ( const { key } of objects ) {
4246 // bucket:package:stackblitz-labs:pkg.pr.new:ded05e838c418096e5dd77a29101c8af9e73daea:playground-b
43- const trimmedKey = key . slice ( usePackagesBucket . base . length + 1 )
47+ const trimmedKey = key . slice ( usePackagesBucket . base . length + 1 ) ;
4448
4549 // https://github.com/unjs/unstorage/blob/e42c01d0c22092f394f57e3ec114371fc8dcf6dd/src/drivers/utils/index.ts#L14-L19
46- const [ keySha , ...keyPackageNameParts ] = trimmedKey . split ( ':' ) . slice ( 2 )
47- const keyPackageName = keyPackageNameParts . join ( ':' )
48- if ( keyPackageName !== normalizeKey ( packageName ) )
49- continue
50+ const [ keySha , ...keyPackageNameParts ] = trimmedKey . split ( ":" ) . slice ( 2 ) ;
51+ const keyPackageName = keyPackageNameParts . join ( ":" ) ;
52+ if ( keyPackageName !== normalizeKey ( packageName ) ) {
53+ continue ;
54+ }
5055
5156 if ( keySha . startsWith ( longerRefOrSha ) ) {
52- packageKey = trimmedKey
53- break
57+ packageKey = trimmedKey ;
58+ break ;
5459 }
5560 }
5661
@@ -59,29 +64,29 @@ export default eventHandler(async (event) => {
5964 event ,
6065 usePackagesBucket . base ,
6166 packageKey ,
62- )
67+ ) ;
6368 const obj = ( await packagesBucket . getMeta (
6469 packageKey ,
65- ) ) as unknown as R2Object
70+ ) ) as unknown as R2Object ;
6671
6772 await downloadedAtBucket . setItem (
6873 obj . key ,
6974 Date . parse ( new Date ( ) . toString ( ) ) ,
70- )
75+ ) ;
7176
72- setResponseHeader ( event , ' content-type' , ' application/tar+gzip' )
77+ setResponseHeader ( event , " content-type" , " application/tar+gzip" ) ;
7378 // TODO: add HTTP caching
74- return stream
79+ return stream ;
7580 }
7681
7782 throw createError ( {
7883 status : 404 ,
79- } )
80- } )
84+ } ) ;
85+ } ) ;
8186
82- const sha1Regex = / ^ [ a - f 0 - 9 ] { 40 } $ / i
83- const sha256Regex = / ^ [ a - f 0 - 9 ] { 64 } $ / i
87+ const sha1Regex = / ^ [ \d a - f ] { 40 } $ / i;
88+ const sha256Regex = / ^ [ \d a - f ] { 64 } $ / i;
8489
8590function isValidGitHash ( hash : string ) : boolean {
86- return sha1Regex . test ( hash ) || sha256Regex . test ( hash )
87- }
91+ return sha1Regex . test ( hash ) || sha256Regex . test ( hash ) ;
92+ }
0 commit comments