@@ -154,6 +154,66 @@ async function unpkgVersions(name: string): Promise<string[]> {
154154 return m . map ( ( x ) => x [ 1 ] ) ;
155155}
156156
157+ interface PackageInfo {
158+ parts : string [ ] ;
159+ scope : string ;
160+ packageName : string ;
161+ version : string ;
162+ }
163+ function defaultInfo ( that : RegistryUrl ) : PackageInfo {
164+ const parts = that . url . split ( "/" ) ;
165+ const [ packageName , version ] = parts [ 4 ] . split ( "@" ) ;
166+ if ( parts [ 3 ] === undefined ) {
167+ throw new Error ( `Package scope not found in ${ that . url } ` ) ;
168+ }
169+ if ( packageName === undefined ) {
170+ throw new Error ( `Package name not found in ${ that . url } ` ) ;
171+ }
172+ if ( version === undefined ) {
173+ throw new Error ( `Unable to find version in ${ that . url } ` ) ;
174+ }
175+ return {
176+ scope : parts [ 3 ] ,
177+ packageName,
178+ version,
179+ parts,
180+ } ;
181+ }
182+
183+ function defaultScopeAt ( that : RegistryUrl , version : string ) : string {
184+ const { parts, packageName } = defaultInfo ( that ) ;
185+ parts [ 4 ] = `${ packageName } @${ version } ` ;
186+ return parts . join ( "/" ) ;
187+ }
188+
189+ export class UnpkgScope implements RegistryUrl {
190+ url : string ;
191+
192+ parts ( ) : PackageInfo {
193+ return defaultInfo ( this ) ;
194+ }
195+
196+ constructor ( url : string ) {
197+ this . url = url ;
198+ }
199+
200+ async all ( ) : Promise < string [ ] > {
201+ const { scope, packageName } = this . parts ( ) ;
202+ return await unpkgVersions ( `${ scope } /${ packageName } ` ) ;
203+ }
204+
205+ at ( version : string ) : RegistryUrl {
206+ const url = defaultScopeAt ( this , version ) ;
207+ return new UnpkgScope ( url ) ;
208+ }
209+
210+ version ( ) : string {
211+ return this . parts ( ) . version ;
212+ }
213+
214+ regexp = / h t t p s ? : \/ \/ u n p k g \. c o m \/ @ [ ^ \/ \" \' ] * ?\/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
215+ }
216+
157217export class Unpkg implements RegistryUrl {
158218 url : string ;
159219
@@ -239,6 +299,35 @@ export class Denopkg implements RegistryUrl {
239299 regexp = / h t t p s ? : \/ \/ d e n o p k g .c o m \/ [ ^ \/ \" \' ] * ?\/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
240300}
241301
302+ export class PikaScope implements RegistryUrl {
303+ url : string ;
304+
305+ parts ( ) : PackageInfo {
306+ return defaultInfo ( this ) ;
307+ }
308+
309+ constructor ( url : string ) {
310+ this . url = url ;
311+ }
312+
313+ async all ( ) : Promise < string [ ] > {
314+ const { scope, packageName } = this . parts ( ) ;
315+ return await unpkgVersions ( `${ scope } /${ packageName } ` ) ;
316+ }
317+
318+ at ( version : string ) : RegistryUrl {
319+ const url = defaultScopeAt ( this , version ) ;
320+ return new PikaScope ( url ) ;
321+ }
322+
323+ version ( ) : string {
324+ return this . parts ( ) . version ;
325+ }
326+
327+ regexp =
328+ / h t t p s ? : \/ \/ c d n \. p i k a \. d e v ( \/ \_ ) ? \/ @ [ ^ \/ \" \' ] * ?\/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
329+ }
330+
242331export class Pika implements RegistryUrl {
243332 url : string ;
244333
@@ -266,6 +355,35 @@ export class Pika implements RegistryUrl {
266355 regexp = / h t t p s ? : \/ \/ c d n .p i k a .d e v ( \/ \_ ) ? \/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
267356}
268357
358+ export class SkypackScope implements RegistryUrl {
359+ url : string ;
360+
361+ parts ( ) : PackageInfo {
362+ return defaultInfo ( this ) ;
363+ }
364+
365+ constructor ( url : string ) {
366+ this . url = url ;
367+ }
368+
369+ async all ( ) : Promise < string [ ] > {
370+ const { scope, packageName } = this . parts ( ) ;
371+ return await unpkgVersions ( `${ scope } /${ packageName } ` ) ;
372+ }
373+
374+ at ( version : string ) : RegistryUrl {
375+ const url = defaultScopeAt ( this , version ) ;
376+ return new SkypackScope ( url ) ;
377+ }
378+
379+ version ( ) : string {
380+ return this . parts ( ) . version ;
381+ }
382+
383+ regexp =
384+ / h t t p s ? : \/ \/ c d n \. s k y p a c k \. d e v ( \/ \_ ) ? \/ @ [ ^ \/ \" \' ] * ?\/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
385+ }
386+
269387export class Skypack implements RegistryUrl {
270388 url : string ;
271389
@@ -293,6 +411,34 @@ export class Skypack implements RegistryUrl {
293411 regexp = / h t t p s ? : \/ \/ c d n .s k y p a c k .d e v ( \/ \_ ) ? \/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
294412}
295413
414+ export class EsmShScope implements RegistryUrl {
415+ url : string ;
416+
417+ parts ( ) : PackageInfo {
418+ return defaultInfo ( this ) ;
419+ }
420+
421+ constructor ( url : string ) {
422+ this . url = url ;
423+ }
424+
425+ async all ( ) : Promise < string [ ] > {
426+ const { scope, packageName } = this . parts ( ) ;
427+ return await unpkgVersions ( `${ scope } /${ packageName } ` ) ;
428+ }
429+
430+ at ( version : string ) : RegistryUrl {
431+ const url = defaultScopeAt ( this , version ) ;
432+ return new EsmShScope ( url ) ;
433+ }
434+
435+ version ( ) : string {
436+ return this . parts ( ) . version ;
437+ }
438+
439+ regexp = / h t t p s ? : \/ \/ e s m \. s h \/ @ [ ^ \/ \" \' ] * ?\/ [ ^ \/ \" \' ] * ?\@ [ ^ \' \" ] * / ;
440+ }
441+
296442export class EsmSh implements RegistryUrl {
297443 url : string ;
298444
@@ -518,11 +664,15 @@ export class NestLand implements RegistryUrl {
518664
519665export const REGISTRIES = [
520666 DenoLand ,
667+ UnpkgScope ,
521668 Unpkg ,
522669 Denopkg ,
523670 Jspm ,
671+ PikaScope ,
524672 Pika ,
673+ SkypackScope ,
525674 Skypack ,
675+ EsmShScope ,
526676 EsmSh ,
527677 GithubRaw ,
528678 GitlabRaw ,
0 commit comments