@@ -3,6 +3,27 @@ import {createReaderCollectionPrioritized} from "@ui5/fs/resourceFactory";
33import BuildReader from "./BuildReader.js" ;
44import WatchHandler from "./helpers/WatchHandler.js" ;
55
6+ /**
7+ * Development server that provides access to built project resources with automatic rebuilding
8+ *
9+ * BuildServer watches project sources for changes and automatically rebuilds affected projects
10+ * on-demand. It provides readers for accessing built resources and emits events for build
11+ * completion and source changes.
12+ *
13+ * The server maintains separate readers for:
14+ * - All projects (root + dependencies)
15+ * - Root project only
16+ * - Dependencies only
17+ *
18+ * Projects are built lazily when their resources are first requested, and rebuilt automatically
19+ * when source files change.
20+ *
21+ * @class
22+ * @extends EventEmitter
23+ * @fires BuildServer#buildFinished
24+ * @fires BuildServer#sourcesChanged
25+ * @fires BuildServer#error
26+ */
627class BuildServer extends EventEmitter {
728 #graph;
829 #projectBuilder;
@@ -12,6 +33,18 @@ class BuildServer extends EventEmitter {
1233 #dependenciesReader;
1334 #projectReaders = new Map ( ) ;
1435
36+ /**
37+ * Creates a new BuildServer instance
38+ *
39+ * Initializes readers for different project combinations, sets up file watching,
40+ * and optionally performs an initial build of specified dependencies.
41+ *
42+ * @public
43+ * @param {@ui5/project/graph/ProjectGraph } graph Project graph containing all projects
44+ * @param {@ui5/project/build/ProjectBuilder } projectBuilder Builder instance for executing builds
45+ * @param {string[] } initialBuildIncludedDependencies Project names to include in initial build
46+ * @param {string[] } initialBuildExcludedDependencies Project names to exclude from initial build
47+ */
1548 constructor ( graph , projectBuilder , initialBuildIncludedDependencies , initialBuildExcludedDependencies ) {
1649 super ( ) ;
1750 this . #graph = graph ;
@@ -64,18 +97,57 @@ class BuildServer extends EventEmitter {
6497 } ) ;
6598 }
6699
100+ /**
101+ * Gets a reader for all projects (root and dependencies)
102+ *
103+ * Returns a reader that provides access to built resources from all projects in the graph.
104+ * Projects are built on-demand when their resources are requested.
105+ *
106+ * @public
107+ * @returns {BuildReader } Reader for all projects
108+ */
67109 getReader ( ) {
68110 return this . #allReader;
69111 }
70112
113+ /**
114+ * Gets a reader for the root project only
115+ *
116+ * Returns a reader that provides access to built resources from only the root project,
117+ * excluding all dependencies. The root project is built on-demand when its resources
118+ * are requested.
119+ *
120+ * @public
121+ * @returns {BuildReader } Reader for root project
122+ */
71123 getRootReader ( ) {
72124 return this . #rootReader;
73125 }
74126
127+ /**
128+ * Gets a reader for dependencies only (excluding root project)
129+ *
130+ * Returns a reader that provides access to built resources from all transitive
131+ * dependencies of the root project. Dependencies are built on-demand when their
132+ * resources are requested.
133+ *
134+ * @public
135+ * @returns {BuildReader } Reader for all dependencies
136+ */
75137 getDependenciesReader ( ) {
76138 return this . #dependenciesReader;
77139 }
78140
141+ /**
142+ * Gets a reader for a single project, building it if necessary
143+ *
144+ * Checks if the project has already been built and returns its reader from cache.
145+ * If not built, waits for any in-progress build, then triggers a build for the
146+ * requested project.
147+ *
148+ * @param {string } projectName Name of the project to get reader for
149+ * @returns {Promise<@ui5/fs/AbstractReader> } Reader for the built project
150+ */
79151 async #getReaderForProject( projectName ) {
80152 if ( this . #projectReaders. has ( projectName ) ) {
81153 return this . #projectReaders. get ( projectName ) ;
@@ -101,6 +173,16 @@ class BuildServer extends EventEmitter {
101173 return this . #projectReaders. get ( projectName ) ;
102174 }
103175
176+ /**
177+ * Gets a combined reader for multiple projects, building them if necessary
178+ *
179+ * Determines which projects need to be built, waits for any in-progress build,
180+ * then triggers a build for any missing projects. Returns a prioritized collection
181+ * reader combining all requested projects.
182+ *
183+ * @param {string[] } projectNames Array of project names to get readers for
184+ * @returns {Promise<@ui5/fs/ReaderCollection> } Combined reader for all requested projects
185+ */
104186 async #getReaderForProjects( projectNames ) {
105187 let projectsRequiringBuild = [ ] ;
106188 for ( const projectName of projectNames ) {
@@ -140,6 +222,15 @@ class BuildServer extends EventEmitter {
140222 return this . #getReaderForCachedProjects( projectNames ) ;
141223 }
142224
225+ /**
226+ * Creates a combined reader for already-built projects
227+ *
228+ * Retrieves readers from the cache for the specified projects and combines them
229+ * into a prioritized reader collection.
230+ *
231+ * @param {string[] } projectNames Array of project names to combine
232+ * @returns {@ui5/fs/ReaderCollection } Combined reader for cached projects
233+ */
143234 #getReaderForCachedProjects( projectNames ) {
144235 const readers = [ ] ;
145236 for ( const projectName of projectNames ) {
@@ -181,6 +272,15 @@ class BuildServer extends EventEmitter {
181272 // return this.#allProjectsReader;
182273 // }
183274
275+ /**
276+ * Handles completion of a project build
277+ *
278+ * Caches readers for all built projects and emits the buildFinished event
279+ * with the list of project names that were built.
280+ *
281+ * @param {string[] } projectNames Array of project names that were built
282+ * @fires BuildServer#buildFinished
283+ */
184284 #projectBuildFinished( projectNames ) {
185285 for ( const projectName of projectNames ) {
186286 this . #projectReaders. set ( projectName ,
@@ -190,5 +290,32 @@ class BuildServer extends EventEmitter {
190290 }
191291}
192292
293+ /**
294+ * Build finished event
295+ *
296+ * Emitted when one or more projects have finished building.
297+ *
298+ * @event BuildServer#buildFinished
299+ * @param {string[] } projectNames Array of project names that were built
300+ */
301+
302+ /**
303+ * Sources changed event
304+ *
305+ * Emitted when source files have changed and affected projects have been invalidated.
306+ *
307+ * @event BuildServer#sourcesChanged
308+ * @param {string[] } changedResourcePaths Array of changed resource paths
309+ */
310+
311+ /**
312+ * Error event
313+ *
314+ * Emitted when an error occurs during watching or building.
315+ *
316+ * @event BuildServer#error
317+ * @param {Error } error The error that occurred
318+ */
319+
193320
194321export default BuildServer ;
0 commit comments