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

+1 -2
View File
@@ -5,7 +5,6 @@
},
"parser": "babel-eslint",
"parserOptions": {
"allowImportExportEverywhere": true,
"sourceType": "module"
"allowImportExportEverywhere": true
}
}
+19 -16
View File
@@ -13,20 +13,23 @@ import tags from "./components/tags";
import ping from "./components/ping";
import deviceLink from "./components/device-link";
function get(name) {
if (name === "parameter") return parameter;
else if (name === "parameter-list") return parameterList;
else if (name === "parameter-table") return parameterTable;
else if (name === "overview-dot") return overviewDot;
else if (name === "container") return container;
else if (name === "summon-button") return summonButton;
else if (name === "device-faults") return deviceFaults;
else if (name === "all-parameters") return allParameters;
else if (name === "device-actions") return deviceActions;
else if (name === "tags") return tags;
else if (name === "ping") return ping;
else if (name === "device-link") return deviceLink;
else throw new Error(`No such component '${name}'`);
}
const comps = {
parameter,
"parameter-list": parameterList,
"parameter-table": parameterTable,
"overview-dot": overviewDot,
container,
"summon-button": summonButton,
"device-faults": deviceFaults,
"all-parameters": allParameters,
"device-actions": deviceActions,
tags,
ping,
"device-link": deviceLink
};
export { get };
export function get(name) {
const c = comps[name];
if (!c) throw new Error(`No such component '${name}'`);
return c;
}
+2 -2
View File
@@ -4,10 +4,10 @@ import m from "mithril";
import * as components from "../components";
import * as taskQueue from "../task-queue";
import longTextComponent from "../long-text-component";
import * as expression from "../../lib/common/expression";
import { parse } from "../../lib/common/expression-parser";
import memoize from "../../lib/common/memoize";
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
function escapeRegExp(str) {
return str.replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&");
+3 -5
View File
@@ -1,20 +1,20 @@
"use strict";
import m from "mithril";
import * as components from "../components";
import { get } from "../components";
import memoize from "../../lib/common/memoize";
const getChildAttrs = memoize((attrs, device) =>
Object.assign({}, attrs, { device: device })
);
const component = {
export default {
view: vnode => {
const device = vnode.attrs.device;
const rows = Object.values(vnode.attrs.parameters).map(parameter => {
const p = m(
components.get(parameter.type || "parameter"),
get(parameter.type || "parameter"),
getChildAttrs(parameter, device)
);
@@ -33,5 +33,3 @@ const component = {
return m("table.parameter-list", rows);
}
};
export default component;
+6 -6
View File
@@ -8,19 +8,20 @@ import * as store from "./store";
import * as components from "./components";
import * as taskQueue from "./task-queue";
import * as notifications from "./notifications";
import * as expression from "../lib/common/expression";
import { evaluate, extractParams } from "../lib/common/expression";
import { parse, stringify } from "../lib/common/expression-parser";
import memoize from "../lib/common/memoize";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const memoizedGetSortable = memoize(p => {
const expressionParams = expression.extractParams(p);
const expressionParams = extractParams(p);
if (expressionParams.length === 1) {
const param = expression.evaluate(expressionParams[0]);
const param = evaluate(expressionParams[0]);
if (typeof param === "string") return param;
}
return null;
@@ -28,8 +29,7 @@ const memoizedGetSortable = memoize(p => {
const getDownloadUrl = memoize((filter, indexParameters) => {
const columns = {};
for (const p of indexParameters)
columns[p.label] = expression.stringify(p.parameter);
for (const p of indexParameters) columns[p.label] = stringify(p.parameter);
return `/api/devices.csv?${m.buildQueryString({
filter: filter,
columns: JSON.stringify(columns)
+3 -4
View File
@@ -5,16 +5,15 @@ import config from "./config";
import filterComponent from "./filter-component";
import * as store from "./store";
import * as notifications from "./notifications";
import * as expression from "../lib/common/expression";
import memoize from "../lib/common/memoize";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
import { map, parse } from "../lib/common/expression-parser";
import { loadYaml, yaml } from "./dynamic-loader";
import longTextComponent from "./long-text-component";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const attributes = [
@@ -41,7 +40,7 @@ const getDownloadUrl = memoize(filter => {
});
const unpackSmartQuery = memoize(query => {
return expressionParser.map(query, e => {
return map(query, e => {
if (Array.isArray(e) && e[0] === "FUNC" && e[1] === "Q")
return smartQuery.unpack("faults", e[2], e[3]);
return e;
+3 -4
View File
@@ -5,17 +5,16 @@ import m from "mithril";
import config from "./config";
import filterComponent from "./filter-component";
import * as store from "./store";
import * as expression from "../lib/common/expression";
import * as notifications from "./notifications";
import memoize from "../lib/common/memoize";
import putFormComponent from "./put-form-component";
import * as overlay from "./overlay";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
import { map, parse } from "../lib/common/expression-parser";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const attributes = [
@@ -45,7 +44,7 @@ const formData = {
};
const unpackSmartQuery = memoize(query => {
return expressionParser.map(query, e => {
return map(query, e => {
if (Array.isArray(e) && e[0] === "FUNC" && e[1] === "Q")
return smartQuery.unpack("files", e[2], e[3]);
return e;
+5 -5
View File
@@ -1,7 +1,7 @@
"use strict";
import m from "mithril";
import * as expression from "../lib/common/expression";
import { parse, stringify } from "../lib/common/expression-parser";
import memoize from "../lib/common/memoize";
import Autocomplete from "./autocomplete-compnent";
import * as smartQuery from "./smart-query";
@@ -21,19 +21,19 @@ function parseFilter(f) {
const v = f.slice(k.length + 1).trim();
return ["FUNC", "Q", k.trim(), v];
}
return expression.parse(f);
return parse(f);
}
function stringifyFilter(f) {
if (Array.isArray(f) && f[0] === "FUNC" && f[1] === "Q")
return `${f[2]}: ${f[3]}`;
return expression.stringify(f);
return stringify(f);
}
const splitFilter = memoize(filter => {
if (!filter) return [""];
const list = [];
const f = expression.parse(filter);
const f = parse(filter);
if (Array.isArray(f) && f[0] === "AND")
for (const ff of f.slice(1)) list.push(stringifyFilter(ff));
else list.push(stringifyFilter(f));
@@ -70,7 +70,7 @@ const component = {
} else {
if (filter.length > 1) filter = ["AND"].concat(filter);
else filter = filter[0];
vnode.attrs.onChange(expression.stringify(filter));
vnode.attrs.onChange(stringify(filter));
}
}
}
+2 -2
View File
@@ -1,10 +1,10 @@
"use strict";
import m from "mithril";
import * as expression from "../lib/common/expression";
import { stringify } from "../lib/common/expression-parser";
import memoize from "../lib/common/memoize";
const memoizedStringify = memoize(expression.stringify);
const memoizedStringify = memoize(stringify);
const drawChart = function(chartData) {
const slices = chartData.slices;
+3 -4
View File
@@ -6,16 +6,15 @@ import config from "./config";
import filterComponent from "./filter-component";
import * as overlay from "./overlay";
import * as store from "./store";
import * as expression from "../lib/common/expression";
import * as notifications from "./notifications";
import putFormComponent from "./put-form-component";
import memoize from "../lib/common/memoize";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
import { map, parse } from "../lib/common/expression-parser";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const attributes = [
@@ -30,7 +29,7 @@ const attributes = [
];
const unpackSmartQuery = memoize(query => {
return expressionParser.map(query, e => {
return map(query, e => {
if (Array.isArray(e) && e[0] === "FUNC" && e[1] === "Q")
return smartQuery.unpack("presets", e[2], e[3]);
return e;
+3 -4
View File
@@ -5,18 +5,17 @@ import m from "mithril";
import config from "./config";
import filterComponent from "./filter-component";
import * as store from "./store";
import * as expression from "../lib/common/expression";
import * as notifications from "./notifications";
import memoize from "../lib/common/memoize";
import putFormComponent from "./put-form-component";
import * as overlay from "./overlay";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
import { map, parse } from "../lib/common/expression-parser";
import { loadCodeMirror } from "./dynamic-loader";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const attributes = [
@@ -25,7 +24,7 @@ const attributes = [
];
const unpackSmartQuery = memoize(query => {
return expressionParser.map(query, e => {
return map(query, e => {
if (Array.isArray(e) && e[0] === "FUNC" && e[1] === "Q")
return smartQuery.unpack("provisions", e[2], e[3]);
return e;
+24 -36
View File
@@ -1,12 +1,12 @@
"use strict";
import m from "mithril";
import * as expressionParser from "../lib/common/expression-parser";
import * as expression from "../lib/common/expression";
import { map, stringify } from "../lib/common/expression-parser";
import { or, and, not, evaluate, subset } from "../lib/common/expression";
import memoize from "../lib/common/memoize";
const memoizedStringify = memoize(expression.stringify);
const memoizedEvaluate = memoize(expression.evaluate);
const memoizedStringify = memoize(stringify);
const memoizedEvaluate = memoize(evaluate);
let fulfillTimestamp = 0;
@@ -74,43 +74,37 @@ function limitFilter(filter, sort, bookmark) {
const arr = Object.entries(sort)
.sort(sortSort)
.reverse();
return expression.and(
return and(
filter,
arr.reduce((cur, kv) => {
const [param, asc] = kv;
if (asc <= 0) {
if (bookmark[param] == null) {
return expression.or(
return or(
["IS NOT NULL", ["PARAM", param]],
expression.and(["IS NULL", ["PARAM", param]], cur)
and(["IS NULL", ["PARAM", param]], cur)
);
}
let f = null;
if (typeof bookmark[param] !== "string")
f = expression.or(f, [">=", ["PARAM", param], ""]);
f = or(f, [">=", ["PARAM", param], ""]);
f = expression.or(f, [">", ["PARAM", param], bookmark[param]]);
return expression.or(
f,
expression.and(["=", ["PARAM", param], bookmark[param]], cur)
);
f = or(f, [">", ["PARAM", param], bookmark[param]]);
return or(f, and(["=", ["PARAM", param], bookmark[param]], cur));
} else {
let f = ["IS NULL", ["PARAM", param]];
if (bookmark[param] == null) return expression.and(f, cur);
if (bookmark[param] == null) return and(f, cur);
if (typeof bookmark[param] !== "number") {
f = expression.or(f, [">=", ["PARAM", param], 0]);
f = expression.or(f, ["<", ["PARAM", param], 0]);
f = or(f, [">=", ["PARAM", param], 0]);
f = or(f, ["<", ["PARAM", param], 0]);
}
f = expression.or(f, ["<", ["PARAM", param], bookmark[param]]);
f = or(f, ["<", ["PARAM", param], bookmark[param]]);
return expression.or(
f,
expression.and(["=", ["PARAM", param], bookmark[param]], cur)
);
return or(f, and(["=", ["PARAM", param], bookmark[param]], cur));
}
}, true)
);
@@ -157,7 +151,7 @@ function compareFunction(sort) {
function findMatches(resourceType, filter, sort, limit) {
// Handle "tag =" and "tag <>" special cases
if (resourceType === "devices") {
filter = expressionParser.map(filter, e => {
filter = map(filter, e => {
if (
Array.isArray(e) &&
Array.isArray(e[1]) &&
@@ -173,7 +167,7 @@ function findMatches(resourceType, filter, sort, limit) {
let value = [];
for (const obj of resources[resourceType].objects.values())
if (expression.evaluate(filter, obj, fulfillTimestamp)) value.push(obj);
if (evaluate(filter, obj, fulfillTimestamp)) value.push(obj);
value = value.sort(compareFunction(sort));
if (limit) value = value.slice(0, limit);
@@ -191,7 +185,7 @@ function inferQuery(resourceType, queryResponse) {
if (bookmark) filter = limitFilter(filter, sort, bookmark);
if (
resources[resourceType].combinedFilter &&
expression.subset(filter, resources[resourceType].combinedFilter)
subset(filter, resources[resourceType].combinedFilter)
)
queries.fulfilled.set(queryResponse, fulfillTimestamp);
}
@@ -356,7 +350,7 @@ function fulfill(accessTimestamp, _fulfillTimestamp) {
if (
resources[resourceType].combinedFilter &&
expression.subset(filter, resources[resourceType].combinedFilter)
subset(filter, resources[resourceType].combinedFilter)
) {
queries.value.set(
queryResponse,
@@ -367,7 +361,7 @@ function fulfill(accessTimestamp, _fulfillTimestamp) {
return false;
}
combinedFilter = expression.or(combinedFilter, filter);
combinedFilter = or(combinedFilter, filter);
return true;
});
@@ -379,12 +373,12 @@ function fulfill(accessTimestamp, _fulfillTimestamp) {
deleted = new Set(resources[resourceType].objects.keys());
let combinedFilterDiff = combinedFilter;
if (resources[resourceType].combinedFilter) {
combinedFilterDiff = expression.and(
combinedFilterDiff = and(
combinedFilterDiff,
expression.not(resources[resourceType].combinedFilter)
not(resources[resourceType].combinedFilter)
);
}
resources[resourceType].combinedFilter = expression.or(
resources[resourceType].combinedFilter = or(
combinedFilter,
resources[resourceType].combinedFilter
);
@@ -411,13 +405,7 @@ function fulfill(accessTimestamp, _fulfillTimestamp) {
for (const d of deleted) {
const obj = resources[resourceType].objects.get(d);
if (
expression.evaluate(
combinedFilterDiff,
obj,
fulfillTimestamp
)
)
if (evaluate(combinedFilterDiff, obj, fulfillTimestamp))
resources[resourceType].objects.delete(d);
}
+3 -4
View File
@@ -5,18 +5,17 @@ import m from "mithril";
import config from "./config";
import filterComponent from "./filter-component";
import * as store from "./store";
import * as expression from "../lib/common/expression";
import * as notifications from "./notifications";
import memoize from "../lib/common/memoize";
import putFormComponent from "./put-form-component";
import * as overlay from "./overlay";
import * as smartQuery from "./smart-query";
import * as expressionParser from "../lib/common/expression-parser";
import { map, parse } from "../lib/common/expression-parser";
import { loadCodeMirror } from "./dynamic-loader";
const PAGE_SIZE = config.ui.pageSize || 10;
const memoizedParse = memoize(expression.parse);
const memoizedParse = memoize(parse);
const memoizedJsonParse = memoize(JSON.parse);
const attributes = [
@@ -25,7 +24,7 @@ const attributes = [
];
const unpackSmartQuery = memoize(query => {
return expressionParser.map(query, e => {
return map(query, e => {
if (Array.isArray(e) && e[0] === "FUNC" && e[1] === "Q")
return smartQuery.unpack("virtualParameters", e[2], e[3]);
return e;