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:
1 parent
824639976f
commit
1e41c72d60
62 files changed
+718
-898
No files matched your search
+1
-2
@@ -5,7 +5,6 @@
|
||||
},
|
||||
"parser": "babel-eslint",
|
||||
"parserOptions": {
|
||||
"allowImportExportEverywhere": true,
|
||||
"sourceType": "module"
|
||||
"allowImportExportEverywhere": true
|
||||
}
|
||||
}
|
||||
+19
-16
@@ -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;
|
||||
}
|
||||
@@ -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, "\\$&");
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user