From 3c1a8bb541984dc9f59581745b6d5a9eda6f84a0 Mon Sep 17 00:00:00 2001 From: gabrielburnworth Date: Thu, 28 Dec 2023 14:58:51 -0800 Subject: [PATCH] upgrade deps --- Gemfile.lock | 10 ++++----- frontend/connectivity/batch_queue.ts | 3 ++- frontend/connectivity/index.ts | 5 +++-- .../devices/connectivity/generate_data.ts | 2 +- frontend/farm_events/add_farm_event.tsx | 4 ++-- .../map_state_to_props_add_edit.ts | 4 ++-- frontend/folders/actions.ts | 3 ++- .../__tests__/image_filter_menu_test.tsx | 3 +-- .../image_filter_menu.tsx | 8 +++++-- frontend/photos/photo_filter_settings/util.ts | 2 +- .../__tests__/plant_inventory_item_test.tsx | 2 +- frontend/plants/edit_plant_status.tsx | 4 ++-- frontend/plants/plant_panel.tsx | 2 +- frontend/redux/store.ts | 5 ++--- frontend/redux/version_tracker_middleware.ts | 2 +- .../regimens/set_active_regimen_by_name.ts | 4 +++- frontend/resources/reducer_support.ts | 7 +++--- .../sequences/set_active_sequence_by_name.ts | 4 +++- frontend/wizard/actions.ts | 2 +- package.json | 22 +++++++++---------- spec/controllers/api/ai/ai_controller_spec.rb | 10 +++++++-- 21 files changed, 62 insertions(+), 46 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 88e57cf222..4e0d566ee4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -114,7 +114,7 @@ GEM docile (1.4.0) e2mmap (0.1.0) erubi (1.12.0) - factory_bot (6.4.2) + factory_bot (6.4.4) activesupport (>= 5.0.0) factory_bot_rails (6.4.2) factory_bot (~> 6.4) @@ -222,7 +222,7 @@ GEM multipart-post (2.3.0) mutations (0.9.1) activesupport - net-imap (0.4.8) + net-imap (0.4.9) date net-protocol net-pop (0.1.2) @@ -232,7 +232,7 @@ GEM net-smtp (0.4.0) net-protocol nio4r (2.7.0) - nokogiri (1.15.5-x86_64-linux) + nokogiri (1.16.0-x86_64-linux) racc (~> 1.4) orm_adapter (0.5.0) os (1.1.4) @@ -336,7 +336,7 @@ GEM activerecord (>= 4.0.0) railties (>= 4.0.0) secure_headers (6.5.0) - set (1.0.4) + set (1.1.0) signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) @@ -433,4 +433,4 @@ RUBY VERSION ruby 3.1.4p223 BUNDLED WITH - 2.5.0 + 2.5.3 diff --git a/frontend/connectivity/batch_queue.ts b/frontend/connectivity/batch_queue.ts index 07a045da5f..b1fbb727b2 100644 --- a/frontend/connectivity/batch_queue.ts +++ b/frontend/connectivity/batch_queue.ts @@ -3,6 +3,7 @@ import { store } from "../redux/store"; import { batchInitResources, bothUp } from "./connect_device"; import { maybeGetDevice } from "../resources/selectors"; import { deviceIsThrottled } from "./device_is_throttled"; +import { UnknownAction } from "redux"; /** Performs resource initialization (Eg: a storm of incoming logs) in batches * at a regular interval. We only need one work queue for the whole app, @@ -25,7 +26,7 @@ export class BatchQueue { work = () => { const dev = maybeGetDevice(store.getState().resources.index); if (!deviceIsThrottled(dev ? dev.body : undefined)) { - store.dispatch(batchInitResources(this.queue)); + store.dispatch(batchInitResources(this.queue) as unknown as UnknownAction); } this.clear(); bothUp(); diff --git a/frontend/connectivity/index.ts b/frontend/connectivity/index.ts index 138366c50e..09b50abe8e 100644 --- a/frontend/connectivity/index.ts +++ b/frontend/connectivity/index.ts @@ -2,6 +2,7 @@ import { store } from "../redux/store"; import { networkUp, networkDown } from "./actions"; import { Edge } from "./interfaces"; import { Actions } from "../constants"; +import { UnknownAction } from "redux"; /* ABOUT THIS FILE: These functions allow us to mark the network as up or down from anywhere within the app (even outside of React-Redux). I usually avoid @@ -39,13 +40,13 @@ export const dispatchQosStart = (id: string) => { export const dispatchNetworkUp = (edge: Edge, at: number) => { if (shouldThrottle(edge, at)) { return; } - store.dispatch(networkUp(edge, at)); + store.dispatch(networkUp(edge, at) as unknown as UnknownAction); bumpThrottle(edge, at); }; export const dispatchNetworkDown = (edge: Edge, at: number) => { if (shouldThrottle(edge, at)) { return; } - store.dispatch(networkDown(edge, at)); + store.dispatch(networkDown(edge, at) as unknown as UnknownAction); bumpThrottle(edge, at); }; diff --git a/frontend/devices/connectivity/generate_data.ts b/frontend/devices/connectivity/generate_data.ts index 0459983cb1..fdbabb95c9 100644 --- a/frontend/devices/connectivity/generate_data.ts +++ b/frontend/devices/connectivity/generate_data.ts @@ -26,7 +26,7 @@ export const connectivityData = (props: ConnectivityDataProps) => { userMQTT: browserToMQTT({ state: "up", at: moment().valueOf() }), userAPI: browserToAPI({ state: "up", at: moment().valueOf() }), botMQTT: botToMQTT({ state: "up", at: moment().valueOf() }), - botAPI: botToAPI(moment().toISOString()), + botAPI: botToAPI("" + moment().toISOString()), botFirmware: botToFirmware("0.0.0.E", "express_k10"), } : { diff --git a/frontend/farm_events/add_farm_event.tsx b/frontend/farm_events/add_farm_event.tsx index 01c2a34421..faf103284f 100644 --- a/frontend/farm_events/add_farm_event.tsx +++ b/frontend/farm_events/add_farm_event.tsx @@ -57,8 +57,8 @@ export class RawAddFarmEvent const { uuid } = this.props.findExecutable(executable_type, executable_id); const varData = this.props.resources.sequenceMetas[uuid]; const action = init("FarmEvent", { - end_time: moment().add(63, "minutes").toISOString(), - start_time: moment().add(3, "minutes").toISOString(), + end_time: "" + moment().add(63, "minutes").toISOString(), + start_time: "" + moment().add(3, "minutes").toISOString(), time_unit: "never", executable_id, executable_type, diff --git a/frontend/farm_events/map_state_to_props_add_edit.ts b/frontend/farm_events/map_state_to_props_add_edit.ts index 5f827a6bf8..70c5a86324 100644 --- a/frontend/farm_events/map_state_to_props_add_edit.ts +++ b/frontend/farm_events/map_state_to_props_add_edit.ts @@ -60,7 +60,7 @@ const handleTime = ( .toISOString(); // Set the time of the already existing iso string - const newStartISO = moment(currentStartISO) + const newStartISO = "" + moment(currentStartISO) .set("hours", hours) .set("minutes", minutes) .toISOString(); @@ -71,7 +71,7 @@ const handleTime = ( const currentEndISO = new Date((currentISO || "").toString()) .toISOString(); - const newEndISO = moment(currentEndISO) + const newEndISO = "" + moment(currentEndISO) .set("hours", hours) .set("minutes", minutes) .toISOString(); diff --git a/frontend/folders/actions.ts b/frontend/folders/actions.ts index 6e6911c4d3..2487330c0b 100644 --- a/frontend/folders/actions.ts +++ b/frontend/folders/actions.ts @@ -13,6 +13,7 @@ import { stepGet, STEP_DATATRANSFER_IDENTIFER } from "../draggable/actions"; import { joinKindAndId } from "../resources/reducer_support"; import { maybeGetSequence } from "../resources/selectors"; import { Path } from "../internal_urls"; +import { UnknownAction } from "redux"; export const setFolderColor = (id: number, color: Color) => { const d = store.dispatch as Function; @@ -51,7 +52,7 @@ export const addNewSequenceToFolder = (config: DeepPartial = {}) => { kind: "sequence", body: [], }; - store.dispatch(init("Sequence", newSequence)); + store.dispatch(init("Sequence", newSequence) as unknown as UnknownAction); push(Path.sequences(urlFriendly(newSequence.name))); setActiveSequenceByName(); }; diff --git a/frontend/photos/photo_filter_settings/__tests__/image_filter_menu_test.tsx b/frontend/photos/photo_filter_settings/__tests__/image_filter_menu_test.tsx index 2623e9cebb..739a9b070a 100644 --- a/frontend/photos/photo_filter_settings/__tests__/image_filter_menu_test.tsx +++ b/frontend/photos/photo_filter_settings/__tests__/image_filter_menu_test.tsx @@ -113,8 +113,7 @@ describe("", () => { currentTarget: { value: "" } }); expect(wrapper.instance().state[filter]).toEqual(undefined); - // eslint-disable-next-line no-null/no-null - expect(edit).toHaveBeenCalledWith(config, { [key]: null }); + expect(edit).toHaveBeenCalledWith(config, { [key]: undefined }); expect(save).toHaveBeenCalledWith(config.uuid); }); diff --git a/frontend/photos/photo_filter_settings/image_filter_menu.tsx b/frontend/photos/photo_filter_settings/image_filter_menu.tsx index 8216eade77..ad8ca5324b 100644 --- a/frontend/photos/photo_filter_settings/image_filter_menu.tsx +++ b/frontend/photos/photo_filter_settings/image_filter_menu.tsx @@ -84,7 +84,9 @@ export class ImageFilterMenu let value = undefined; switch (datetime) { case "beginDate": - value = offsetTime(input, beginTime || "00:00", timeSettings); + if (input) { + value = offsetTime(input, beginTime || "00:00", timeSettings); + } this.setValues({ photo_filter_begin: value }); break; case "beginTime": @@ -94,7 +96,9 @@ export class ImageFilterMenu } break; case "endDate": - value = offsetTime(input, endTime || "00:00", timeSettings); + if (input) { + value = offsetTime(input, endTime || "00:00", timeSettings); + } this.setValues({ photo_filter_end: value }); break; case "endTime": diff --git a/frontend/photos/photo_filter_settings/util.ts b/frontend/photos/photo_filter_settings/util.ts index 25368f2cb1..3086c6c2e6 100644 --- a/frontend/photos/photo_filter_settings/util.ts +++ b/frontend/photos/photo_filter_settings/util.ts @@ -32,7 +32,7 @@ export const parseFilterSetting = (getConfigValue: GetWebAppConfigValue) => }; export const filterTime = (direction: "before" | "after", seconds = 1) => - (image: TaggedImage) => + (image: TaggedImage): string => moment(image.body.created_at) .add(direction == "before" ? -seconds : seconds, "second") .toISOString(); diff --git a/frontend/plants/__tests__/plant_inventory_item_test.tsx b/frontend/plants/__tests__/plant_inventory_item_test.tsx index 33b811209d..3761195347 100644 --- a/frontend/plants/__tests__/plant_inventory_item_test.tsx +++ b/frontend/plants/__tests__/plant_inventory_item_test.tsx @@ -48,7 +48,7 @@ describe("", () => { const p = fakeProps(); const plant = fakePlant(); plant.body.name = ""; - plant.body.planted_at = moment().toISOString(); + plant.body.planted_at = "" + moment().toISOString(); p.plant = plant; const wrapper = shallow(); expect(wrapper.text()).toEqual("Unknown plant1 day old"); diff --git a/frontend/plants/edit_plant_status.tsx b/frontend/plants/edit_plant_status.tsx index 3b78211072..e4d6f13fa1 100644 --- a/frontend/plants/edit_plant_status.tsx +++ b/frontend/plants/edit_plant_status.tsx @@ -84,7 +84,7 @@ const getUpdateByPlantStage = (plant_stage: PlantStage): PlantOptions => { update.planted_at = undefined; break; case "planted": - update.planted_at = moment().toISOString(); + update.planted_at = "" + moment().toISOString(); } return update; }; @@ -164,7 +164,7 @@ export const PlantDateBulkUpdate = (props: PlantDateBulkUpdateProps) => { })) && plants.map(plant => { props.dispatch(edit(plant, { - planted_at: moment(e.currentTarget.value) + planted_at: "" + moment(e.currentTarget.value) .utcOffset(props.timeSettings.utcOffset).toISOString() })); props.dispatch(save(plant.uuid)); diff --git a/frontend/plants/plant_panel.tsx b/frontend/plants/plant_panel.tsx index d4432a583d..a2b510602e 100644 --- a/frontend/plants/plant_panel.tsx +++ b/frontend/plants/plant_panel.tsx @@ -66,7 +66,7 @@ export const EditDatePlanted = (props: EditDatePlantedProps) => { value={datePlanted?.utcOffset(timeSettings.utcOffset) .format("YYYY-MM-DD") || ""} onCommit={e => updatePlant(uuid, { - planted_at: moment(e.currentTarget.value) + planted_at: "" + moment(e.currentTarget.value) .utcOffset(timeSettings.utcOffset).toISOString() })} />; }; diff --git a/frontend/redux/store.ts b/frontend/redux/store.ts index 9bb2562714..1e32560d70 100644 --- a/frontend/redux/store.ts +++ b/frontend/redux/store.ts @@ -1,14 +1,13 @@ -import { createStore, PreloadedState } from "redux"; +import { createStore } from "redux"; import { EnvName, Store } from "./interfaces"; import { rootReducer } from "./root_reducer"; import { registerSubscribers } from "./subscribers"; import { getMiddleware } from "./middlewares"; import { set } from "lodash"; -import { Everything } from "../interfaces"; function getStore(envName: EnvName): Store { return createStore(rootReducer, - {} as PreloadedState, + {}, getMiddleware(envName)); } diff --git a/frontend/redux/version_tracker_middleware.ts b/frontend/redux/version_tracker_middleware.ts index 47cbcef17e..d7485dc13a 100644 --- a/frontend/redux/version_tracker_middleware.ts +++ b/frontend/redux/version_tracker_middleware.ts @@ -18,7 +18,7 @@ function getVersionFromState(state: Everything) { const fn: MW = (store: Store) => - (dispatch: Dispatch>) => + (dispatch: Dispatch>) => // eslint-disable-next-line @typescript-eslint/no-explicit-any (action: any) => { const fbos = getVersionFromState(store.getState()); diff --git a/frontend/regimens/set_active_regimen_by_name.ts b/frontend/regimens/set_active_regimen_by_name.ts index 946e18d28c..a781294a44 100644 --- a/frontend/regimens/set_active_regimen_by_name.ts +++ b/frontend/regimens/set_active_regimen_by_name.ts @@ -3,8 +3,10 @@ import { store } from "../redux/store"; import { urlFriendly } from "../util"; import { selectRegimen } from "./actions"; import { Path } from "../internal_urls"; +import { UnknownAction } from "redux"; -const setRegimen = (uuid: string) => store.dispatch(selectRegimen(uuid)); +const setRegimen = (uuid: string) => + store.dispatch(selectRegimen(uuid) as unknown as UnknownAction); export function setActiveRegimenByName() { const chunk = Path.getLastChunk(); diff --git a/frontend/resources/reducer_support.ts b/frontend/resources/reducer_support.ts index 3113a2f7e7..4ba797fd19 100644 --- a/frontend/resources/reducer_support.ts +++ b/frontend/resources/reducer_support.ts @@ -1,7 +1,7 @@ import { ResourceName, SpecialStatus, TaggedResource, TaggedSequence, } from "farmbot"; -import { combineReducers, ReducersMapObject } from "redux"; +import { combineReducers, ReducersMapObject, UnknownAction } from "redux"; import { helpReducer as help } from "../help/reducer"; import { designer as farm_designer } from "../farm_designer/reducer"; import { photosReducer as photos } from "../photos/reducer"; @@ -40,6 +40,7 @@ import { getFbosConfig } from "./getters"; import { ingest, PARENTLESS as NO_PARENT } from "../folders/data_transfer"; import { FolderNode, FolderMeta } from "../folders/interfaces"; import { pointsSelectedByGroup } from "../point_groups/criteria/apply"; +import { Everything } from "../interfaces"; export function findByUuid(index: ResourceIndex, uuid: string): TaggedResource { const x = index.references[uuid]; @@ -275,8 +276,8 @@ const consumerReducer = combineReducers({ farmware, help, alerts - // eslint-disable-next-line @typescript-eslint/no-explicit-any -} as ReducersMapObject); +} as ReducersMapObject, +) as Function; /** The resource reducer must have the first say when a resource-related action * fires off. Afterwards, sub-reducers are allowed to make sense of data diff --git a/frontend/sequences/set_active_sequence_by_name.ts b/frontend/sequences/set_active_sequence_by_name.ts index f87be74f31..8dd030029e 100644 --- a/frontend/sequences/set_active_sequence_by_name.ts +++ b/frontend/sequences/set_active_sequence_by_name.ts @@ -4,8 +4,10 @@ import { urlFriendly } from "../util"; import { selectSequence } from "./actions"; import { setMenuOpen } from "./test_button"; import { Path } from "../internal_urls"; +import { UnknownAction } from "redux"; -const setSequence = (uuid: string) => store.dispatch(selectSequence(uuid)); +const setSequence = (uuid: string) => + store.dispatch(selectSequence(uuid) as unknown as UnknownAction); export function setActiveSequenceByName() { const chunk = Path.getLastChunk(); diff --git a/frontend/wizard/actions.ts b/frontend/wizard/actions.ts index 6e0a62d562..7496d0c15a 100644 --- a/frontend/wizard/actions.ts +++ b/frontend/wizard/actions.ts @@ -31,7 +31,7 @@ export const destroyAllWizardStepResults = export const completeSetup = (device: TaggedDevice | undefined) => device && setDeviceProperty(device, { - setup_completed_at: moment().toISOString() + setup_completed_at: "" + moment().toISOString() }); export const resetSetup = (device: TaggedDevice | undefined) => diff --git a/package.json b/package.json index 43972ffa2e..c84ea35ade 100644 --- a/package.json +++ b/package.json @@ -38,22 +38,22 @@ "@parcel/transformer-typescript-tsc": "2.10.3", "@types/lodash": "4.14.202", "@types/markdown-it": "13.0.7", - "@types/node": "20.10.4", + "@types/node": "20.10.5", "@types/promise-timeout": "1.3.3", - "@types/react": "18.2.45", + "@types/react": "18.2.46", "@types/react-color": "3.0.10", - "@types/react-dom": "18.2.17", + "@types/react-dom": "18.2.18", "@types/ws": "8.5.10", - "axios": "1.6.2", + "axios": "1.6.3", "bowser": "2.11.0", "browser-speech": "1.1.1", "events": "3.3.0", "farmbot": "15.8.5", - "i18next": "23.7.11", + "i18next": "23.7.12", "lodash": "4.17.21", "markdown-it": "14.0.0", "markdown-it-emoji": "3.0.0", - "moment": "2.29.4", + "moment": "2.30.1", "monaco-editor": "0.45.0", "mqtt": "5.1.4", "npm": "10.2.5", @@ -65,8 +65,8 @@ "react": "18.2.0", "react-color": "2.19.3", "react-dom": "18.2.0", - "react-redux": "8.1.3", - "redux": "4.2.1", + "react-redux": "9.0.4", + "redux": "5.0.1", "redux-immutable-state-invariant": "2.1.0", "redux-thunk": "3.1.0", "takeme": "0.12.0", @@ -78,12 +78,12 @@ "@types/enzyme": "3.10.12", "@types/jest": "29.5.11", "@types/readable-stream": "4.0.10", - "@typescript-eslint/eslint-plugin": "6.14.0", - "@typescript-eslint/parser": "6.14.0", + "@typescript-eslint/eslint-plugin": "6.16.0", + "@typescript-eslint/parser": "6.16.0", "@wojtekmaj/enzyme-adapter-react-17": "0.8.0", "coveralls": "3.1.1", "enzyme": "3.11.0", - "eslint": "8.55.0", + "eslint": "8.56.0", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-jest": "27.6.0", diff --git a/spec/controllers/api/ai/ai_controller_spec.rb b/spec/controllers/api/ai/ai_controller_spec.rb index 43f98cc342..7ffd546491 100644 --- a/spec/controllers/api/ai/ai_controller_spec.rb +++ b/spec/controllers/api/ai/ai_controller_spec.rb @@ -119,11 +119,17 @@ def chunk(content, done=nil) expect(response.status).to eq(200) expect(response.body).to eq("title") + statuses = [] + bodies = [] + (0..20).map do |_| post :create, body: payload.to_json + statuses.push(response.status) + bodies.push(response.body) end - expect(response.status).to eq(403) - expect(response.body).to eq({error: "Too many requests. Try again later."}.to_json) + if statuses.last() != 403 then puts statuses.join(" ") end + expect(statuses).to include(403) + expect(bodies).to include({error: "Too many requests. Try again later."}.to_json) end end