Adds ethernet-ip-scanlist features and database storage

This commit is contained in:
Patrick McDonagh
2018-04-25 16:57:04 -05:00
parent 75b0a49ce1
commit c53d7f87c1
18 changed files with 921 additions and 346 deletions

View File

@@ -0,0 +1,29 @@
import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-16";
configure({ adapter: new Adapter() });
import { IPC_TAGHISTORYUPDATE, ipcTagHistoryUpdate } from "../../app/src/actions/actions_taghistory";
describe("actions_taghistory", () => {
describe("ipcTagHistoryUpdate", () => {
let action;
const sampleTag = {
tagName: "test",
historyRows: []
};
beforeEach(() => {
action = ipcTagHistoryUpdate(undefined, sampleTag);
});
it("has the correct type", () => {
expect(action.type).toEqual(IPC_TAGHISTORYUPDATE);
});
it("has the correct payload", () => {
expect(action.payload).toEqual({ tagName: "test", historyRows: [] });
});
});
});

View File

@@ -8,12 +8,10 @@ describe("actions_tags", () => {
describe("ipcTagUpdate", () => { describe("ipcTagUpdate", () => {
let action; let action;
const sampleTag = { state: { const sampleTag = {
tag: { tagName: "test",
name: "test", value: 100.0
value: 100.0 };
}
}};
beforeEach(() => { beforeEach(() => {
action = ipcTagUpdate(undefined, sampleTag); action = ipcTagUpdate(undefined, sampleTag);
@@ -24,7 +22,7 @@ describe("actions_tags", () => {
}); });
it("has the correct payload", () => { it("has the correct payload", () => {
expect(action.payload).toEqual({ name: "test", value: 100.0 }); expect(action.payload).toEqual({ tagName: "test", value: 100.0 });
}); });
}); });

View File

@@ -77,12 +77,12 @@ describe("Settings", () => {
describe("tag list", () => { describe("tag list", () => {
it("should have one row for each tag", () => { it("should have one row for each tag", () => {
expect(container.find(".tag-list li")).toHaveLength(2); expect(container.find(".tag-list tbody tr")).toHaveLength(2);
}); });
it("should update state when new tag input changed", () => { it("should update state when new tag input changed", () => {
container.find(".tag-name-input").simulate("change", {target: {value: "testtag"}}); container.find(".tag-name-input").simulate("change", {target: {value: "testtag"}});
expect(container.state().newTag).toEqual("testtag"); expect(container.state().newTag.tagName).toEqual("testtag");
}); });
it("should run the storeNewTag function on submit button click", () => { it("should run the storeNewTag function on submit button click", () => {

View File

@@ -19,11 +19,11 @@ describe("TagsIndex", () => {
describe("when tags are found", () => { describe("when tags are found", () => {
const testTagList = [ const testTagList = [
{ {
name: "test1", tagName: "test1",
value: 100 value: 100
}, },
{ {
name: "test2", tagName: "test2",
value: 200 value: 200
} }
]; ];

View File

@@ -5,6 +5,7 @@ configure({ adapter: new Adapter() });
import TagHistoryReducer from "../../app/src/reducers/reducer_taghistory"; import TagHistoryReducer from "../../app/src/reducers/reducer_taghistory";
import { IPC_TAGUPDATE } from "../../app/src/actions/actions_tags"; import { IPC_TAGUPDATE } from "../../app/src/actions/actions_tags";
import { IPC_TAGHISTORYUPDATE } from "../../app/src/actions/actions_taghistory";
describe("TagHistory", () => { describe("TagHistory", () => {
it("should not change state on unused type", () => { it("should not change state on unused type", () => {
@@ -22,20 +23,33 @@ describe("TagHistory", () => {
}; };
it("should add a history tag to an empty state", () => { it("should add a history tag to an empty state", () => {
action.payload = { name: "val_IntakePressure", value: 100 }; action.payload = { tagName: "val_IntakePressure", value: 100 };
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(1); expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(1);
}); });
it("should add another value to an existing history state", () => { it("should add another value to an existing history state", () => {
action.payload = { name: "val_IntakePressure", value: 100 }; action.payload = { tagName: "val_IntakePressure", value: 100 };
const stateAfterAdd = TagHistoryReducer({}, action); const stateAfterAdd = TagHistoryReducer({}, action);
expect(_.map(TagHistoryReducer(stateAfterAdd, action), (x) => x)[0]).toHaveLength(2); expect(_.map(TagHistoryReducer(stateAfterAdd, action), (x) => x)[0]).toHaveLength(2);
}); });
it("should not add to the history if the tag is not a historical tag", () => { it("should not add to the history if the tag is not a historical tag", () => {
action.payload = { name: "test", value: 100 }; action.payload = { tagName: "test", value: 100 };
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(0); expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(0);
}); });
}); });
describe("IPC_TAGHISTORYUPDATE", () => {
const action = {
type: IPC_TAGHISTORYUPDATE,
payload: ""
};
it("should add to the tagHistory state", () => {
action.payload = {tagName: "test", historyRows: [{value: 100, timestamp: new Date(0)}]};
const stateAfterAdd = TagHistoryReducer({}, action);
expect(stateAfterAdd).toEqual( {test : [{value: 100, timestamp: new Date(0)}]});
});
});
}); });

View File

@@ -17,18 +17,18 @@ describe("PlcReducer", () => {
describe("IPC_TAGUPDATE", () => { describe("IPC_TAGUPDATE", () => {
const action = { const action = {
type: IPC_TAGUPDATE, type: IPC_TAGUPDATE,
payload: { name: "test", value: 111.111 } payload: { tagName: "test", value: 111.111 }
}; };
it("should store a new value for a new tag", () => { it("should store a new value for a new tag", () => {
const newState = TagsReducer({}, action); const newState = TagsReducer({}, action);
expect(newState).toEqual({ test: { name: "test", value: 111.111 }}); expect(newState).toEqual({ test: { tagName: "test", value: 111.111 }});
}); });
it("should store a new value for an existing tag", () => { it("should store a new value for an existing tag", () => {
const existingState = { test: { name: "test", value: 0.00 }}; const existingState = { test: { tagName: "test", value: 0.00 }};
const newState = TagsReducer(existingState, action); const newState = TagsReducer(existingState, action);
expect(newState).toEqual({test: { name: "test", value: 111.111 }}); expect(newState).toEqual({test: { tagName: "test", value: 111.111 }});
}); });
}); });

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
export const IPC_TAGHISTORYUPDATE = "IPC_TAGHISTORYUPDATE";
export function ipcTagHistoryUpdate(event, {tagName, historyRows}){
console.log(event, tagName, historyRows);
return {
type: IPC_TAGHISTORYUPDATE,
payload: {tagName, historyRows}
};
}

View File

@@ -9,7 +9,7 @@ export const WRITE_TAG = "WRITE_TAG";
export function ipcTagUpdate(event, tag){ export function ipcTagUpdate(event, tag){
return { return {
type: IPC_TAGUPDATE, type: IPC_TAGUPDATE,
payload: tag.state.tag payload: tag
}; };
} }
@@ -22,6 +22,7 @@ export function ipcTagSync(ipAddress, tagList){
} }
export function storeNewTag(tag){ export function storeNewTag(tag){
ipcRenderer.send("tag:new", tag);
return { return {
type: STORE_NEW_TAG, type: STORE_NEW_TAG,
payload: tag payload: tag

View File

@@ -12,24 +12,30 @@ export class Settings extends Component {
this.state = { this.state = {
ipAddress: "", ipAddress: "",
newTag: "" newTag: {tagName: null, vanityName: null, storePeriod: null, storeChangeDelta: null},
editTag: {}
}; };
} }
getTagList = () => { getTagList = () => {
const { tags } = this.props; const { tags } = this.props;
return _.map(tags, (tag) => { return _.map(tags, (tag, key) => {
return ( return (
<li key={tag.name} className="list-group-item"> <tr key={key}>
{tag.name} <td className="tagName">{tag.tagName}</td>
<button <td className="vanityName">{tag.vanityName}</td>
className="btn btn-outline-danger float-right delete-button" <td className="storePeriod">{tag.storePeriod}</td>
onClick={(e) => this.onDeleteClick(e, tag.name)} <td className="storeChangeDelta">{tag.storeChangeDelta}</td>
> <td className="deleteButton">
<FontAwesomeIcon icon={faTimesSquare} /> <button
</button> className="btn btn-outline-danger float-right delete-button"
</li> onClick={(e) => this.onDeleteClick(e, tag.tagName)}
>
<FontAwesomeIcon icon={faTimesSquare} />
</button>
</td>
</tr>
); );
}); });
} }
@@ -54,14 +60,16 @@ export class Settings extends Component {
this.props.setPlcIpAddress(this.state.ipAddress); this.props.setPlcIpAddress(this.state.ipAddress);
} }
onNewTagChange = (e) => { onNewTagChange = (e, paramName) => {
this.setState({newTag: e.target.value}); const newTag = this.state.newTag;
newTag[paramName] = e.target.value;
this.setState({newTag});
} }
onNewTagSubmit = (e) => { onNewTagSubmit = (e) => {
e.preventDefault(); e.preventDefault();
this.props.storeNewTag(this.state.newTag); this.props.storeNewTag(this.state.newTag);
this.setState({newTag: ""}); this.setState({newTag: {tagName: null, vanityName: null, storePeriod: null, storeChangeDelta: null}});
} }
onSave = (e) => { onSave = (e) => {
@@ -97,22 +105,64 @@ export class Settings extends Component {
<h4>Tag List</h4> <h4>Tag List</h4>
<ul className="list-group tag-list"> {/* <ul className="list-group tag-list">
{this.getTagList()} {this.getTagList()}
</ul> </ul> */}
<table className="table tag-list">
<thead>
<tr>
<th>Tag Name (in PLC)</th>
<th>Vanity Name</th>
<th>Store Period (min.)</th>
<th>Store Change Delta</th>
<th></th>
</tr>
</thead>
<tbody>
{this.getTagList()}
</tbody>
</table>
<hr /> <hr />
<form className="form-inline"> <form className="form-inline">
<div className="form-group"> <div className="form-group">
<label htmlFor="tag-name-input">New Tag</label> {/* <label htmlFor="tag-name-input">New Tag</label> */}
<input <input
value={this.state.newTag} value={this.state.newTag.tagName}
onChange={this.onNewTagChange} onChange={(e) => this.onNewTagChange(e, "tagName")}
placeholder="New Tag Name..." placeholder="New Tag Name..."
className="tag-name-input form-control m-2" className="tag-name-input form-control m-2"
id="tag-name-input" id="tag-name-input"
/> />
{/* <label htmlFor="tag-vanityname-input">Vanity Name</label> */}
<input
value={this.state.newTag.vanityName}
onChange={(e) => this.onNewTagChange(e, "vanityName")}
placeholder="Vanity Name..."
className="tag-vanityname-input form-control m-2"
id="tag-vanityname-input"
/>
{/* <label htmlFor="tag-storeperiod-input">Store Period</label> */}
<input
value={this.state.newTag.storePeriod}
onChange={(e) => this.onNewTagChange(e, "storePeriod")}
placeholder="Store Period..."
className="tag-storeperiod-input form-control m-2"
id="tag-storeperiod-input"
/>
{/* <label htmlFor="tag-storechangedelta-input">Store Change Delta</label> */}
<input
value={this.state.newTag.storeChangeDelta}
onChange={(e) => this.onNewTagChange(e, "storeChangeDelta")}
placeholder="Store Change Delta..."
className="tag-storechangedelta-input form-control m-2"
id="tag-storechangedelta-input"
/>
<button <button
className="btn btn-success float-right add-tag-button m-2" className="btn btn-success float-right add-tag-button m-2"
onClick={(e) => this.onNewTagSubmit(e)} onClick={(e) => this.onNewTagSubmit(e)}

View File

@@ -16,16 +16,16 @@ export class TagsIndex extends Component {
renderTagsList(){ renderTagsList(){
return _.map(this.props.tags, (t) => { return _.map(this.props.tags, (t) => {
return (<tr key={t.name}> return (<tr key={t.tagName}>
<td>{t.name}</td> <td>{t.tagName}</td>
<td>{Math.round(t.value * 100) / 100}</td> <td>{Math.round(t.value * 100) / 100}</td>
<td><input <td><input
onChange={(e) => this.onTagWriteFieldChanged(e, t.name)} onChange={(e) => this.onTagWriteFieldChanged(e, t.tagName)}
className="tag-write-input" className="tag-write-input"
/></td> /></td>
<td><button <td><button
className="waves-effect waves-light btn tag-write-button" className="waves-effect waves-light btn tag-write-button"
onClick={() => this.onWriteButtonClick(t.name)} onClick={() => this.onWriteButtonClick(t.tagName)}
>Write</button></td> >Write</button></td>
</tr>); </tr>);
}); });

View File

@@ -1,6 +1,7 @@
import _ from "lodash"; import _ from "lodash";
import { IPC_TAGUPDATE } from "../actions/actions_tags"; import { IPC_TAGUPDATE } from "../actions/actions_tags";
import {history_tags as historyTags} from "../../../tagList.json"; import {history_tags as historyTags} from "../../../tagList.json";
import { IPC_TAGHISTORYUPDATE } from "../actions/actions_taghistory";
const historyPoints = 50000; const historyPoints = 50000;
@@ -8,22 +9,32 @@ const historyPoints = 50000;
export default function(state = {}, action){ export default function(state = {}, action){
switch (action.type) { switch (action.type) {
case IPC_TAGUPDATE: case IPC_TAGUPDATE:
const { name, value } = action.payload; const { tagName, value } = action.payload;
if (historyTags.includes(name)){ if (historyTags.includes(tagName)){
const thisEntry = { const thisEntry = {
value, value,
timestamp: new Date() timestamp: new Date()
}; };
let tagHistory = [ thisEntry ]; let tagHistory = [ thisEntry ];
if (state[name]){ if (state[tagName]){
tagHistory = _.take(_.concat(tagHistory, state[name]), historyPoints); tagHistory = _.take(_.concat(tagHistory, state[tagName]), historyPoints);
} }
return { ...state, [name]: tagHistory}; return { ...state, [tagName]: tagHistory};
} else { } else {
return state; return state;
} }
case IPC_TAGHISTORYUPDATE:
const { tagName: name, historyRows } = action.payload;
const thisTagHistory = _.map(historyRows, ({value, timestamp}) => {
return {
value,
timestamp: new Date(timestamp)
};
});
return { ...state, [name]: thisTagHistory};
default: default:
return state; return state;

View File

@@ -5,8 +5,8 @@ import { IPC_TAGUPDATE, STORE_NEW_TAG, DELETE_TAG } from "../actions/actions_tag
export default function(state = {}, action){ export default function(state = {}, action){
switch (action.type) { switch (action.type) {
case IPC_TAGUPDATE: case IPC_TAGUPDATE:
const { name, value } = action.payload; const tag = action.payload;
return { ...state, [name]: { name, value }}; return { ...state, [tag.tagName]: tag};
case STORE_NEW_TAG: case STORE_NEW_TAG:
const newTagName = action.payload; const newTagName = action.payload;

View File

@@ -18,6 +18,7 @@ import EventLog from "./components/EventLog";
import { ipcTagUpdate } from "./actions/actions_tags"; import { ipcTagUpdate } from "./actions/actions_tags";
import { ipcPlcDetailsReceived, ipcPlcErrorReceived } from "./actions/actions_plc"; import { ipcPlcDetailsReceived, ipcPlcErrorReceived } from "./actions/actions_plc";
import { ipcTagHistoryUpdate } from "./actions/actions_taghistory";
export const { history_tags: historyTags, event_tags: eventTags } = require("../../tagList.json"); export const { history_tags: historyTags, event_tags: eventTags } = require("../../tagList.json");
export const historyPoints = 5000; export const historyPoints = 5000;
@@ -26,7 +27,8 @@ export const historyPoints = 5000;
const ipc = createIpc({ const ipc = createIpc({
"tag:valueupdate": ipcTagUpdate, "tag:valueupdate": ipcTagUpdate,
"plc:connected": ipcPlcDetailsReceived, "plc:connected": ipcPlcDetailsReceived,
"plc:error": ipcPlcErrorReceived "plc:error": ipcPlcErrorReceived,
"tag:history": ipcTagHistoryUpdate
}); });
const createStoreWithMiddleware = applyMiddleware(ipc)(createStore); const createStoreWithMiddleware = applyMiddleware(ipc)(createStore);

View File

@@ -1,14 +1,17 @@
// Basic init // Basic init
const electron = require("electron"); const electron = require("electron");
const { Controller, Tag } = require("ethernet-ip"); const { ScanList } = require("ethernet-ip-scanlist");
const _ = require("lodash"); const _ = require("lodash");
const { app, BrowserWindow, ipcMain } = electron; const { app, BrowserWindow, ipcMain } = electron;
const tagList = require("./tagList.json"); const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database("./MaxWaterSystem.db");
const tagConfig = require("./tagList.json");
// To avoid being garbage collected // To avoid being garbage collected
let mainWindow; let mainWindow;
let PLC; let scanList;
app.on("ready", () => { app.on("ready", () => {
@@ -21,65 +24,97 @@ app.on("ready", () => {
// Wait for allowing react app to fully load // Wait for allowing react app to fully load
// before starting to send initalized data. // before starting to send initalized data.
setTimeout(() => { setTimeout(() => {
initPLC("10.20.4.36", tagList.scan_list); setupDB();
initPLC("10.20.4.36", tagConfig.scan_list);
}, 2000); }, 2000);
}); });
function writeTag(tagName, tagValue){ function setupDB(){
const thisTag = new Tag(tagName); db.run("CREATE TABLE IF NOT EXISTS tag_history (id INTEGER PRIMARY KEY, tag TEXT, value TEXT, reason TEXT, timestamp TEXT)");
PLC.readTag(thisTag).then(() => { }
thisTag.value = tagValue;
PLC.writeTag(thisTag); function clearAllHistory(){
db.run("DELETE FROM tag_history WHERE id > 0");
}
function clearTagHistory(tagName){
db.run(`DELETE FROM tag_history WHERE tagName = "${tagName}"`);
}
function sendTagHistoryToDB(tag){
var stmt = db.prepare("INSERT INTO tag_history (tag, value, reason, timestamp) VALUES (?, ?, ?, ?)");
stmt.run(tag.tagName, tag.value, tag.lastSendReason, tag.lastSendTime.format());
stmt.finalize();
}
function getTagHistory(tagName){
return new Promise((resolve, reject) => {
db.all(`SELECT value, reason, timestamp FROM tag_history WHERE tag = "${tagName}" ORDER BY datetime(timestamp) DESC`, function(err, rows) {
if (err) reject(err);
resolve(rows);
});
}); });
} }
function writeTag(tagName, tagValue){
scanList.tags[tagName].enipTag.value = tagValue;
}
function initPLC(ipAddress, tagList){ function initPLC(ipAddress, tagList){
PLC = new Controller(); scanList = new ScanList(ipAddress);
const setupTags = new Promise ((resolve) =>{ const setupTags = new Promise( (resolve) => {
resolve(_.map(tagList, (tag) => { resolve(_.forEach(tagList, ({tag, vanityName, storePeriod, storeChangeDelta}) => {
PLC.subscribe(new Tag( tag )); scanList.add(tag, vanityName, storePeriod, storeChangeDelta);
if(tagConfig.history_tags.includes(tag)){
getTagHistory(tag).then((historyRows) => {
// console.log("tag:history", {tag, historyRows});
mainWindow.webContents.send("tag:history", {tagName: tag, historyRows});
}, (err) => {
console.log("getHistoryTag Error:", err);
});
}
})); }));
}); });
setupTags.then(()=>{ setupTags.then(() => {
PLC.connect(ipAddress, 0).then( () => { scanList.on("Updated", (tag) => {
const properties = { ...PLC.properties, ipAddress}; mainWindow.webContents.send("tag:valueupdate", tag);
mainWindow.webContents.send("plc:connected", properties);
PLC.scan().catch((err) => {
mainWindow.webContents.send("plc:error", err.message);
console.log(err);
});
}).catch((err) => {
mainWindow.webContents.send("plc:error", err.message);
console.log(err);
}); });
PLC.forEach( (tag) => { scanList.on("newValue", (tag) => {
tag.on("Initialized", (tag) => { sendTagHistoryToDB(tag);
// console.log("main_process: Initialized", tag.name, tag.value);
mainWindow.webContents.send("tag:valueupdate", tag);
});
tag.on("Changed", (tag) => {
// console.log("main_process: Changed", tag.name, tag.value);
mainWindow.webContents.send("tag:valueupdate", tag);
});
}); });
scanList.start();
const properties = { ...scanList.PLC.properties, ipAddress};
mainWindow.webContents.send("plc:connected", properties);
}); });
} }
ipcMain.on("plc:initialize", (event, ipAddress, tagList) =>{ ipcMain.on("plc:initialize", (event, ipAddress, tagList) =>{
// console.log("plc:initialize", ipAddress, tagList);
initPLC(ipAddress, tagList); initPLC(ipAddress, tagList);
}); });
ipcMain.on("tag:write", (event, tagName, value) => { ipcMain.on("tag:write", (event, tagName, value) => {
// console.log("tag:write", tagName, value);
writeTag(tagName, value); writeTag(tagName, value);
}); });
ipcMain.on("tag:new", (event, {tagName, vanityName, storePeriod, storeChangeDelta}) => {
scanList.add(tagName, vanityName, storePeriod, storeChangeDelta);
scanList.stop();
scanList.start();
});
ipcMain.on("tag:clearHistory", (event, tagName) => {
clearTagHistory(tagName);
});
ipcMain.on("tag:clearAllHistory", () => {
clearAllHistory();
});

View File

@@ -4,6 +4,7 @@
"description": "Electron-based HMI Program", "description": "Electron-based HMI Program",
"main": "main_process.js", "main": "main_process.js",
"scripts": { "scripts": {
"postinstall": "electron-builder install-app-deps",
"bundle": "webpack --mode development", "bundle": "webpack --mode development",
"wpackserve": "webpack --mode development -w", "wpackserve": "webpack --mode development -w",
"serve": "electron .", "serve": "electron .",
@@ -45,6 +46,7 @@
"file-loader": "^1.1.10", "file-loader": "^1.1.10",
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"jest": "^22.4.3", "jest": "^22.4.3",
"karma-verbose-reporter": "^0.0.6",
"mini-css-extract-plugin": "^0.4.0", "mini-css-extract-plugin": "^0.4.0",
"npm-run-all": "^4.1.2", "npm-run-all": "^4.1.2",
"webpack": "^4.1.1", "webpack": "^4.1.1",
@@ -59,8 +61,10 @@
"d3-interpolate": "^1.1.6", "d3-interpolate": "^1.1.6",
"esdoc": "^1.0.4", "esdoc": "^1.0.4",
"ethernet-ip": "^1.1.4", "ethernet-ip": "^1.1.4",
"ethernet-ip-scanlist": "^1.0.2",
"lodash": "^4.17.5", "lodash": "^4.17.5",
"moment": "^2.22.0", "moment": "^2.22.1",
"node": "^9.11.0",
"react": "^16.2.0", "react": "^16.2.0",
"react-dom": "^16.2.0", "react-dom": "^16.2.0",
"react-event-timeline": "^1.5.1", "react-event-timeline": "^1.5.1",
@@ -71,7 +75,8 @@
"react-vis": "^1.9.2", "react-vis": "^1.9.2",
"redux": "^3.7.2", "redux": "^3.7.2",
"redux-electron-ipc": "^1.1.12", "redux-electron-ipc": "^1.1.12",
"redux-persist": "^5.9.1" "redux-persist": "^5.9.1",
"sqlite3": "^4.0.0"
}, },
"build": { "build": {
"appId": "com.henrypump.maxwatersystem", "appId": "com.henrypump.maxwatersystem",

View File

@@ -1,162 +1,529 @@
{ {
"scan_list": "scan_list": [
[ {
"alarm_ESTOP", "tag": "alarm_ESTOP",
"alarm_Flowmeter", "vanityName": "Alarm: E-Stop",
"alarm_FluidLevel", "storePeriod": 2.0,
"alarm_IntakePressure", "storeChangeDelta": 0
"alarm_IntakeTemperature", },
"alarm_Lockout", {
"alarm_MinSpeed", "tag": "alarm_Flowmeter",
"alarm_TubingPressure", "vanityName": "Alarm: Flowmeter",
"alarm_VFD", "storePeriod": 2.0,
"cfg_CostPerkWh", "storeChangeDelta": 0
"cfg_CurrentLimitMultiplier", },
"cfg_DHSensorDistToIntake", {
"cfg_DHSensorPressureOffset", "tag": "alarm_FluidLevel",
"cfg_FluidSpecificGravity", "vanityName": "Alarm: Fluid Level",
"cfg_MinSpeedSecondsBeforeFault", "storePeriod": 2.0,
"cfg_PID_Flow", "storeChangeDelta": 0
"cfg_PID_FlowSP", },
"cfg_PID_FluidLevel", {
"cfg_PID_FluidLevelSP", "tag": "alarm_IntakePressure",
"cfg_PID_Manual", "vanityName": "Alarm: Intake Pressure",
"cfg_PID_ManualSP", "storePeriod": 2.0,
"cfg_PID_TubingPressure", "storeChangeDelta": 0
"cfg_PID_TubingPressureSP", },
"cmd_Start", {
"cmd_Stop", "tag": "alarm_IntakeTemperature",
"Device_Status_INT", "vanityName": "Alarm: Intake Temperature",
"Downhole_Sensor_Status_INT", "storePeriod": 2.0,
"Flow_Total_LastMonth", "storeChangeDelta": 0
"Flow_Total_Lifetime", },
"Flow_Total_ThisMonth", {
"rp_ALL", "tag": "alarm_Lockout",
"rp_Flowmeter", "vanityName": "Alarm Lockout Active",
"rp_FluidLevel", "storePeriod": 2.0,
"rp_IntakePressure", "storeChangeDelta": 0
"rp_IntakeTemperature", },
"rp_MinSpeed", {
"rp_TubingPressure", "tag": "alarm_MinSpeed",
"rp_VFD", "vanityName": "Alarm: Min. Speed",
"sp_ALL", "storePeriod": 2.0,
"sp_Flowmeter", "storeChangeDelta": 0
"sp_FluidLevel", },
"sp_IntakePressure", {
"sp_IntakeTemperature", "tag": "alarm_TubingPressure",
"sp_Time", "vanityName": "Alarm: Tubing Pressure",
"sp_TubingPressure", "storePeriod": 2.0,
"sp_VFD", "storeChangeDelta": 0
"sts_CurrentVFDFaultCode", },
"sts_NoAlarms", {
"sts_PID_Control", "tag": "alarm_VFD",
"sts_PumpOff", "vanityName": "Alarm: VFD",
"sts_RestartAllowed", "storePeriod": 2.0,
"sts_TrueAlarm", "storeChangeDelta": 0
"sts_WaitingToRestart", },
"time_RunTime_Hours", {
"time_TotalSecondsUntilStartup", "tag": "cfg_CostPerkWh",
"val_Flowmeter", "vanityName": "Cost ($) per kWh",
"val_Flowmeter_BarrelsPerDay", "storePeriod": 10.0,
"val_FluidLevel", "storeChangeDelta": 1.0
"val_IntakePressure", },
"val_IntakeTemperature", {
"val_TubingPressure", "tag": "cfg_CurrentLimitMultiplier",
"VFD_MotorNPAmps", "vanityName": "Current Limit Multiplier",
"VFD_MotorNPHertz", "storePeriod": 10.0,
"VFD_MotorNPHorsepower", "storeChangeDelta": 1.0
"VFD_MotorNPOLFactor", },
"VFD_MotorNPRPM", {
"VFD_MotorNPVolts", "tag": "cfg_DHSensorDistToIntake",
"VFD_MotorPoles", "vanityName": "Distance from Sensor to Intake",
"VFD_OutCurrent", "storePeriod": 10.0,
"VFD_OutPower", "storeChangeDelta": 1.0
"VFD_PWMFrequency", },
"VFD_SpeedFdbk", {
"VFD_SpeedRef", "tag": "cfg_DHSensorPressureOffset",
"VFD_Temp" "vanityName": "DH Sensor Pressure Offset",
], "storePeriod": 10.0,
"history_tags": "storeChangeDelta": 1.0
[ },
"val_Flowmeter", {
"val_Flowmeter_BarrelsPerDay", "tag": "cfg_FluidSpecificGravity",
"val_FluidLevel", "vanityName": "Fluid Specific Gravity",
"val_IntakePressure", "storePeriod": 10.0,
"val_IntakeTemperature", "storeChangeDelta": 1.0
"val_TubingPressure", },
"VFD_OutCurrent", {
"VFD_OutPower", "tag": "cfg_MinSpeedSecondsBeforeFault",
"VFD_SpeedFdbk", "vanityName": "Min Speed Seconds Before Fault",
"VFD_SpeedRef", "storePeriod": 10.0,
"VFD_Temp" "storeChangeDelta": 1.0
], },
"event_tags": {
[ "tag": "cfg_PID_FlowSP",
{ "vanityName": "Flow Setpoint",
"tag": "alarm_ESTOP", "storePeriod": 2.0,
"text": "E-Stop has been pressed", "storeChangeDelta": 0.5
"valueTag": "", },
"eventType": "alarm" {
}, "tag": "cfg_PID_FluidLevelSP",
{ "vanityName": "Fluid Level Setpoint",
"tag": "alarm_Flowmeter", "storePeriod": 2.0,
"text": "Flowmeter Alarm", "storeChangeDelta": 0.5
"valueTag": "val_Flowmeter", },
"eventType": "alarm" {
}, "tag": "cfg_PID_ManualSP",
{ "vanityName": "Manual Frequency Setpoint",
"tag": "alarm_FluidLevel", "storePeriod": 2.0,
"text": "Fluid Level Alarm", "storeChangeDelta": 0.5
"valueTag": "val_FluidLevel", },
"eventType": "alarm" {
}, "tag": "cfg_PID_TubingPressureSP",
{ "vanityName": "Tubing Pressure Setpoint",
"tag": "alarm_IntakePressure", "storePeriod": 2.0,
"text": "Intake Pressure Alarm", "storeChangeDelta": 0.5
"valueTag": "val_IntakePressure", },
"eventType": "alarm" {
}, "tag": "cfg_PID_Flow",
{ "vanityName": "Flow Setpoint Selection Command",
"tag": "alarm_IntakeTemperature", "storePeriod": 2.0,
"text": "Intake Temperature Alarm", "storeChangeDelta": 0
"valueTag": "val_IntakeTemperature", },
"eventType": "alarm" {
}, "tag": "cfg_PID_FluidLevel",
{ "vanityName": "Fluid Level Setpoint Selection Command",
"tag": "alarm_MinSpeed", "storePeriod": 2.0,
"text": "Minimum Speed Alarm", "storeChangeDelta": 0
"valueTag": "VFD_SpeedFdbk", },
"eventType": "alarm" {
}, "tag": "cfg_PID_Manual",
{ "vanityName": "Manual Frequency Setpoint Selection Command",
"tag": "alarm_TubingPressure", "storePeriod": 2.0,
"text": "Tubing Pressure Alarm", "storeChangeDelta": 5
"valueTag": "val_TubingPressure", },
"eventType": "alarm" {
}, "tag": "cfg_PID_TubingPressure",
{ "vanityName": "Tubing Pressure Setpoint Selection Command",
"tag": "alarm_VFD", "storePeriod": 2.0,
"text": "VFD Alarm", "storeChangeDelta": 0
"valueTag": "sts_CurrentVFDFaultCode", },
"eventType": "alarm" {
}, "tag": "cmd_Start",
{ "vanityName": "Start Command",
"tag": "cmd_Start", "storePeriod": 0,
"text": "Start button pressed", "storeChangeDelta": 0
"valueTag": "", },
"eventType": "event" {
}, "tag": "cmd_Stop",
{ "vanityName": "Stop Command",
"tag": "cmd_Stop", "storePeriod": 0,
"text": "Stop button pressed", "storeChangeDelta": 0
"valueTag": "", },
"eventType": "event" {
}, "tag": "Device_Status_INT",
{ "vanityName": "Device Status Integer",
"tag": "cmd_Restart", "storePeriod": 2.0,
"text": "System restarted automatically", "storeChangeDelta": 1.0
"valueTag": "", },
"eventType": "event" {
} "tag": "Downhole_Sensor_Status_INT",
] "vanityName": "Downhole Sensor Status Integer",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "Flow_Total_LastMonth",
"vanityName": "Flow Total Last Month",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "Flow_Total_Lifetime",
"vanityName": "Lifetime Flow Total",
"storePeriod": 10.0,
"storeChangeDelta": 100.0
},
{
"tag": "Flow_Total_ThisMonth",
"vanityName": "Flow Total This Month",
"storePeriod": 10.0,
"storeChangeDelta": 100.0
},
{
"tag": "rp_ALL",
"vanityName": "Overall Run Permissive",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_Flowmeter",
"vanityName": "Run Permissive: Flowmeter",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_FluidLevel",
"vanityName": "Run Permissive: Fluid Level",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_IntakePressure",
"vanityName": "Run Permissive: Intake Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_IntakeTemperature",
"vanityName": "Run Permissive: Intake Temperature",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_MinSpeed",
"vanityName": "Run Permissive: Min Speed",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_TubingPressure",
"vanityName": "Run Permissive: Tubing Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "rp_VFD",
"vanityName": "Run Permissive: VFD",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_ALL",
"vanityName": "Overall Start Permissive",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_Flowmeter",
"vanityName": "Start Permissive: Flowmeter",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_FluidLevel",
"vanityName": "Start Permissive: Fluid Level",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_IntakePressure",
"vanityName": "Start Permissive: Intake Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_IntakeTemperature",
"vanityName": "Start Permissive: Intake Temperature",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_Time",
"vanityName": "Start Permissive: Downtime",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_TubingPressure",
"vanityName": "Start Permissive: Tubing Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sp_VFD",
"vanityName": "Start Permissive: VFD",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sts_CurrentVFDFaultCode",
"vanityName": "Current VFD Fault Code",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "sts_NoAlarms",
"vanityName": "No Active Alarms",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sts_PID_Control",
"vanityName": "PID Control Status",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "sts_PumpOff",
"vanityName": "Pumped Off",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sts_RestartAllowed",
"vanityName": "Restart Allowed",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sts_TrueAlarm",
"vanityName": "True Alarm Active",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "sts_WaitingToRestart",
"vanityName": "Waiting to Restart",
"storePeriod": 2.0,
"storeChangeDelta": 0
},
{
"tag": "time_RunTime_Hours",
"vanityName": "Runtime Hours",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "time_TotalSecondsUntilStartup",
"vanityName": "Total Seconds until Startup",
"storePeriod": 2.0,
"storeChangeDelta": 10.0
},
{
"tag": "val_Flowmeter",
"vanityName": "Flow Rate (GPM)",
"storePeriod": 2.0,
"storeChangeDelta": 5.0
},
{
"tag": "val_Flowmeter_BarrelsPerDay",
"vanityName": "Flow Rate (BPD)",
"storePeriod": 2.0,
"storeChangeDelta": 2.0
},
{
"tag": "val_FluidLevel",
"vanityName": "Fluid Level",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "val_IntakePressure",
"vanityName": "Intake Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 5.0
},
{
"tag": "val_IntakeTemperature",
"vanityName": "Intake Temperature",
"storePeriod": 2.0,
"storeChangeDelta": 0.5
},
{
"tag": "val_TubingPressure",
"vanityName": "Tubing Pressure",
"storePeriod": 2.0,
"storeChangeDelta": 2.0
},
{
"tag": "VFD_MotorNPAmps",
"vanityName": "VFD Motor Nameplate Amps",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorNPHertz",
"vanityName": "VFD Motor Nameplate Hertz",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorNPHorsepower",
"vanityName": "VFD Motor Namplate Horsepower",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorNPOLFactor",
"vanityName": "VFD Motor Nameplate Service Factor",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorNPRPM",
"vanityName": "VFD Motor Nameplate RPM",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorNPVolts",
"vanityName": "VFD Motor Nameplate Volts",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_MotorPoles",
"vanityName": "VFD Motor Poles",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_OutCurrent",
"vanityName": "Output Current",
"storePeriod": 2.0,
"storeChangeDelta": 0.5
},
{
"tag": "VFD_OutPower",
"vanityName": "Output Power",
"storePeriod": 2.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_PWMFrequency",
"vanityName": "PWM Frequency",
"storePeriod": 10.0,
"storeChangeDelta": 1.0
},
{
"tag": "VFD_SpeedFdbk",
"vanityName": "Motor Speed Feedback",
"storePeriod": 2.0,
"storeChangeDelta": 0.5
},
{
"tag": "VFD_SpeedRef",
"vanityName": "Motor Speed Reference",
"storePeriod": 2.0,
"storeChangeDelta": 0.5
},
{
"tag": "VFD_Temp",
"vanityName": "VFD Temperature",
"storePeriod": 2.0,
"storeChangeDelta": 0.5
}
],
"history_tags": [
"val_Flowmeter",
"val_Flowmeter_BarrelsPerDay",
"val_FluidLevel",
"val_IntakePressure",
"val_IntakeTemperature",
"val_TubingPressure",
"VFD_OutCurrent",
"VFD_OutPower",
"VFD_SpeedFdbk",
"VFD_SpeedRef",
"VFD_Temp"
],
"event_tags": [
{
"tag": "alarm_ESTOP",
"text": "E-Stop has been pressed",
"valueTag": "",
"eventType": "alarm"
},
{
"tag": "alarm_Flowmeter",
"text": "Flowmeter Alarm",
"valueTag": "val_Flowmeter",
"eventType": "alarm"
},
{
"tag": "alarm_FluidLevel",
"text": "Fluid Level Alarm",
"valueTag": "val_FluidLevel",
"eventType": "alarm"
},
{
"tag": "alarm_IntakePressure",
"text": "Intake Pressure Alarm",
"valueTag": "val_IntakePressure",
"eventType": "alarm"
},
{
"tag": "alarm_IntakeTemperature",
"text": "Intake Temperature Alarm",
"valueTag": "val_IntakeTemperature",
"eventType": "alarm"
},
{
"tag": "alarm_MinSpeed",
"text": "Minimum Speed Alarm",
"valueTag": "VFD_SpeedFdbk",
"eventType": "alarm"
},
{
"tag": "alarm_TubingPressure",
"text": "Tubing Pressure Alarm",
"valueTag": "val_TubingPressure",
"eventType": "alarm"
},
{
"tag": "alarm_VFD",
"text": "VFD Alarm",
"valueTag": "sts_CurrentVFDFaultCode",
"eventType": "alarm"
},
{
"tag": "cmd_Start",
"text": "Start button pressed",
"valueTag": "",
"eventType": "event"
},
{
"tag": "cmd_Stop",
"text": "Stop button pressed",
"valueTag": "",
"eventType": "event"
},
{
"tag": "cmd_Restart",
"text": "System restarted automatically",
"valueTag": "",
"eventType": "event"
}
]
} }

216
yarn.lock
View File

@@ -1729,10 +1729,6 @@ center-align@^0.1.1:
align-text "^0.1.3" align-text "^0.1.3"
lazy-cache "^1.0.3" lazy-cache "^1.0.3"
chain-function@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -1882,10 +1878,6 @@ class-utils@^0.3.5:
isobject "^3.0.0" isobject "^3.0.0"
static-extend "^0.1.1" static-extend "^0.1.1"
classnames@2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
cli-boxes@^1.0.0: cli-boxes@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
@@ -2042,7 +2034,7 @@ colors@1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
colors@^1.1.2: colors@>=1.0, colors@^1.1.2:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794" resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794"
@@ -2141,10 +2133,6 @@ copy-descriptor@^0.1.0:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
core-js@2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
core-js@^1.0.0: core-js@^1.0.0:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
@@ -2411,18 +2399,6 @@ d3-sankey@^0.7.1:
d3-collection "1" d3-collection "1"
d3-shape "^1.2.0" d3-shape "^1.2.0"
d3-scale@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed"
dependencies:
d3-array "^1.2.0"
d3-collection "1"
d3-color "1"
d3-format "1"
d3-interpolate "1"
d3-time "1"
d3-time-format "2"
d3-scale@^1.0.5, d3-scale@^1.0.6: d3-scale@^1.0.5, d3-scale@^1.0.6:
version "1.0.7" version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
@@ -2439,7 +2415,7 @@ d3-selection@^1.1.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d"
d3-shape@1.2.0, d3-shape@^1.1.0, d3-shape@^1.2.0: d3-shape@^1.1.0, d3-shape@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
dependencies: dependencies:
@@ -2504,7 +2480,7 @@ dateformat@^3.0.2, dateformat@^3.0.3:
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies: dependencies:
@@ -2658,10 +2634,6 @@ doctrine@^2.0.2, doctrine@^2.1.0:
dependencies: dependencies:
esutils "^2.0.2" esutils "^2.0.2"
dom-helpers@^3.2.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
dom-serializer@0, dom-serializer@~0.1.0: dom-serializer@0, dom-serializer@~0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -3195,11 +3167,20 @@ esutils@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
ethernet-ip@^1.1.4: ethernet-ip-scanlist@^1.0.2:
version "1.1.4" version "1.1.1"
resolved "https://registry.yarnpkg.com/ethernet-ip/-/ethernet-ip-1.1.4.tgz#96390af1c33285c4ab489bd9785d164a966fc894" resolved "https://registry.yarnpkg.com/ethernet-ip-scanlist/-/ethernet-ip-scanlist-1.1.1.tgz#817cef9103063d938b590969210cc9a9347c4318"
dependencies:
ethernet-ip "^1.1.5"
lodash "^4.17.5"
moment "^2.22.1"
ethernet-ip@^1.1.4, ethernet-ip@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ethernet-ip/-/ethernet-ip-1.1.5.tgz#5d2e6a63db51bb083b40cfd8e448121e36c8d113"
dependencies: dependencies:
dateformat "^3.0.3" dateformat "^3.0.3"
task-easy "^0.2.0"
event-stream@~3.3.0: event-stream@~3.3.0:
version "3.3.4" version "3.3.4"
@@ -3592,6 +3573,12 @@ fs-extra@^5.0.0:
jsonfile "^4.0.0" jsonfile "^4.0.0"
universalify "^0.1.0" universalify "^0.1.0"
fs-minipass@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
dependencies:
minipass "^2.2.1"
fs-write-stream-atomic@^1.0.8: fs-write-stream-atomic@^1.0.8:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -4126,7 +4113,7 @@ iconv-lite@0.4.19:
version "0.4.19" version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@~0.4.13: iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.21" version "0.4.21"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798"
dependencies: dependencies:
@@ -4156,6 +4143,12 @@ iferr@^0.1.5:
version "0.1.5" version "0.1.5"
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
ignore-walk@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
dependencies:
minimatch "^3.0.4"
ignore@^3.3.3: ignore@^3.3.3:
version "3.3.7" version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
@@ -5144,6 +5137,12 @@ jsx-ast-utils@^2.0.1:
dependencies: dependencies:
array-includes "^3.0.3" array-includes "^3.0.3"
karma-verbose-reporter@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/karma-verbose-reporter/-/karma-verbose-reporter-0.0.6.tgz#5909052451c607f02ac77c763791a2fe1251260c"
dependencies:
colors ">=1.0"
keyv@3.0.0: keyv@3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
@@ -5369,7 +5368,7 @@ lodash.uniq@^4.5.0:
version "4.5.0" version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
version "4.17.5" version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
@@ -5646,6 +5645,19 @@ minimist@~0.0.1:
version "0.0.10" version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
minipass@^2.2.1, minipass@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40"
dependencies:
safe-buffer "^5.1.1"
yallist "^3.0.0"
minizlib@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
dependencies:
minipass "^2.2.1"
mississippi@^2.0.0: mississippi@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
@@ -5680,9 +5692,9 @@ mkdirp@0.5.0:
dependencies: dependencies:
minimist "0.0.8" minimist "0.0.8"
moment@^2.22.0: moment@^2.22.1:
version "2.22.0" version "2.22.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.0.tgz#7921ade01017dd45186e7fee5f424f0b8663a730" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad"
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
@@ -5716,6 +5728,10 @@ nan@^2.3.0:
version "2.10.0" version "2.10.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
nan@~2.9.2:
version "2.9.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
nanomatch@^1.2.9: nanomatch@^1.2.9:
version "1.2.9" version "1.2.9"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
@@ -5746,6 +5762,14 @@ nearley@^2.7.10:
randexp "0.4.6" randexp "0.4.6"
semver "^5.4.1" semver "^5.4.1"
needle@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa"
dependencies:
debug "^2.1.2"
iconv-lite "^0.4.4"
sax "^1.2.4"
neo-async@^2.5.0: neo-async@^2.5.0:
version "2.5.1" version "2.5.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
@@ -5754,6 +5778,10 @@ nice-try@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
node-bin-setup@^1.0.0:
version "1.0.6"
resolved "https://registry.yarnpkg.com/node-bin-setup/-/node-bin-setup-1.0.6.tgz#4b5c9bb937ece702d7069b36ca78af4684677528"
node-dir@0.1.8: node-dir@0.1.8:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
@@ -5822,6 +5850,27 @@ node-pre-gyp@^0.6.39:
tar "^2.2.1" tar "^2.2.1"
tar-pack "^3.4.0" tar-pack "^3.4.0"
node-pre-gyp@~0.9.0:
version "0.9.1"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0"
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.0"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.1.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4"
node@^9.11.0:
version "9.11.0"
resolved "https://registry.yarnpkg.com/node/-/node-9.11.0.tgz#84dfe1207e48469d56fe12af59dd6450a9fbd04f"
dependencies:
node-bin-setup "^1.0.0"
nomnom@^1.8.1: nomnom@^1.8.1:
version "1.8.1" version "1.8.1"
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
@@ -5879,6 +5928,17 @@ normalize-url@^1.4.0:
query-string "^4.1.0" query-string "^4.1.0"
sort-keys "^1.0.0" sort-keys "^1.0.0"
npm-bundled@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
npm-packlist@^1.1.6:
version "1.1.10"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-run-all@^4.1.2: npm-run-all@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
@@ -6691,7 +6751,7 @@ promise@^7.1.1:
dependencies: dependencies:
asap "~2.0.3" asap "~2.0.3"
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0: prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0:
version "15.6.1" version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
dependencies: dependencies:
@@ -6785,7 +6845,7 @@ querystring@0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
raf@^3.1.0, raf@^3.2.0, raf@^3.4.0: raf@^3.1.0, raf@^3.4.0:
version "3.4.0" version "3.4.0"
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
dependencies: dependencies:
@@ -6892,12 +6952,6 @@ react-redux@^5.0.7:
loose-envify "^1.1.0" loose-envify "^1.1.0"
prop-types "^15.6.0" prop-types "^15.6.0"
react-resize-detector@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-1.1.0.tgz#4a9831fa3caad32230478dd0185cbd2aa91a5ebf"
dependencies:
prop-types "^15.5.10"
react-router-dom@^4.2.2: react-router-dom@^4.2.2:
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d"
@@ -6921,15 +6975,6 @@ react-router@^4.2.0:
prop-types "^15.5.4" prop-types "^15.5.4"
warning "^3.0.0" warning "^3.0.0"
react-smooth@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.0.tgz#b29dbebddddb06d21b5b08962167fb9eac1897d8"
dependencies:
lodash "~4.17.4"
prop-types "^15.6.0"
raf "^3.2.0"
react-transition-group "^2.2.1"
react-test-renderer@^16.0.0-0: react-test-renderer@^16.0.0-0:
version "16.3.1" version "16.3.1"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.3.1.tgz#d9257936d8535bd40f57f3d5a84e7b0452fb17f2" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.3.1.tgz#d9257936d8535bd40f57f3d5a84e7b0452fb17f2"
@@ -6939,16 +6984,6 @@ react-test-renderer@^16.0.0-0:
prop-types "^15.6.0" prop-types "^15.6.0"
react-is "^16.3.1" react-is "^16.3.1"
react-transition-group@^2.2.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.3.0.tgz#8dd1af58f6af284b19fd057f512e74f20438ad31"
dependencies:
chain-function "^1.0.0"
dom-helpers "^3.2.0"
loose-envify "^1.3.1"
prop-types "^15.5.8"
warning "^3.0.0"
react-vis@^1.9.2: react-vis@^1.9.2:
version "1.9.2" version "1.9.2"
resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.9.2.tgz#4dbd5d91ac820fd39fa7ad1c892198495194f6e3" resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.9.2.tgz#4dbd5d91ac820fd39fa7ad1c892198495194f6e3"
@@ -7094,26 +7129,6 @@ recast@^0.14.1:
private "~0.1.5" private "~0.1.5"
source-map "~0.6.1" source-map "~0.6.1"
recharts-scale@0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.3.2.tgz#dac7621714a4765d152cb2adbc30c73b831208c9"
recharts@^1.0.0-beta.10:
version "1.0.0-beta.10"
resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.0.0-beta.10.tgz#d3cd15df6b7879d5968da3c942b5fcdaf2504fe1"
dependencies:
classnames "2.2.5"
core-js "2.5.1"
d3-interpolate "^1.1.5"
d3-scale "1.0.6"
d3-shape "1.2.0"
lodash "~4.17.4"
prop-types "^15.6.0"
react-resize-detector "1.1.0"
react-smooth "1.0.0"
recharts-scale "0.3.2"
reduce-css-calc "1.3.0"
rechoir@^0.6.2: rechoir@^0.6.2:
version "0.6.2" version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
@@ -7127,7 +7142,7 @@ redent@^1.0.0:
indent-string "^2.1.0" indent-string "^2.1.0"
strip-indent "^1.0.1" strip-indent "^1.0.1"
reduce-css-calc@1.3.0, reduce-css-calc@^1.2.6: reduce-css-calc@^1.2.6:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
dependencies: dependencies:
@@ -7756,6 +7771,13 @@ sprintf-js@~1.0.2:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
sqlite3@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.0.tgz#cc0e093ab51873f50d9dfc4126fcbef15d486570"
dependencies:
nan "~2.9.2"
node-pre-gyp "~0.9.0"
sshpk@^1.7.0: sshpk@^1.7.0:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb"
@@ -8031,6 +8053,22 @@ tar@^2.2.1:
fstream "^1.0.2" fstream "^1.0.2"
inherits "2" inherits "2"
tar@^4:
version "4.4.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749"
dependencies:
chownr "^1.0.1"
fs-minipass "^1.2.5"
minipass "^2.2.4"
minizlib "^1.1.0"
mkdirp "^0.5.0"
safe-buffer "^5.1.1"
yallist "^3.0.2"
task-easy@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/task-easy/-/task-easy-0.2.0.tgz#af3e4637b09d1da26705717934c0c6321c7810a7"
temp-file@^3.1.1: temp-file@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.1.1.tgz#8823649aa4e8a6e419eb71b601a2e4d472b0f24f" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.1.1.tgz#8823649aa4e8a6e419eb71b601a2e4d472b0f24f"
@@ -8731,6 +8769,10 @@ yallist@^2.1.2:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
yallist@^3.0.0, yallist@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
yargs-parser@^8.1.0: yargs-parser@^8.1.0:
version "8.1.0" version "8.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"