@@ -125,3 +125,120 @@ The minification of associated functions is also another major difference. Funct
125125A number of classes are present in the SDKs that cannot be removed without a major version. In order to reduce the size of these classes we have added support for minification of any member that starts with an underscore.
126126
127127Another thing to remember is that the private and readonly only really affect TypeScript. Using JavaScript you can still access and mutate. Our minification of private members starting with an underscore also helps prevent unintentional usage from JavaScript.
128+
129+ ## Repo Organization
130+
131+ The below diagram shows the dependency relationships between the various packages in the LaunchDarkly JavaScript SDKs monorepo.
132+
133+ Packages on the left are shared packages that should be technology agnostic. As you progress to the right, packages are more specific to a technology or implementation.
134+
135+ ` ` ` mermaid
136+ flowchart LR
137+ %% Shared packages
138+ common [shared / common ]
139+ sdk - client [shared / sdk - client ]
140+ sdk - server [shared / sdk - server ]
141+ sdk - server - edge [shared / sdk - server - edge ]
142+ akamai - edgeworker [shared / akamai - edgeworker - sdk ]
143+
144+ %% SDK packages
145+ server - node [sdk / server - node ]
146+ cloudflare [sdk / cloudflare ]
147+ fastly [sdk / fastly ]
148+ react - native [sdk / react - native ]
149+ browser [sdk / browser ]
150+ vercel [sdk / vercel ]
151+ akamai - base [sdk / akamai - base ]
152+ akamai - edgekv [sdk / akamai - edgekv ]
153+ server - ai [sdk / server - ai ]
154+ react - universal [sdk / react - universal ]
155+ svelte [sdk / svelte ]
156+
157+ %% Store packages
158+ redis [store / node - server - sdk - redis ]
159+ dynamodb [store / node - server - sdk - dynamodb ]
160+
161+ %% Telemetry packages
162+ node - otel [telemetry / node - server - sdk - otel ]
163+ browser - telemetry [telemetry / browser - telemetry ]
164+
165+ %% Tooling packages
166+ jest [tooling / jest ]
167+
168+ %% Dependencies between shared packages
169+ common -- > sdk - client
170+ common -- > sdk - server
171+ common -- > sdk - server - edge
172+ common -- > akamai - edgeworker
173+ sdk - server -- > sdk - server - edge
174+
175+ %% Dependencies for SDK packages
176+ sdk - client -- > browser
177+ sdk - client -- > react - native
178+ sdk - client -- > react - universal
179+ sdk - client -- > svelte
180+
181+ sdk - server -- > server - node
182+ sdk - server -- > server - ai
183+
184+ sdk - server - edge -- > cloudflare
185+ sdk - server - edge -- > fastly
186+ sdk - server - edge -- > vercel
187+
188+ akamai - edgeworker -- > akamai - base
189+ akamai - edgeworker -- > akamai - edgekv
190+
191+ %% Dependencies for store packages
192+ sdk - server -- > redis
193+ sdk - server -- > dynamodb
194+
195+ %% Dependencies for telemetry packages
196+ server - node -- > node - otel
197+ browser -- > browser - telemetry
198+
199+ %% Dependencies for tooling packages
200+ react - native - .- > jest
201+
202+ class common ,sdk -client ,sdk -server ,sdk -server -edge ,akamai -edgeworker shared
203+ class server -node ,cloudflare ,fastly ,react -native ,browser ,vercel ,akamai -base ,akamai -edgekv ,server -ai ,react -universal ,svelte sdk
204+ class redis ,dynamodb store
205+ class node -otel ,browser -telemetry telemetry
206+ class jest tooling
207+ ```
208+
209+ There are a number of categories of packages in the monorepo :
210+
211+ 1. **Shared packages ** (pink ): Common code shared across multiple SDKs
212+ - `shared /common `:Common code which is intended for use by any SDK type .
213+ - `shared /sdk -client `: Common code for client -side SDKs .
214+ - `shared /sdk -server `: Common code for server -side SDKs
215+ - `shared /sdk -server -edge `: Common code for edge SDKs
216+ - `shared /akamai -edgeworker -sdk `: Common code for Akamai edge worker SDKs
217+
218+ 2. **SDK packages ** (blue ): Actual SDK implementations for different platforms
219+ - Browser , React Native , Server Node , Cloudflare , Fastly , Vercel , Akamai , etc .
220+
221+ 3. **Store packages ** (green ): Persistent storage implementations
222+ - Redis and DynamoDB implementations
223+
224+ 4. **Telemetry packages ** (purple ): Monitoring and telemetry integrations
225+ - OpenTelemetry for Node .js and browser telemetry
226+
227+ 5. **Tooling packages ** (red ): Development and testing tools
228+ - Jest testing utilities
229+
230+ ### Depenencies
231+
232+ In general dependencies should be avoided unless they are absolutely necessary . For each dependency several considerations should be made :
233+
234+ - Size : Each dependency will increase the final bundle size . This is important for the browser SDK where bundle size impacts load time and costs .
235+ - Maintenance : Dependencies can become unmaintained or deprecated over time . This requires that we routinely check dependencies and find replacements if they have become unmaintained .
236+ - Security : Dependencies can have a large surface area of security vulnerabilities . It is rare we would fully utlize a dependency , and as such vulnerabilities often do not apply , but we still need to patch and provide updates .
237+ - Compatibility : Each dependency will need to be compatible with the supported platforms it impacts . At any given point it isn 't certain the potential platforms that could be impacted over time . For instance something may work in every current edge environment , but may not be compatible with a future edge environment .
238+ - Conflicts : Dependencies can introduce conflicts with other dependencies in application code .
239+
240+ We only want to use dependencies for functionality with highly -specified behavior , which are widely used , maintained , and have a large community .
241+
242+ It is most important to avoid dependencies in the common package , sdk -client , and sdk -server packages .
243+
244+ Individual SDK packages have a known execution environment and vetting a dependency is less complex , and some SDKs have specific platform dependencies that must be included . For example the edge SDKs must use their provider 's edge store , and may require dependencies to do so .
0 commit comments