1+ const fs = require ( 'fs' ) ;
2+ const path = require ( 'path' ) ;
3+
14const { Daemon, FunctionParser } = require ( 'functionscript' ) ;
25const LocalGateway = require ( './local_gateway' ) ;
3- const path = require ( 'path' ) ;
46const chalk = require ( 'chalk' ) ;
57
68const processArgs = process . argv . slice ( 2 ) . reduce ( ( processArgs , val ) => {
@@ -30,6 +32,42 @@ if (cluster.isMaster) {
3032 process . exit ( 1 ) ;
3133 }
3234
35+ try {
36+ stdlib = require ( path . join ( process . cwd ( ) , 'stdlib.json' ) ) ;
37+ } catch ( e ) {
38+ console . error ( e ) ;
39+ console . error ( new Error ( 'Invalid stdlib.json in this directory' ) ) ;
40+ process . exit ( 1 ) ;
41+ }
42+
43+ // Load transformers
44+ let transformers = [ ] ;
45+ if ( stdlib . transformers ) {
46+ if ( ! Array . isArray ( stdlib . transformers ) ) {
47+ throw new Error ( `"stdlib.json": "transformers" must be an array` ) ;
48+ }
49+ transformers = stdlib . transformers . map ( transformerData => {
50+ let Transformer ;
51+ let transformer ;
52+ if ( ! transformerData . pathname ) {
53+ throw new Error ( `"stdlib.json": "transformers" object must contain "pathname"` ) ;
54+ }
55+ try {
56+ Transformer = require ( path . join ( process . cwd ( ) , transformerData . pathname ) ) ;
57+ let config = transformerData . config || { } ;
58+ if ( ! config || typeof config !== 'object' ) {
59+ throw new Error ( `"stdlib.json": "transformers[].config" must be empty or contain an object` ) ;
60+ }
61+ transformer = new Transformer ( config ) ;
62+ transformer . config = transformerData . config ;
63+ } catch ( e ) {
64+ console . error ( e ) ;
65+ throw new Error ( `Could not load transformer: "${ transformerData . pathname } "` ) ;
66+ }
67+ return transformer ;
68+ } ) ;
69+ }
70+
3371 // Cluster to Gateway
3472 let gateway = new LocalGateway ( {
3573 port : PORT ,
@@ -38,9 +76,35 @@ if (cluster.isMaster) {
3876 } ) ;
3977 let functionParser = new FunctionParser ( ) ;
4078 try {
79+ let preloadFiles = { } ;
80+ transformers . forEach ( transformer => {
81+ let name = transformer . name || transformer . constructor . name ;
82+ let t = new Date ( ) . valueOf ( ) ;
83+ console . log ( `\n[Transformer: ${ name } ] Execution starting` ) ;
84+ console . log ( `[Transformer: ${ name } ] Using config ${ JSON . stringify ( transformer . config ) } ` ) ;
85+ let files = transformer . compile ( process . cwd ( ) , env . local ) ;
86+ Object . keys ( files ) . forEach ( pathname => {
87+ if ( preloadFiles [ pathname ] ) {
88+ throw new Error ( `[Transformer: ${ name } ]: Previous Transformer has already defined "${ pathname } "` ) ;
89+ } else {
90+ preloadFiles [ pathname ] = files [ pathname ] ;
91+ }
92+ } ) ;
93+ let t0 = new Date ( ) . valueOf ( ) - t ;
94+ console . log ( `[Transformer: ${ name } ] Executed in ${ t0 } ms` ) ;
95+ } ) ;
4196 gateway . service ( ROUTE ) ;
4297 gateway . environment ( env . local || { } ) ;
43- gateway . define ( functionParser . load ( process . cwd ( ) , 'functions' , 'www' ) ) ;
98+ gateway . define (
99+ functionParser . load (
100+ process . cwd ( ) ,
101+ 'functions' ,
102+ 'www' ,
103+ null ,
104+ preloadFiles
105+ ) ,
106+ preloadFiles
107+ ) ;
44108 } catch ( err ) {
45109 console . error ( err ) ;
46110 process . exit ( 1 ) ;
0 commit comments