oc-template-elm-compiler
Version:
Compiler for the Elm OC template
86 lines (71 loc) • 2.43 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = elmOCProviderTemplate;
const extractName = (path) => path.match(/(\w+)\.elm$/)[1];
const removeJsExtension = (path) => path.replace(/\.(t|j)s?$/, '');
function elmEntry({ viewPath, providerFunctions }) {
return `
import { Elm } from '${viewPath}';
function renderer(props, node) {
const { _baseUrl, _componentName, _componentVersion, _staticPath, ...rest } = props;
const app = Elm["${extractName(viewPath)}"].init({
node,
flags: rest
})
${providerFunctions}
if (app.ports && app.ports.getData) {
app.ports.getData.subscribe(parameters => {
getData(parameters, (err, data) => {
if (err && process.env.NODE_ENV !== 'production') {
console.error('Error requesting OC Data', err);
}
if (app.ports.dataReceiver) {
app.ports.dataReceiver.send(err || data);
}
});
});
}
return app;
}
renderer.component = Elm["${extractName(viewPath)}"];
export default renderer;
`;
}
function jsEntry({ viewPath, providerFunctions }) {
return `
import config from '${removeJsExtension(viewPath)}';
const { js, program } = config;
if (!program) throw new Error('Missing program in config');
if (!program.init) throw new Error('Program does not look like an elm instance (missing init)');
function renderer(props, node) {
const { _baseUrl, _componentName, _componentVersion, _staticPath, ...rest } = props;
const app = program.init({
node,
flags: rest
})
${providerFunctions}
if (app.ports && app.ports.getData) {
app.ports.getData.subscribe(parameters => {
getData({ _baseUrl, _componentName, _componentVersion }, parameters, (err, data) => {
if (err && process.env.NODE_ENV !== 'production') {
console.error('Error requesting OC Data', err);
}
if (app.ports.dataReceiver) {
app.ports.dataReceiver.send(err || data);
}
});
});
}
js && js(app);
return app;
}
renderer.component = program;
export default renderer;
`;
}
function elmOCProviderTemplate({ viewPath, providerFunctions }) {
if (viewPath.endsWith('.elm')) {
return elmEntry({ viewPath, providerFunctions });
}
return jsEntry({ viewPath, providerFunctions });
}