Convert backend code to ES modules

Bundling code now with Rollup for its flat bundling and tree shaking
support. Front end code still goes through Webpack for browser support.
This commit is contained in:
Zaid Abdulla committed 2019-02-04 23:47:54 -08:00
1 parent 824639976f
commit 1e41c72d60
62 files changed
+718 -898

No files matched your search

+13 -22
View File
@@ -1,14 +1,13 @@
"use strict";
const http = require("http");
const https = require("https");
const url = require("url");
import http from "http";
import https from "https";
import url from "url";
import * as config from "../config";
import * as db from "./db";
import * as mongodbFunctions from "./mongodb-functions";
const config = require("../config");
const db = require("./db");
const mongodbFunctions = require("./mongodb-functions");
function filterToMongoQuery(filter, negate = false, res = {}) {
export function filterToMongoQuery(filter, negate = false, res = {}) {
const op = filter[0];
if ((!negate && op === "AND") || (negate && op === "OR")) {
@@ -66,7 +65,7 @@ function filterToMongoQuery(filter, negate = false, res = {}) {
return res;
}
function deleteResource(resource, id) {
export function deleteResource(resource, id) {
return new Promise((resolve, reject) => {
const resourceUrl =
resource === "virtualParameters" ? "virtual_parameters" : resource;
@@ -142,7 +141,7 @@ function postTask(task, connectionRequest, callback) {
.end(JSON.stringify(task));
}
function postTasks(deviceId, tasks) {
export function postTasks(deviceId, tasks) {
return new Promise((resolve, reject) => {
let connectionRequestStatus;
const promises = [];
@@ -206,7 +205,7 @@ function postTasks(deviceId, tasks) {
});
}
function updateTags(deviceId, tags) {
export function updateTags(deviceId, tags) {
return Promise.all(
Object.entries(tags).map(
([tag, onOff]) =>
@@ -235,7 +234,7 @@ function updateTags(deviceId, tags) {
);
}
function ping(host) {
export function ping(host) {
return new Promise((resolve, reject) => {
const options = url.parse(
`http://127.0.0.1:${config.get("NBI_PORT")}/ping/${encodeURIComponent(
@@ -295,7 +294,7 @@ function ping(host) {
});
}
function putResource(resource, id, data) {
export function putResource(resource, id, data) {
return new Promise((resolve, reject) => {
const resourceUrl =
resource === "virtualParameters" ? "virtual_parameters" : resource;
@@ -348,7 +347,7 @@ function putResource(resource, id, data) {
});
}
function putFile(id, metadata, fileStream) {
export function putFile(id, metadata, fileStream) {
return new Promise((resolve, reject) => {
const options = url.parse(
`http://127.0.0.1:${config.get("NBI_PORT")}/files/${encodeURIComponent(
@@ -372,11 +371,3 @@ function putFile(id, metadata, fileStream) {
fileStream.pipe(req);
});
}
exports.postTasks = postTasks;
exports.deleteResource = deleteResource;
exports.putResource = putResource;
exports.updateTags = updateTags;
exports.filterToMongoQuery = filterToMongoQuery;
exports.ping = ping;
exports.putFile = putFile;
+17 -20
View File
@@ -1,13 +1,15 @@
"use strict";
const stream = require("stream");
const Router = require("koa-router");
const db = require("./db");
const apiFunctions = require("./api-functions");
const expression = require("../common/expression");
const logger = require("../logger");
import stream from "stream";
import Router from "koa-router";
import * as db from "./db";
import * as apiFunctions from "./api-functions";
import { evaluate, and, extractParams } from "../common/expression";
import { parse } from "../common/expression-parser";
import * as logger from "../logger";
const router = new Router();
export default router;
function logUnauthorizedWarning(log) {
log.message += " not authorized";
@@ -87,8 +89,7 @@ router.get(`/devices/:id.csv`, async ctx => {
for (const [resource, flags] of Object.entries(resources)) {
router.head(`/${resource}`, async (ctx, next) => {
let filter = true;
if (ctx.request.query.filter)
filter = expression.parse(ctx.request.query.filter);
if (ctx.request.query.filter) filter = parse(ctx.request.query.filter);
const log = {
message: `Count ${resource}`,
@@ -103,7 +104,7 @@ for (const [resource, flags] of Object.entries(resources)) {
// Exclude temporary tasks and faults
if (resource === "tasks" || resource === "faults") {
filter = expression.and(filter, [
filter = and(filter, [
"NOT",
["<", ["PARAM", "expiry"], Date.now() + 60000]
]);
@@ -121,8 +122,7 @@ for (const [resource, flags] of Object.entries(resources)) {
router.get(`/${resource}`, async (ctx, next) => {
const options = {};
let filter = true;
if (ctx.request.query.filter)
filter = expression.parse(ctx.request.query.filter);
if (ctx.request.query.filter) filter = parse(ctx.request.query.filter);
if (ctx.request.query.limit) options.limit = +ctx.request.query.limit;
if (ctx.request.query.skip) options.skip = +ctx.request.query.skip;
if (ctx.request.query.sort)
@@ -150,7 +150,7 @@ for (const [resource, flags] of Object.entries(resources)) {
// Exclude temporary tasks and faults
if (resource === "tasks" || resource === "faults") {
filter = expression.and(filter, [
filter = and(filter, [
"NOT",
["<", ["PARAM", "expiry"], Date.now() + 60000]
]);
@@ -173,8 +173,7 @@ for (const [resource, flags] of Object.entries(resources)) {
router.get(`/${resource}.csv`, async (ctx, next) => {
const options = { projection: {} };
let filter = true;
if (ctx.request.query.filter)
filter = expression.parse(ctx.request.query.filter);
if (ctx.request.query.filter) filter = parse(ctx.request.query.filter);
if (ctx.request.query.limit) options.limit = +ctx.request.query.limit;
if (ctx.request.query.skip) options.skip = +ctx.request.query.skip;
if (ctx.request.query.sort)
@@ -198,14 +197,14 @@ for (const [resource, flags] of Object.entries(resources)) {
const now = Date.now();
for (const [k, v] of Object.entries(columns)) {
const e = expression.evaluate(expression.parse(v), null, now);
const e = evaluate(parse(v), null, now);
columns[k] = e;
for (const p of expression.extractParams(e)) options.projection[p] = 1;
for (const p of extractParams(e)) options.projection[p] = 1;
}
// Exclude temporary tasks and faults
if (resource === "tasks" || resource === "faults") {
filter = expression.and(filter, [
filter = and(filter, [
"NOT",
["<", ["PARAM", "expiry"], Date.now() + 60000]
]);
@@ -222,7 +221,7 @@ for (const [resource, flags] of Object.entries(resources)) {
);
await db.query(resource, filter, options, obj => {
const arr = Object.values(columns).map(exp => {
const v = expression.evaluate(exp, obj, null, e => {
const v = evaluate(exp, obj, null, e => {
if (Array.isArray(e)) {
if (e[0] === "PARAM") {
if (resource === "devices") {
@@ -481,5 +480,3 @@ router.post("/devices/:id/tags", async (ctx, next) => {
router.get("/ping/:host", async ctx => {
ctx.body = await apiFunctions.ping(ctx.params.host);
});
module.exports = router;
+9 -14
View File
@@ -1,9 +1,9 @@
"use strict";
const mongodb = require("mongodb");
const config = require("../config");
const mongodbFunctions = require("./mongodb-functions");
const expression = require("../common/expression");
import { MongoClient } from "mongodb";
import * as config from "../config";
import * as mongodbFunctions from "./mongodb-functions";
import * as expression from "../common/expression";
const CACHE_TTL = 300000;
@@ -24,7 +24,7 @@ function getClient() {
if (!_clientPromise) {
_clientPromise = new Promise((resolve, reject) => {
const CONNECTION_URL = config.get("MONGODB_CONNECTION_URL");
mongodb.MongoClient.connect(
MongoClient.connect(
CONNECTION_URL,
{ useNewUrlParser: true },
(err, client) => {
@@ -39,7 +39,7 @@ function getClient() {
return _clientPromise;
}
function cache(key, valueGetter, ttl) {
export function cache(key, valueGetter, ttl) {
return new Promise((resolve, reject) => {
getClient()
.then(client => {
@@ -72,7 +72,7 @@ function cache(key, valueGetter, ttl) {
});
}
function query(resource, filter, options, callback) {
export function query(resource, filter, options, callback) {
options = options || {};
let q;
filter = expression.evaluate(filter, null, Date.now());
@@ -158,7 +158,7 @@ function query(resource, filter, options, callback) {
});
}
function count(resource, filter) {
export function count(resource, filter) {
let q;
filter = expression.evaluate(filter, null, Date.now());
@@ -187,15 +187,10 @@ function count(resource, filter) {
});
}
function disconnect() {
export function disconnect() {
if (_clientPromise) {
_clientPromise.then(client => {
client.close();
});
}
}
exports.query = query;
exports.count = count;
exports.cache = cache;
exports.disconnect = disconnect;
+25 -43
View File
@@ -1,10 +1,10 @@
"use strict";
const mongodb = require("mongodb");
const expressionParser = require("../common/expression-parser");
const expression = require("../common/expression");
import { ObjectID } from "mongodb";
import { map, parse, stringify } from "../common/expression-parser";
import { likePatternToRegExp } from "../common/expression";
function processDeviceFilter(filter) {
return expressionParser.map(filter, exp => {
export function processDeviceFilter(filter) {
return map(filter, exp => {
if (!Array.isArray(exp)) return exp;
if (exp[0] === "PARAM") {
@@ -32,7 +32,7 @@ function processDeviceFilter(filter) {
} else if (
["=", "<>", ">", ">=", "<", "<=", "LIKE", "NOT LIKE"].includes(exp[0])
) {
let e = expressionParser.map(exp, ee => {
let e = map(exp, ee => {
if (
Array.isArray(ee) &&
ee[0] === "PARAM" &&
@@ -54,13 +54,12 @@ function processDeviceFilter(filter) {
});
}
function processTasksFilter(filter) {
return expressionParser.map(filter, exp => {
export function processTasksFilter(filter) {
return map(filter, exp => {
if (!Array.isArray(exp)) return exp;
if (["=", "<>", ">", ">=", "<", "<="].includes(exp[0])) {
const e = exp.slice();
if (e[1][0] === "PARAM" && e[1][1] === "_id")
e[2] = new mongodb.ObjectID(e[2]);
if (e[1][0] === "PARAM" && e[1][1] === "_id") e[2] = new ObjectID(e[2]);
else if (e[1][0] === "PARAM" && e[1][1] === "timestamp")
e[2] = new Date(e[2]);
else if (e[1][0] === "PARAM" && e[1][1] === "expiry")
@@ -71,8 +70,8 @@ function processTasksFilter(filter) {
});
}
function processFaultsFilter(filter) {
return expressionParser.map(filter, exp => {
export function processFaultsFilter(filter) {
return map(filter, exp => {
if (!Array.isArray(exp)) return exp;
if (["=", "<>", ">", ">=", "<", "<="].includes(exp[0])) {
const e = exp.slice();
@@ -85,7 +84,7 @@ function processFaultsFilter(filter) {
});
}
function filterToMongoQuery(filter, negate = false, res = {}) {
export function filterToMongoQuery(filter, negate = false, res = {}) {
const op = filter[0];
if ((!negate && op === "AND") || (negate && op === "OR")) {
@@ -160,7 +159,7 @@ function filterToMongoQuery(filter, negate = false, res = {}) {
param = filter[1][1];
flags = "";
}
const r = expression.likePatternToRegExp(filter[2], filter[3], flags);
const r = likePatternToRegExp(filter[2], filter[3], flags);
if (negate) res[param] = { $not: r };
else res[param] = r;
} else {
@@ -170,7 +169,7 @@ function filterToMongoQuery(filter, negate = false, res = {}) {
return res;
}
function processDeviceProjection(projection) {
export function processDeviceProjection(projection) {
if (!projection) return projection;
const p = {};
for (const [k, v] of Object.entries(projection)) {
@@ -196,7 +195,7 @@ function processDeviceProjection(projection) {
return p;
}
function processDeviceSort(sort) {
export function processDeviceSort(sort) {
if (!sort) return sort;
const s = {};
for (const [k, v] of Object.entries(sort)) {
@@ -217,7 +216,7 @@ function parseDate(d) {
return isNaN(n) ? "" + d : n;
}
function flattenDevice(device) {
export function flattenDevice(device) {
function recursive(input, root, output, timestamp) {
for (const [name, tree] of Object.entries(input)) {
if (!root) {
@@ -361,14 +360,14 @@ function flattenDevice(device) {
return newDevice;
}
function flattenFault(fault) {
export function flattenFault(fault) {
const f = Object.assign({}, fault);
if (f.timestamp) f.timestamp = +f.timestamp;
if (f.expiry) f.expiry = +f.expiry;
return f;
}
function flattenTask(task) {
export function flattenTask(task) {
const t = Object.assign({}, task);
t._id = "" + t._id;
if (t.timestamp) t.timestamp = +t.timestamp;
@@ -443,13 +442,11 @@ function mongoQueryToFilter(query) {
return expressions;
}
function flattenPreset(preset) {
export function flattenPreset(preset) {
const p = Object.assign({}, preset);
if (p.precondition) {
p.precondition = mongoQueryToFilter(JSON.parse(p.precondition));
p.precondition = p.precondition.length
? expression.stringify(p.precondition)
: "";
p.precondition = p.precondition.length ? stringify(p.precondition) : "";
}
if (p.events) {
@@ -474,7 +471,7 @@ function flattenPreset(preset) {
return p;
}
function flattenFile(file) {
export function flattenFile(file) {
const f = {};
f["_id"] = file["_id"];
if (file.metadata) {
@@ -486,10 +483,10 @@ function flattenFile(file) {
return f;
}
function preProcessPreset(data) {
export function preProcessPreset(data) {
const preset = Object.assign({}, data);
preset.precondition = preset.precondition
? filterToMongoQuery(expression.parse(preset.precondition))
? filterToMongoQuery(parse(preset.precondition))
: {};
preset.precondition = JSON.stringify(preset.precondition);
@@ -526,25 +523,10 @@ function preProcessPreset(data) {
return preset;
}
function preProcessProvision(data) {
export function preProcessProvision(data) {
return data.script;
}
function preProcessVirtualParameters(data) {
export function preProcessVirtualParameters(data) {
return data.script;
}
exports.processDeviceFilter = processDeviceFilter;
exports.processTasksFilter = processTasksFilter;
exports.processFaultsFilter = processFaultsFilter;
exports.filterToMongoQuery = filterToMongoQuery;
exports.processDeviceProjection = processDeviceProjection;
exports.processDeviceSort = processDeviceSort;
exports.flattenDevice = flattenDevice;
exports.flattenFault = flattenFault;
exports.flattenTask = flattenTask;
exports.flattenPreset = flattenPreset;
exports.flattenFile = flattenFile;
exports.preProcessPreset = preProcessPreset;
exports.preProcessProvision = preProcessProvision;
exports.preProcessVirtualParameters = preProcessVirtualParameters;