11import { PubsubAspect , PubsubMain } from '@teambit/pubsub' ;
22import { MainRuntime } from '@teambit/cli' ;
3- import { Component , ComponentAspect } from '@teambit/component' ;
3+ import { Component } from '@teambit/component' ;
44import { DependencyResolverAspect , DependencyResolverMain } from '@teambit/dependency-resolver' ;
55import { EnvsAspect , EnvsMain } from '@teambit/envs' ;
66import { GraphqlAspect , GraphqlMain } from '@teambit/graphql' ;
77import { Slot , SlotRegistry } from '@teambit/harmony' ;
88import { BrowserRuntime } from './browser-runtime' ;
99import { BundlerAspect } from './bundler.aspect' ;
1010import { ComponentServer } from './component-server' ;
11+ import { NewDevServersCreatedEvent } from './events' ;
1112import { BundlerContext } from './bundler-context' ;
1213import { devServerSchema } from './dev-server.graphql' ;
1314import { DevServerService } from './dev-server.service' ;
1415import { BundlerService } from './bundler.service' ;
1516import { DevServer } from './dev-server' ;
1617
1718export type DevServerTransformer = ( devServer : DevServer , { envId } : { envId : string } ) => DevServer ;
18-
19+ export type OnPreDevServerCreated = ( newCompsWithoutDevServer : Component [ ] ) => Promise < void > ;
1920export type BrowserRuntimeSlot = SlotRegistry < BrowserRuntime > ;
2021export type DevServerTransformerSlot = SlotRegistry < DevServerTransformer > ;
22+ export type OnPreDevServerCreatedSlot = SlotRegistry < OnPreDevServerCreated > ;
2123
2224export type BundlerConfig = {
2325 dedicatedEnvDevServers : string [ ] ;
@@ -27,6 +29,11 @@ export type BundlerConfig = {
2729 * bundler extension.
2830 */
2931export class BundlerMain {
32+ /**
33+ * component servers.
34+ */
35+ private _componentServers : ComponentServer [ ] = [ ] ;
36+
3037 constructor (
3138 readonly config : BundlerConfig ,
3239 /**
@@ -52,25 +59,49 @@ export class BundlerMain {
5259 /**
5360 * dev server transformer slot.
5461 */
55- private devServerTransformerSlot : DevServerTransformerSlot
56- ) { }
62+ private devServerTransformerSlot : DevServerTransformerSlot ,
5763
58- /**
59- * load all given components in corresponding dev servers.
60- * @param components defaults to all components in the workspace.
61- */
62- async devServer ( components : Component [ ] ) : Promise < ComponentServer [ ] > {
64+ /**
65+ * pre-dev-server operation slot.
66+ */
67+ private onPreDevServerCreatedSlot : OnPreDevServerCreatedSlot ,
68+
69+ private graphql : GraphqlMain ,
70+ ) {
71+ }
72+
73+ async addNewDevServers ( newCompsWithoutDevServers : Component [ ] ) : Promise < ComponentServer [ ] > {
74+ const newComponents = newCompsWithoutDevServers . filter ( ( component ) => {
75+ return ! this . getComponentServer ( component ) ;
76+ } ) ;
77+
78+ if ( newComponents . length === 0 ) {
79+ return [ ] ;
80+ }
81+
82+ await Promise . all (
83+ this . onPreDevServerCreatedSlot . values ( ) . map ( subscriberFn => subscriberFn ( newComponents ) )
84+ ) ;
85+
86+ return this . devServer ( newComponents , { configureProxy : true } ) ;
87+ }
88+
89+ async devServer ( components : Component [ ] , opts : { configureProxy ?: boolean } = { } ) : Promise < ComponentServer [ ] > {
6390 const envRuntime = await this . envs . createEnvironment ( components ) ;
64- // TODO: this must be refactored away from here. this logic should be in the Preview.
65- // @ts -ignore
66- const servers : ComponentServer [ ] = await envRuntime . runOnce < ComponentServer [ ] > ( this . devService , {
91+ const servers : ComponentServer [ ] = await envRuntime . runOnce < ComponentServer > ( this . devService , {
6792 dedicatedEnvDevServers : this . config . dedicatedEnvDevServers ,
6893 } ) ;
94+ if ( opts . configureProxy ) {
95+ this . pubsub . pub ( BundlerAspect . id , new NewDevServersCreatedEvent (
96+ servers ,
97+ Date . now ( ) ,
98+ this . graphql ,
99+ true
100+ ) ) ;
101+ }
69102 this . _componentServers = servers ;
70-
71103 this . indexByComponent ( ) ;
72-
73- return this . _componentServers ;
104+ return servers ;
74105 }
75106
76107 /**
@@ -84,13 +115,12 @@ export class BundlerMain {
84115 ( componentServer ) =>
85116 componentServer . context . relatedContexts . includes ( envId ) || componentServer . context . id === envId
86117 ) ;
87-
88118 return server ;
89119 }
90120
91121 /**
92122 * compute entry files for bundling components in a given execution context.
93- */
123+ */
94124 async computeEntries ( context : BundlerContext ) {
95125 const slotEntries = await Promise . all (
96126 this . runtimeSlot . values ( ) . map ( async ( browserRuntime ) => browserRuntime . entry ( context ) )
@@ -126,34 +156,69 @@ export class BundlerMain {
126156 }
127157
128158 /**
129- * component servers.
159+ * register a new pre-dev-server compiler.
160+ * @param onPreDevServerCreated
130161 */
131- private _componentServers : null | ComponentServer [ ] ;
162+ registerOnPreDevServerCreated ( onPreDevServerCreated : OnPreDevServerCreated ) {
163+ this . onPreDevServerCreatedSlot . register ( onPreDevServerCreated ) ;
164+ return this ;
165+ }
132166
133- private indexByComponent ( ) { }
167+ private indexByComponent ( ) { }
134168
135- static slots = [ Slot . withType < BrowserRuntime > ( ) , Slot . withType < DevServerTransformerSlot > ( ) ] ;
169+ static slots = [
170+ Slot . withType < BrowserRuntime > ( ) ,
171+ Slot . withType < DevServerTransformerSlot > ( ) ,
172+ Slot . withType < OnPreDevServerCreatedSlot > ( )
173+ ] ;
136174
137175 static runtime = MainRuntime ;
138- static dependencies = [ PubsubAspect , EnvsAspect , GraphqlAspect , DependencyResolverAspect , ComponentAspect ] ;
176+ static dependencies = [
177+ PubsubAspect ,
178+ EnvsAspect ,
179+ GraphqlAspect ,
180+ DependencyResolverAspect ,
181+ ] ;
139182
140183 static defaultConfig = {
141184 dedicatedEnvDevServers : [ ] ,
142185 } ;
143186
144187 static async provider (
145- [ pubsub , envs , graphql , dependencyResolver ] : [ PubsubMain , EnvsMain , GraphqlMain , DependencyResolverMain ] ,
188+ [ pubsub , envs , graphql , dependencyResolver ] :
189+ [
190+ PubsubMain ,
191+ EnvsMain ,
192+ GraphqlMain ,
193+ DependencyResolverMain ,
194+ ] ,
146195 config ,
147- [ runtimeSlot , devServerTransformerSlot ] : [ BrowserRuntimeSlot , DevServerTransformerSlot ]
196+ [ runtimeSlot ,
197+ devServerTransformerSlot ,
198+ onPreDevServerCreatedSlot
199+ ] : [
200+ BrowserRuntimeSlot ,
201+ DevServerTransformerSlot ,
202+ OnPreDevServerCreatedSlot
203+ ]
148204 ) {
205+
149206 const devServerService = new DevServerService ( pubsub , dependencyResolver , runtimeSlot , devServerTransformerSlot ) ;
150- const bundler = new BundlerMain ( config , pubsub , envs , devServerService , runtimeSlot , devServerTransformerSlot ) ;
207+ const bundler = new BundlerMain (
208+ config ,
209+ pubsub ,
210+ envs ,
211+ devServerService ,
212+ runtimeSlot ,
213+ devServerTransformerSlot ,
214+ onPreDevServerCreatedSlot ,
215+ graphql ,
216+ ) ;
151217 envs . registerService ( devServerService , new BundlerService ( ) ) ;
152-
153- graphql . register ( ( ) => devServerSchema ( bundler ) ) ;
218+ graphql . register ( ( ) => devServerSchema ( bundler , graphql ) ) ;
154219
155220 return bundler ;
156221 }
157222}
158223
159- BundlerAspect . addRuntime ( BundlerMain ) ;
224+ BundlerAspect . addRuntime ( BundlerMain ) ;
0 commit comments