UNPKG

aztec

Version:

Node Js Framework for creating API Services

98 lines (77 loc) 2.65 kB
import { extend, isArray } from 'lodash'; import http = require('http'); import fs = require('fs'); const xml = require('xml'); const sendStatus = (data, res: http.ServerResponse): void => { let {status} = data; if (status) { res.statusCode = status; res.statusMessage = http.STATUS_CODES[status]; } }; export const extendServerResponse = (svc, res: http.ServerResponse): http.ServerResponse => { const extendedValues = { status: (data: number): http.ServerResponse => { res.statusCode = data; res.statusMessage = http.STATUS_CODES[data]; return res; }, send: (data): http.ServerResponse => { sendStatus(data, res); switch (svc.get('format')) { case 'json': res.end(JSON.stringify(data)); break; case 'xml': { if (isArray(data)) { let dataAsObject = { collection: {} }; data.forEach((item, i) => { dataAsObject.collection[i] = item; }); if (Object.keys(dataAsObject.collection).length === data.length) { res.write(xml(dataAsObject), 'utf8'); res.end(); break; } } else { res.write(xml(data), 'utf8'); res.end(); break; } } } return res; }, cast: (data): http.ServerResponse => { sendStatus(data, res); switch (svc.get('format')) { case 'json': res.write(JSON.stringify(data), 'utf-8'); break; case 'xml': { if (isArray(data)) { let dataAsObject = { collection: {} }; data.forEach((item, i) => { dataAsObject.collection[i] = item; }); if (Object.keys(dataAsObject.collection).length === data.length) { res.write(xml(dataAsObject), 'utf8'); break; } } else { res.write(xml(data), 'utf8'); break; } } } return res; }, render: (path: string, type: string = 'html'): http.ServerResponse => { if (path.indexOf('.') === -1 || path.indexOf(`.${type}`) === -1) { res.writeHead(200, { 'Content-Type': `text/${type}` }); res.write(fs.readFileSync(`${svc.get('public-path')}/${path}.${type}`, 'utf8')); return res; } else { if (type === 'js') type = 'javascript'; res.writeHead(200, { 'Content-Type': `text/${type}` }); res.write(fs.readFileSync(path, 'utf8')); return res; } }, redirect: (path: string, code = 302): void => { res.writeHead(code, { 'Location': path }); res.end(); } }; return extend(res, extendedValues); };