11import semver from "semver" ;
22import { getRequestJson , RequestFunction } from "../fs/index.js" ;
33import { PackageJson , parsePackageJson } from "./package.js" ;
4+ import * as z from "zod" ;
45
56export const DefaultRegistryUrl = [ "https://f.jaculus.org/libs" ] ;
67
8+
9+ /**
10+ *
11+ * Registry dist structure:
12+ * outputRegistryDist/
13+ * |-- packageName/
14+ * | |-- version/
15+ * | | |-- package.tar.gz
16+ * | | |-- package.json (same as in package)
17+ * |-- versions.json (list of versions) [{"version":"0.0.24"},{"version":"0.0.25"}]
18+ * |-- list.json (list of packages) [{"id":"core"},{"id":"smart-led"}]
19+ *
20+ *
21+ * package.tar.gz contains:
22+ * package/
23+ * |-- dist/
24+ * |-- blocks/
25+ * |-- package.json
26+ * |-- README.md
27+ */
28+
29+
30+ const RegistryListSchema = z . array (
31+ z . object ( {
32+ id : z . string ( ) ,
33+ } )
34+ ) ;
35+
36+ const RegistryVersionsSchema = z . array (
37+ z . object ( {
38+ version : z . string ( ) ,
39+ } )
40+ ) ;
41+
42+ export type RegistryList = z . infer < typeof RegistryListSchema > ;
43+ export type RegistryVersions = z . infer < typeof RegistryVersionsSchema > ;
44+
45+ export function parseRegistryList ( json : object ) : RegistryList {
46+ const result = RegistryListSchema . safeParse ( json ) ;
47+ if ( ! result . success ) {
48+ const pretty = z . prettifyError ( result . error ) ;
49+ throw new Error ( `Invalid registry list format:\n${ pretty } ` ) ;
50+ }
51+ return result . data ;
52+ }
53+
54+ export function parseRegistryVersions ( json : object ) : RegistryVersions {
55+ const result = RegistryVersionsSchema . safeParse ( json ) ;
56+ if ( ! result . success ) {
57+ const pretty = z . prettifyError ( result . error ) ;
58+ throw new Error ( `Invalid registry versions format:\n${ pretty } ` ) ;
59+ }
60+ return result . data ;
61+ }
62+
63+
764export class Registry {
865 public registryUri : string [ ] ;
966
@@ -20,7 +77,7 @@ export class Registry {
2077 const allLibraries : Map < string , string > = new Map ( ) ;
2178
2279 for ( const uri of this . registryUri ) {
23- const libraries = await getRequestJson ( this . getRequest , uri , "list.json" ) ;
80+ const libraries = parseRegistryList ( await getRequestJson ( this . getRequest , uri , "list.json" ) ) ;
2481 for ( const item of libraries ) {
2582 if ( allLibraries . has ( item . id ) ) {
2683 throw new Error (
@@ -46,10 +103,10 @@ export class Registry {
46103 }
47104
48105 public async listVersions ( library : string ) : Promise < string [ ] > {
49- return this . retrieveSingleResultFromRegistries ( async ( uri ) => {
50- const data = await getRequestJson ( this . getRequest , uri , `${ library } /versions.json` ) ;
51- return data . map ( ( item : any ) => item . version ) . sort ( semver . rcompare ) ;
106+ const versions = await this . retrieveSingleResultFromRegistries ( async ( uri ) => {
107+ return getRequestJson ( this . getRequest , uri , `${ library } /versions.json` ) ;
52108 } , `Failed to fetch versions for library '${ library } '` ) ;
109+ return parseRegistryVersions ( versions ) . map ( ( item ) => item . version ) . sort ( semver . rcompare ) ;
53110 }
54111
55112 public async getPackageJson ( library : string , version : string ) : Promise < PackageJson > {
0 commit comments