@@ -183,25 +183,32 @@ interface FunctionInfo {
183183 port : number ;
184184}
185185
186+ const K8S_TEMPLATES_DIR : string = path . resolve ( TEMPLATES_DIR , 'k8s' ) ;
187+
188+ function readTemplate ( name : string ) : string {
189+ return fs . readFileSync ( path . join ( K8S_TEMPLATES_DIR , name ) , 'utf-8' ) ;
190+ }
191+
192+ function renderTemplate ( template : string , vars : Record < string , string > ) : string {
193+ let result = template ;
194+ for ( const [ key , value ] of Object . entries ( vars ) ) {
195+ result = result . replace ( new RegExp ( `\\{\\{${ key } \\}\\}` , 'g' ) , value ) ;
196+ }
197+ return result ;
198+ }
199+
186200function generateFunctionsConfigMap ( fns : FunctionInfo [ ] , perFunction ?: FunctionInfo ) : void {
187201 const targetFns = perFunction ? [ perFunction ] : fns ;
188- const jobsSupported = targetFns . map ( ( fn ) => fn . name ) . join ( ',' ) ;
189202 const gatewayMap : Record < string , string > = { } ;
190203 for ( const fn of targetFns ) {
191204 gatewayMap [ fn . name ] = `http://${ fn . name } .${ K8S_NAMESPACE } .svc.cluster.local` ;
192205 }
193206
194- const yaml = [
195- '# AUTO-GENERATED by scripts/generate.ts — do not edit manually.' ,
196- 'apiVersion: v1' ,
197- 'kind: ConfigMap' ,
198- 'metadata:' ,
199- ' name: functions-registry' ,
200- 'data:' ,
201- ` JOBS_SUPPORTED: "${ jobsSupported } "` ,
202- ` INTERNAL_GATEWAY_DEVELOPMENT_MAP: '${ JSON . stringify ( gatewayMap ) } '` ,
203- '' ,
204- ] . join ( '\n' ) ;
207+ const template = readTemplate ( 'functions-configmap.yaml' ) ;
208+ const yaml = renderTemplate ( template , {
209+ jobs_supported : targetFns . map ( ( fn ) => fn . name ) . join ( ',' ) ,
210+ gateway_map : JSON . stringify ( gatewayMap ) ,
211+ } ) ;
205212
206213 if ( perFunction ) {
207214 const dir = path . join ( GENERATED_DIR , perFunction . dir , 'k8s' ) ;
@@ -213,70 +220,24 @@ function generateFunctionsConfigMap(fns: FunctionInfo[], perFunction?: FunctionI
213220}
214221
215222function generateSkaffoldYaml ( fns : FunctionInfo [ ] ) : void {
216- const buildBlock = [
217- ' build:' ,
218- ' artifacts:' ,
219- ' - image: constructive-functions' ,
220- ' context: .' ,
221- ' docker:' ,
222- ' dockerfile: Dockerfile.dev' ,
223- ' sync:' ,
224- ' manual:' ,
225- " - src: 'functions/**/*.ts'" ,
226- ' dest: /usr/src/app' ,
227- ' local:' ,
228- ' push: false' ,
229- ] . join ( '\n' ) ;
230-
231- const sharedPortForwards = [
232- ' - resourceType: service' ,
233- ' resourceName: knative-job-service' ,
234- ` namespace: ${ K8S_NAMESPACE } ` ,
235- ' port: 8080' ,
236- ' localPort: 8080' ,
237- ' - resourceType: service' ,
238- ' resourceName: postgres' ,
239- ` namespace: ${ K8S_NAMESPACE } ` ,
240- ' port: 5432' ,
241- ' localPort: 5432' ,
242- ' - resourceType: service' ,
243- ' resourceName: constructive-server' ,
244- ` namespace: ${ K8S_NAMESPACE } ` ,
245- ' port: 3000' ,
246- ' localPort: 3002' ,
247- ] . join ( '\n' ) ;
248-
249- // Per-function profiles
250- const perFnProfiles : string [ ] = [ ] ;
251- for ( const fn of fns ) {
252- perFnProfiles . push ( [
253- ` - name: ${ fn . name } ` ,
254- buildBlock ,
255- ' manifests:' ,
256- ' kustomize:' ,
257- ' paths:' ,
258- ' - k8s/overlays/local-simple' ,
259- ' rawYaml:' ,
260- ` - generated/${ fn . dir } /k8s/local-deployment.yaml` ,
261- ` - generated/${ fn . dir } /k8s/functions-configmap.yaml` ,
262- ' deploy:' ,
263- ' kubectl:' ,
264- ` defaultNamespace: ${ K8S_NAMESPACE } ` ,
265- ' portForward:' ,
266- ' - resourceType: service' ,
267- ` resourceName: ${ fn . name } ` ,
268- ` namespace: ${ K8S_NAMESPACE } ` ,
269- ' port: 80' ,
270- ` localPort: ${ fn . port } ` ,
271- sharedPortForwards ,
272- ] . join ( '\n' ) ) ;
273- }
274-
275- // local-simple: all functions
223+ const profileTemplate = readTemplate ( 'skaffold-profile.yaml' ) ;
224+ const skaffoldTemplate = readTemplate ( 'skaffold.yaml' ) ;
225+
226+ // Render per-function profiles from template
227+ const perFnProfiles = fns . map ( ( fn ) =>
228+ renderTemplate ( profileTemplate , {
229+ name : fn . name ,
230+ dir : fn . dir ,
231+ port : String ( fn . port ) ,
232+ namespace : K8S_NAMESPACE ,
233+ } ) . trimEnd ( )
234+ ) . join ( '\n' ) ;
235+
236+ // Build dynamic lists for aggregate profiles
276237 const allRawYaml = fns
277238 . map ( ( fn ) => ` - generated/${ fn . dir } /k8s/local-deployment.yaml` )
278239 . join ( '\n' ) ;
279- const allFnPortForwards = fns
240+ const allPortForwards = fns
280241 . map ( ( fn ) => [
281242 ' - resourceType: service' ,
282243 ` resourceName: ${ fn . name } ` ,
@@ -286,56 +247,12 @@ function generateSkaffoldYaml(fns: FunctionInfo[]): void {
286247 ] . join ( '\n' ) )
287248 . join ( '\n' ) ;
288249
289- const localSimpleProfile = [
290- ' # All functions together.' ,
291- ' - name: local-simple' ,
292- buildBlock ,
293- ' manifests:' ,
294- ' kustomize:' ,
295- ' paths:' ,
296- ' - k8s/overlays/local-simple' ,
297- ' rawYaml:' ,
298- allRawYaml ,
299- ' - generated/functions-configmap.yaml' ,
300- ' deploy:' ,
301- ' kubectl:' ,
302- ` defaultNamespace: ${ K8S_NAMESPACE } ` ,
303- ' portForward:' ,
304- allFnPortForwards ,
305- sharedPortForwards ,
306- ] . join ( '\n' ) ;
307-
308- // local (Knative): no rawYaml, uses kustomize overlay
309- const localKnativeProfile = [
310- ' # Full Knative setup — requires `cd k8s && make operators-knative-only` first.' ,
311- ' - name: local' ,
312- buildBlock ,
313- ' manifests:' ,
314- ' kustomize:' ,
315- ' paths:' ,
316- ' - k8s/overlays/local' ,
317- ' portForward:' ,
318- allFnPortForwards ,
319- sharedPortForwards ,
320- ] . join ( '\n' ) ;
321-
322- const skaffold = [
323- '# AUTO-GENERATED by scripts/generate.ts — do not edit manually.' ,
324- '# To add a function, create functions/<name>/handler.json and run `pnpm generate`.' ,
325- 'apiVersion: skaffold/v4beta11' ,
326- 'kind: Config' ,
327- 'metadata:' ,
328- ' name: constructive-functions' ,
329- '' ,
330- 'profiles:' ,
331- ' # Per-function profiles (infra + single function).' ,
332- ...perFnProfiles . map ( ( p ) => p ) ,
333- '' ,
334- localSimpleProfile ,
335- '' ,
336- localKnativeProfile ,
337- '' ,
338- ] . join ( '\n' ) ;
250+ const skaffold = renderTemplate ( skaffoldTemplate , {
251+ per_function_profiles : perFnProfiles ,
252+ all_raw_yaml : allRawYaml ,
253+ all_port_forwards : allPortForwards ,
254+ namespace : K8S_NAMESPACE ,
255+ } ) ;
339256
340257 const skaffoldPath = path . join ( ROOT , 'skaffold.yaml' ) ;
341258 if ( writeIfChanged ( skaffoldPath , skaffold ) ) {
0 commit comments