@@ -7,22 +7,46 @@ type Params = Omit<WorkflowData, "sha" | "ref"> & {
77
88export default eventHandler ( async ( event ) => {
99 const params = getRouterParams ( event ) as Params ;
10- let [ encodedPackageName , refOrSha ] = params . packageAndRefOrSha . split ( "@" ) ;
10+ let [ encodedPackageName , longerRefOrSha ] = params . packageAndRefOrSha . split ( "@" ) ;
1111 const packageName = decodeURIComponent ( encodedPackageName ) ;
12- refOrSha = refOrSha . split ( '.tgz' ) [ 0 ] // yarn support
12+ longerRefOrSha = longerRefOrSha . split ( '.tgz' ) [ 0 ] // yarn support
13+ const isSha = isValidGitHash ( longerRefOrSha ) ;
14+ const refOrSha = isSha ? abbreviateCommitHash ( longerRefOrSha ) : longerRefOrSha ;
1315
14- if ( isValidGitHash ( refOrSha ) ) {
15- refOrSha = abbreviateCommitHash ( refOrSha ) ;
16- }
16+ let base = `${ params . owner } :${ params . repo } :${ refOrSha } ` ;
17+ let packageKey = `${ base } :${ packageName } ` ;
1718
18- const base = `${ params . owner } :${ params . repo } :${ refOrSha } `
19- const packageKey = `${ base } :${ packageName } ` ;
2019 const cursorKey = base ;
2120
2221 const packagesBucket = usePackagesBucket ( event ) ;
2322 const downloadedAtBucket = useDownloadedAtBucket ( event ) ;
2423 const cursorBucket = useCursorsBucket ( event ) ;
2524
25+ if ( await cursorBucket . hasItem ( cursorKey ) ) {
26+ const currentCursor = ( await cursorBucket . getItem ( cursorKey ) ) ! ;
27+
28+ sendRedirect (
29+ event ,
30+ `/${ params . owner } /${ params . repo } /${ packageName } @${ currentCursor . sha } ` ,
31+ ) ;
32+ return ;
33+ }
34+
35+ // longer sha support with precision
36+ const binding = useBinding ( event ) ;
37+ const { objects } = await binding . list ( { prefix : `${ usePackagesBucket . base } :${ base } ` } )
38+ for ( const { key } of objects ) {
39+ // bucket:package:stackblitz-labs:pkg.pr.new:ded05e838c418096e5dd77a29101c8af9e73daea:playground-b
40+ const trimmedKey = key . slice ( usePackagesBucket . base . length + 1 ) ;
41+ const [ keySha , keyPackageName ] = trimmedKey . split ( ":" ) . slice ( 2 ) ;
42+ if ( keyPackageName !== packageName ) continue ;
43+
44+ if ( keySha . startsWith ( longerRefOrSha ) ) {
45+ packageKey = trimmedKey ;
46+ break ;
47+ }
48+ }
49+
2650 if ( await packagesBucket . hasItem ( packageKey ) ) {
2751 const stream = await getItemStream (
2852 event ,
@@ -41,14 +65,6 @@ export default eventHandler(async (event) => {
4165 setResponseHeader ( event , "content-type" , "application/tar+gzip" ) ;
4266 // TODO: add HTTP caching
4367 return stream ;
44- } else if ( await cursorBucket . hasItem ( cursorKey ) ) {
45- const currentCursor = ( await cursorBucket . getItem ( cursorKey ) ) ! ;
46-
47- sendRedirect (
48- event ,
49- `/${ params . owner } /${ params . repo } /${ packageName } @${ currentCursor . sha } ` ,
50- ) ;
51- return ;
5268 }
5369
5470 throw createError ( {
0 commit comments