11import type { ComponentType , SVGProps } from 'react' ;
2-
2+ import { Category , EcosystemElement , Technology } from '../types' ;
33import { Bucket } from './bucket' ;
44import { CloudBees } from './cloudbees' ;
55import { ConfigCat } from './configcat' ;
@@ -19,13 +19,27 @@ import { Statsig } from './statsig';
1919import { FeatBit } from './featbit' ;
2020import { UserDefaults } from './user-defaults' ;
2121import { GrowthBook } from './growthbook' ;
22- import { Category , EcosystemElement , Technology } from '../types' ;
2322import { MultiProvider } from './multi-provider' ;
2423import { Hypertune } from './hypertune' ;
2524import { Confidence } from './confidence' ;
2625import { ConfigBee } from './configbee' ;
2726import { Tggl } from './tggl' ;
2827import { OFREP } from './ofrep' ;
28+ import { SDKS } from '../sdks' ;
29+
30+ const childTechnologyMap = SDKS . reduce (
31+ ( acc , sdk ) => {
32+ if ( sdk . parentTechnology ) {
33+ const key = `${ sdk . category } :${ sdk . parentTechnology } ` ;
34+ if ( ! acc [ key ] ) {
35+ acc [ key ] = [ ] ;
36+ }
37+ acc [ key ] . push ( sdk . technology ) ;
38+ }
39+ return acc ;
40+ } ,
41+ { } as Record < string , Technology [ ] > ,
42+ ) ;
2943
3044export const PROVIDERS : Provider [ ] = [
3145 Bucket ,
@@ -55,27 +69,66 @@ export const PROVIDERS: Provider[] = [
5569 OFREP ,
5670] ;
5771
72+ // Map of provider name to technology to child technologies
73+ const PROVIDER_TECHNOLOGY_MAP = PROVIDERS . reduce (
74+ ( acc , provider ) => {
75+ const techMap : Record < string , string [ ] > = { } ;
76+
77+ provider . technologies . forEach ( ( { technology, parentTechnology } ) => {
78+ if ( parentTechnology ) {
79+ if ( ! techMap [ parentTechnology ] ) {
80+ techMap [ parentTechnology ] = [ ] ;
81+ }
82+ techMap [ parentTechnology ] . push ( technology ) ;
83+ }
84+ } ) ;
85+
86+ if ( Object . keys ( techMap ) . length > 0 ) {
87+ acc [ provider . name ] = techMap ;
88+ }
89+
90+ return acc ;
91+ } ,
92+ { } as Record < string , Record < string , string [ ] > > ,
93+ ) ;
94+
5895export const ECOSYSTEM_PROVIDERS : EcosystemElement [ ] = PROVIDERS . map ( ( provider ) => {
59- return provider . technologies . map ( ( { category, href, technology, vendorOfficial } ) : EcosystemElement => {
60- return {
61- vendor : provider . name ,
62- title :
63- technology === 'JavaScript'
64- ? `${ provider . name } ${ technology } ${ category [ 0 ] === 'Client' ? 'Web' : 'Node.js' } Provider`
65- : `${ provider . name } ${ technology } ${ category } Provider` ,
66- description : ! provider . description
67- ? createDefaultDescription ( provider . name , vendorOfficial )
68- : typeof provider . description === 'string'
69- ? provider . description
70- : provider . description ( vendorOfficial ) ,
71- type : 'Provider' ,
72- logo : provider . logo ,
73- href,
74- technology,
75- vendorOfficial,
76- category,
77- } ;
78- } ) ;
96+ return provider . technologies . map (
97+ ( { category, href, technology, parentTechnology, vendorOfficial } ) : EcosystemElement => {
98+ // Create a list of supported technologies for a provider, for example: a base Web Provider will power React / Angular SDKs.
99+ // Filter out creating multiple entries for if a provider has a child provider for the base web provider.
100+ const allTechnologies = [ technology , parentTechnology ] . filter ( Boolean ) ;
101+ const key = `${ category [ 0 ] } :${ technology } ` ;
102+ if ( childTechnologyMap [ key ] ) {
103+ allTechnologies . push (
104+ ...childTechnologyMap [ key ] . filter ( ( t ) => {
105+ return ! PROVIDER_TECHNOLOGY_MAP [ provider . name ] ?. [ technology ] ?. includes ( t ) ;
106+ } ) ,
107+ ) ;
108+ }
109+
110+ return {
111+ vendor : provider . name ,
112+ title :
113+ technology === 'JavaScript' || parentTechnology === 'JavaScript'
114+ ? `${ provider . name } ${ technology } ${ category [ 0 ] === 'Client' ? 'Web' : 'Node.js' } Provider`
115+ : `${ provider . name } ${ technology } ${ category } Provider` ,
116+ description : ! provider . description
117+ ? createDefaultDescription ( provider . name , vendorOfficial )
118+ : typeof provider . description === 'string'
119+ ? provider . description
120+ : provider . description ( vendorOfficial ) ,
121+ type : 'Provider' ,
122+ logo : provider . logo ,
123+ href,
124+ allTechnologies,
125+ technology,
126+ parentTechnology,
127+ vendorOfficial,
128+ category,
129+ } ;
130+ } ,
131+ ) ;
79132} ) . flat ( ) ;
80133
81134function createDefaultDescription ( vendor : string , official : boolean ) : string {
@@ -87,7 +140,13 @@ function createDefaultDescription(vendor: string, official: boolean): string {
87140export type Provider = {
88141 name : string ;
89142 logo : ComponentType < SVGProps < SVGSVGElement > > ;
90- technologies : Array < { technology : Technology ; vendorOfficial : boolean ; href : string ; category : Category [ ] } > ;
143+ technologies : Array < {
144+ technology : Technology ;
145+ parentTechnology ?: Technology ;
146+ vendorOfficial : boolean ;
147+ href : string ;
148+ category : Category [ ] ;
149+ } > ;
91150 description ?: string | ( ( vendorSupported : boolean ) => string ) ;
92151 excludeFromLandingPage ?: boolean ;
93152} ;
0 commit comments