@@ -265,44 +265,33 @@ export async function registryResolveItemsTree(
265265 return null
266266 }
267267
268- let items = (
269- await Promise . all (
270- names . map ( async ( name ) => {
271- const item = await getRegistryItem ( name , config . style )
272- return item
273- } )
274- )
275- ) . filter ( ( item ) : item is NonNullable < typeof item > => item !== null )
276-
277- if ( ! items . length ) {
278- return null
268+ // If we're resolving the index, we want it to go first.
269+ if ( names . includes ( "index" ) ) {
270+ names . unshift ( "index" )
279271 }
280272
281- const registryDependencies : string [ ] = items
282- . map ( ( item ) => item . registryDependencies ?? [ ] )
283- . flat ( )
273+ let registryDependencies : string [ ] = [ ]
274+ for ( const name of names ) {
275+ const itemRegistryDependencies = await resolveRegistryDependencies (
276+ name ,
277+ config
278+ )
279+ registryDependencies . push ( ...itemRegistryDependencies )
280+ }
284281
285- const uniqueDependencies = Array . from ( new Set ( registryDependencies ) )
286- const urls = Array . from ( [ ...names , ...uniqueDependencies ] ) . map ( ( name ) =>
287- getRegistryUrl ( isUrl ( name ) ? name : `styles/${ config . style } /${ name } .json` )
288- )
289- let result = await fetchRegistry ( urls )
282+ const uniqueRegistryDependencies = Array . from ( new Set ( registryDependencies ) )
283+ let result = await fetchRegistry ( uniqueRegistryDependencies )
290284 const payload = z . array ( registryItemSchema ) . parse ( result )
291285
292286 if ( ! payload ) {
293287 return null
294288 }
295289
296- // If we're resolving the index, we want it to go first.
290+ // If we're resolving the index, we want to fetch
291+ // the theme item if a base color is provided.
292+ // We do this for index only.
293+ // Other components will ship with their theme tokens.
297294 if ( names . includes ( "index" ) ) {
298- const index = await getRegistryItem ( "index" , config . style )
299- if ( index ) {
300- payload . unshift ( index )
301- }
302-
303- // Fetch the theme item if a base color is provided.
304- // We do this for index only.
305- // Other components will ship with their theme tokens.
306295 if ( config . tailwind . baseColor ) {
307296 const theme = await registryGetTheme ( config . tailwind . baseColor , config )
308297 if ( theme ) {
@@ -346,6 +335,46 @@ export async function registryResolveItemsTree(
346335 }
347336}
348337
338+ async function resolveRegistryDependencies (
339+ url : string ,
340+ config : Config
341+ ) : Promise < string [ ] > {
342+ const visited = new Set < string > ( )
343+ const payload : string [ ] = [ ]
344+
345+ async function resolveDependencies ( itemUrl : string ) {
346+ const url = getRegistryUrl (
347+ isUrl ( itemUrl ) ? itemUrl : `styles/${ config . style } /${ itemUrl } .json`
348+ )
349+
350+ if ( visited . has ( url ) ) {
351+ return
352+ }
353+
354+ visited . add ( url )
355+
356+ try {
357+ const [ result ] = await fetchRegistry ( [ url ] )
358+ const item = registryItemSchema . parse ( result )
359+ payload . push ( url )
360+
361+ if ( item . registryDependencies ) {
362+ for ( const dependency of item . registryDependencies ) {
363+ await resolveDependencies ( dependency )
364+ }
365+ }
366+ } catch ( error ) {
367+ console . error (
368+ `Error fetching or parsing registry item at ${ itemUrl } :` ,
369+ error
370+ )
371+ }
372+ }
373+
374+ await resolveDependencies ( url )
375+ return Array . from ( new Set ( payload ) )
376+ }
377+
349378export async function registryGetTheme ( name : string , config : Config ) {
350379 const baseColor = await getRegistryBaseColor ( name )
351380 if ( ! baseColor ) {
0 commit comments