Skip to content

Commit ee52e98

Browse files
committed
Add experimental support for transformers
1 parent e016f3c commit ee52e98

2 files changed

Lines changed: 67 additions & 3 deletions

File tree

cli/local_http.js

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
const fs = require('fs');
2+
const path = require('path');
3+
14
const { Daemon, FunctionParser } = require('functionscript');
25
const LocalGateway = require('./local_gateway');
3-
const path = require('path');
46
const chalk = require('chalk');
57

68
const 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);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
},
3636
"dependencies": {
3737
"api-res": "^0.0.8",
38-
"async": "^2.0.1",
38+
"async": "^2.6.4",
3939
"chalk": "^1.1.3",
4040
"cmnd": "~0.3.0",
4141
"functionscript": "^2.3.7",

0 commit comments

Comments
 (0)