From facdaafe209edd33c8b9fddcb8c544af9b78ecd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:24:52 +0100 Subject: [PATCH 1/3] Version Packages (#3328) Co-authored-by: github-actions[bot] --- .changeset/gentle-carrots-kneel.md | 5 --- .changeset/little-ways-change.md | 6 --- .changeset/twenty-boats-burn.md | 32 -------------- CHANGELOG.md | 47 +++++++++++++++++++++ docs/pages/changelog.mdx | 47 +++++++++++++++++++++ packages/abi-ts/CHANGELOG.md | 2 + packages/abi-ts/package.json | 2 +- packages/block-logs-stream/CHANGELOG.md | 6 +++ packages/block-logs-stream/package.json | 2 +- packages/cli/CHANGELOG.md | 17 ++++++++ packages/cli/package.json | 2 +- packages/common/CHANGELOG.md | 6 +++ packages/common/package.json | 2 +- packages/config/CHANGELOG.md | 7 +++ packages/config/package.json | 2 +- packages/create-mud/CHANGELOG.md | 2 + packages/create-mud/package.json | 2 +- packages/dev-tools/CHANGELOG.md | 13 ++++++ packages/dev-tools/package.json | 2 +- packages/explorer/CHANGELOG.md | 13 ++++++ packages/explorer/package.json | 2 +- packages/faucet/CHANGELOG.md | 6 +++ packages/faucet/package.json | 2 +- packages/gas-report/CHANGELOG.md | 2 + packages/gas-report/package.json | 2 +- packages/protocol-parser/CHANGELOG.md | 8 ++++ packages/protocol-parser/package.json | 2 +- packages/react/CHANGELOG.md | 7 +++ packages/react/package.json | 2 +- packages/recs/CHANGELOG.md | 7 +++ packages/recs/package.json | 2 +- packages/schema-type/CHANGELOG.md | 2 + packages/schema-type/package.json | 2 +- packages/solhint-config-mud/CHANGELOG.md | 2 + packages/solhint-config-mud/package.json | 2 +- packages/solhint-plugin-mud/CHANGELOG.md | 2 + packages/solhint-plugin-mud/package.json | 2 +- packages/stash/CHANGELOG.md | 39 +++++++++++++++++ packages/stash/package.json | 2 +- packages/store-indexer/CHANGELOG.md | 10 +++++ packages/store-indexer/package.json | 2 +- packages/store-sync/CHANGELOG.md | 15 +++++++ packages/store-sync/package.json | 2 +- packages/store/CHANGELOG.md | 9 ++++ packages/store/package.json | 2 +- packages/utils/CHANGELOG.md | 2 + packages/utils/package.json | 2 +- packages/world-module-erc20/CHANGELOG.md | 9 ++++ packages/world-module-erc20/package.json | 2 +- packages/world-module-metadata/CHANGELOG.md | 8 ++++ packages/world-module-metadata/package.json | 2 +- packages/world-modules/CHANGELOG.md | 11 +++++ packages/world-modules/package.json | 2 +- packages/world/CHANGELOG.md | 10 +++++ packages/world/package.json | 2 +- 55 files changed, 334 insertions(+), 68 deletions(-) delete mode 100644 .changeset/gentle-carrots-kneel.md delete mode 100644 .changeset/little-ways-change.md delete mode 100644 .changeset/twenty-boats-burn.md diff --git a/.changeset/gentle-carrots-kneel.md b/.changeset/gentle-carrots-kneel.md deleted file mode 100644 index 6280003cfc..0000000000 --- a/.changeset/gentle-carrots-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@latticexyz/cli": patch ---- - -Added support for deploying public libraries used within modules. diff --git a/.changeset/little-ways-change.md b/.changeset/little-ways-change.md deleted file mode 100644 index 0be98f458f..0000000000 --- a/.changeset/little-ways-change.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@latticexyz/world-module-erc20": patch -"@latticexyz/world-modules": patch ---- - -Changed ERC20 and ERC721 related modules to use public library methods instead of manual `delegatecall`s. diff --git a/.changeset/twenty-boats-burn.md b/.changeset/twenty-boats-burn.md deleted file mode 100644 index d485e124bd..0000000000 --- a/.changeset/twenty-boats-burn.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -"@latticexyz/stash": patch ---- - -Added `useStash` React hook. It's heavily inspired by Zustand's `useStore` and accepts a stash, a state selector, an an optional equality function to avoid unnecessary re-render cycles when returning unstable values. - -Also updated `getRecord` and `getRecords` to each take either a `stash` or `state` object for more ergonomic use with `useStash`. - -```ts -import { useStash } from "@latticexyz/stash/react"; -import { getRecord } from "@latticexyz/stash"; -import config from "../mud.config"; - -const tables = config.namespaces.app.tables; - -export function PlayerName({ playerId }) { - const record = useStash(stash, (state) => getRecord({ state, table: tables.Player, key: { playerId } })); - ... -} -``` - -```ts -import isEqual from "fast-deep-equal"; -import { useStash } from "@latticexyz/stash/react"; -import { getRecords } from "@latticexyz/stash"; -import config from "../mud.config"; - -export function PlayerNames() { - const record = useStash(stash, (state) => getRecords({ state, table: tables.Player }), { isEqual }); - ... -} -``` diff --git a/CHANGELOG.md b/CHANGELOG.md index daaad25cd4..4b41ffa6fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,50 @@ +## Version 2.2.14 + +Release date: Thu Oct 24 2024 + +### Patch changes + +**[fix(cli): support public library methods in modules (#3308)](https://github.com/latticexyz/mud/commit/8eaad304db2fe9ae79f087ec7860928f734039d4)** (@latticexyz/cli) + +Added support for deploying public libraries used within modules. + +**[fix(cli): support public library methods in modules (#3308)](https://github.com/latticexyz/mud/commit/8eaad304db2fe9ae79f087ec7860928f734039d4)** (@latticexyz/world-module-erc20, @latticexyz/world-modules) + +Changed ERC20 and ERC721 related modules to use public library methods instead of manual `delegatecall`s. + +**[feat(stash): add useStash and improve other helpers (#3320)](https://github.com/latticexyz/mud/commit/93d0e763cca0facaaa20d7bde861c98c298f08ad)** (@latticexyz/stash) + +Added `useStash` React hook. It's heavily inspired by Zustand's `useStore` and accepts a stash, a state selector, an an optional equality function to avoid unnecessary re-render cycles when returning unstable values. + +Also updated `getRecord` and `getRecords` to each take either a `stash` or `state` object for more ergonomic use with `useStash`. + +```ts +import { useStash } from "@latticexyz/stash/react"; +import { getRecord } from "@latticexyz/stash"; +import config from "../mud.config"; + +const tables = config.namespaces.app.tables; + +export function PlayerName({ playerId }) { + const record = useStash(stash, (state) => getRecord({ state, table: tables.Player, key: { playerId } })); + ... +} +``` + +```ts +import isEqual from "fast-deep-equal"; +import { useStash } from "@latticexyz/stash/react"; +import { getRecords } from "@latticexyz/stash"; +import config from "../mud.config"; + +export function PlayerNames() { + const record = useStash(stash, (state) => getRecords({ state, table: tables.Player }), { isEqual }); + ... +} +``` + +--- + ## Version 2.2.13 Release date: Wed Oct 23 2024 diff --git a/docs/pages/changelog.mdx b/docs/pages/changelog.mdx index daaad25cd4..4b41ffa6fc 100644 --- a/docs/pages/changelog.mdx +++ b/docs/pages/changelog.mdx @@ -1,3 +1,50 @@ +## Version 2.2.14 + +Release date: Thu Oct 24 2024 + +### Patch changes + +**[fix(cli): support public library methods in modules (#3308)](https://github.com/latticexyz/mud/commit/8eaad304db2fe9ae79f087ec7860928f734039d4)** (@latticexyz/cli) + +Added support for deploying public libraries used within modules. + +**[fix(cli): support public library methods in modules (#3308)](https://github.com/latticexyz/mud/commit/8eaad304db2fe9ae79f087ec7860928f734039d4)** (@latticexyz/world-module-erc20, @latticexyz/world-modules) + +Changed ERC20 and ERC721 related modules to use public library methods instead of manual `delegatecall`s. + +**[feat(stash): add useStash and improve other helpers (#3320)](https://github.com/latticexyz/mud/commit/93d0e763cca0facaaa20d7bde861c98c298f08ad)** (@latticexyz/stash) + +Added `useStash` React hook. It's heavily inspired by Zustand's `useStore` and accepts a stash, a state selector, an an optional equality function to avoid unnecessary re-render cycles when returning unstable values. + +Also updated `getRecord` and `getRecords` to each take either a `stash` or `state` object for more ergonomic use with `useStash`. + +```ts +import { useStash } from "@latticexyz/stash/react"; +import { getRecord } from "@latticexyz/stash"; +import config from "../mud.config"; + +const tables = config.namespaces.app.tables; + +export function PlayerName({ playerId }) { + const record = useStash(stash, (state) => getRecord({ state, table: tables.Player, key: { playerId } })); + ... +} +``` + +```ts +import isEqual from "fast-deep-equal"; +import { useStash } from "@latticexyz/stash/react"; +import { getRecords } from "@latticexyz/stash"; +import config from "../mud.config"; + +export function PlayerNames() { + const record = useStash(stash, (state) => getRecords({ state, table: tables.Player }), { isEqual }); + ... +} +``` + +--- + ## Version 2.2.13 Release date: Wed Oct 23 2024 diff --git a/packages/abi-ts/CHANGELOG.md b/packages/abi-ts/CHANGELOG.md index a6531c8679..bd1ec7bd7d 100644 --- a/packages/abi-ts/CHANGELOG.md +++ b/packages/abi-ts/CHANGELOG.md @@ -1,5 +1,7 @@ # @latticexyz/abi-ts +## 2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/abi-ts/package.json b/packages/abi-ts/package.json index 091c5f759b..23dec12075 100644 --- a/packages/abi-ts/package.json +++ b/packages/abi-ts/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/abi-ts", - "version": "2.2.13", + "version": "2.2.14", "description": "Create TypeScript type declaration files (`.d.ts`) for your ABI JSON files.", "repository": { "type": "git", diff --git a/packages/block-logs-stream/CHANGELOG.md b/packages/block-logs-stream/CHANGELOG.md index f03d259da8..263dfe1ad2 100644 --- a/packages/block-logs-stream/CHANGELOG.md +++ b/packages/block-logs-stream/CHANGELOG.md @@ -1,5 +1,11 @@ # @latticexyz/block-logs-stream +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/block-logs-stream/package.json b/packages/block-logs-stream/package.json index 74d13a5d91..b3c90282c9 100644 --- a/packages/block-logs-stream/package.json +++ b/packages/block-logs-stream/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/block-logs-stream", - "version": "2.2.13", + "version": "2.2.14", "description": "Create a stream of EVM block logs for events", "repository": { "type": "git", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 22d20a2607..9baf244b6a 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- 8eaad30: Added support for deploying public libraries used within modules. + - @latticexyz/abi-ts@2.2.14 + - @latticexyz/block-logs-stream@2.2.14 + - @latticexyz/common@2.2.14 + - @latticexyz/config@2.2.14 + - @latticexyz/gas-report@2.2.14 + - @latticexyz/protocol-parser@2.2.14 + - @latticexyz/schema-type@2.2.14 + - @latticexyz/store@2.2.14 + - @latticexyz/utils@2.2.14 + - @latticexyz/world@2.2.14 + - @latticexyz/world-module-metadata@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 5ca3f9ebab..6c6cd58ee9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/cli", - "version": "2.2.13", + "version": "2.2.14", "description": "Command line interface for mud", "repository": { "type": "git", diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index 08c8443a19..c82e52a558 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/schema-type@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/common/package.json b/packages/common/package.json index f7a0c65885..71e2673bf5 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/common", - "version": "2.2.13", + "version": "2.2.14", "description": "Common low level logic shared between packages", "repository": { "type": "git", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index fad2356c39..9027726912 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 +- @latticexyz/schema-type@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index 2c9f7e7556..18277dd872 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/config", - "version": "2.2.13", + "version": "2.2.14", "description": "Config for Store and World", "repository": { "type": "git", diff --git a/packages/create-mud/CHANGELOG.md b/packages/create-mud/CHANGELOG.md index a9fd684fa2..584bcaa396 100644 --- a/packages/create-mud/CHANGELOG.md +++ b/packages/create-mud/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ## 2.2.12 diff --git a/packages/create-mud/package.json b/packages/create-mud/package.json index 3096acf8f4..18734f2160 100644 --- a/packages/create-mud/package.json +++ b/packages/create-mud/package.json @@ -1,6 +1,6 @@ { "name": "create-mud", - "version": "2.2.13", + "version": "2.2.14", "description": "Create a new MUD project", "license": "MIT", "author": "Lattice ", diff --git a/packages/dev-tools/CHANGELOG.md b/packages/dev-tools/CHANGELOG.md index b750648d0c..40ee36d761 100644 --- a/packages/dev-tools/CHANGELOG.md +++ b/packages/dev-tools/CHANGELOG.md @@ -1,5 +1,18 @@ # @latticexyz/dev-tools +## 2.2.14 + +### Patch Changes + +- @latticexyz/store-sync@2.2.14 +- @latticexyz/common@2.2.14 +- @latticexyz/react@2.2.14 +- @latticexyz/recs@2.2.14 +- @latticexyz/schema-type@2.2.14 +- @latticexyz/store@2.2.14 +- @latticexyz/utils@2.2.14 +- @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/dev-tools/package.json b/packages/dev-tools/package.json index 14e7d3d316..30ca1bcf13 100644 --- a/packages/dev-tools/package.json +++ b/packages/dev-tools/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/dev-tools", - "version": "2.2.13", + "version": "2.2.14", "description": "MUD developer tools", "repository": { "type": "git", diff --git a/packages/explorer/CHANGELOG.md b/packages/explorer/CHANGELOG.md index 1935ad47db..d14b013a09 100644 --- a/packages/explorer/CHANGELOG.md +++ b/packages/explorer/CHANGELOG.md @@ -1,5 +1,18 @@ # @latticexyz/explorer +## 2.2.14 + +### Patch Changes + +- @latticexyz/store-sync@2.2.14 +- @latticexyz/store-indexer@2.2.14 +- @latticexyz/common@2.2.14 +- @latticexyz/config@2.2.14 +- @latticexyz/protocol-parser@2.2.14 +- @latticexyz/schema-type@2.2.14 +- @latticexyz/store@2.2.14 +- @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/explorer/package.json b/packages/explorer/package.json index acf26d9f3e..e21620e2e2 100644 --- a/packages/explorer/package.json +++ b/packages/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/explorer", - "version": "2.2.13", + "version": "2.2.14", "description": "World Explorer is a tool for visually exploring and manipulating the state of worlds", "type": "module", "exports": { diff --git a/packages/faucet/CHANGELOG.md b/packages/faucet/CHANGELOG.md index 1db9cbffc3..98e8be3d8e 100644 --- a/packages/faucet/CHANGELOG.md +++ b/packages/faucet/CHANGELOG.md @@ -1,5 +1,11 @@ # @latticexyz/faucet +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/faucet/package.json b/packages/faucet/package.json index 49a37494ae..9363249acb 100644 --- a/packages/faucet/package.json +++ b/packages/faucet/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/faucet", - "version": "2.2.13", + "version": "2.2.14", "description": "Faucet API for Lattice testnet", "repository": { "type": "git", diff --git a/packages/gas-report/CHANGELOG.md b/packages/gas-report/CHANGELOG.md index 406195df47..c8e8c190ad 100644 --- a/packages/gas-report/CHANGELOG.md +++ b/packages/gas-report/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/gas-report/package.json b/packages/gas-report/package.json index b0cdc29a15..ec7ecdbbd0 100644 --- a/packages/gas-report/package.json +++ b/packages/gas-report/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/gas-report", - "version": "2.2.13", + "version": "2.2.14", "description": "Gas reporter for specific lines within forge tests", "repository": { "type": "git", diff --git a/packages/protocol-parser/CHANGELOG.md b/packages/protocol-parser/CHANGELOG.md index c9204f0ebb..7b30ad8eb4 100644 --- a/packages/protocol-parser/CHANGELOG.md +++ b/packages/protocol-parser/CHANGELOG.md @@ -1,5 +1,13 @@ # @latticexyz/protocol-parser +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 +- @latticexyz/config@2.2.14 +- @latticexyz/schema-type@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/protocol-parser/package.json b/packages/protocol-parser/package.json index 4aff4a9aea..7e6a1b8ff9 100644 --- a/packages/protocol-parser/package.json +++ b/packages/protocol-parser/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/protocol-parser", - "version": "2.2.13", + "version": "2.2.14", "description": "Parser utilities for the MUD protocol", "repository": { "type": "git", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 3be13ff7d0..8c23fdba45 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/recs@2.2.14 +- @latticexyz/store@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index e878e742f8..7ef5ffe597 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/react", - "version": "2.2.13", + "version": "2.2.14", "description": "React tools for MUD client.", "repository": { "type": "git", diff --git a/packages/recs/CHANGELOG.md b/packages/recs/CHANGELOG.md index e7fe7223ae..762140fcae 100644 --- a/packages/recs/CHANGELOG.md +++ b/packages/recs/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/schema-type@2.2.14 +- @latticexyz/utils@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/recs/package.json b/packages/recs/package.json index da42eb0d7d..b592eb9568 100644 --- a/packages/recs/package.json +++ b/packages/recs/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/recs", - "version": "2.2.13", + "version": "2.2.14", "repository": { "type": "git", "url": "https://github.com/latticexyz/mud.git", diff --git a/packages/schema-type/CHANGELOG.md b/packages/schema-type/CHANGELOG.md index 08f51c4a40..56f8190f34 100644 --- a/packages/schema-type/CHANGELOG.md +++ b/packages/schema-type/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ## 2.2.12 diff --git a/packages/schema-type/package.json b/packages/schema-type/package.json index 0b5b2b97c1..6191115626 100644 --- a/packages/schema-type/package.json +++ b/packages/schema-type/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/schema-type", - "version": "2.2.13", + "version": "2.2.14", "description": "SchemaType enum for various languages", "repository": { "type": "git", diff --git a/packages/solhint-config-mud/CHANGELOG.md b/packages/solhint-config-mud/CHANGELOG.md index cd4de306d4..39c2740f84 100644 --- a/packages/solhint-config-mud/CHANGELOG.md +++ b/packages/solhint-config-mud/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ## 2.2.12 diff --git a/packages/solhint-config-mud/package.json b/packages/solhint-config-mud/package.json index ee8bd4aa3c..522f16ae35 100644 --- a/packages/solhint-config-mud/package.json +++ b/packages/solhint-config-mud/package.json @@ -1,6 +1,6 @@ { "name": "solhint-config-mud", - "version": "2.2.13", + "version": "2.2.14", "repository": { "type": "git", "url": "https://github.com/latticexyz/mud.git", diff --git a/packages/solhint-plugin-mud/CHANGELOG.md b/packages/solhint-plugin-mud/CHANGELOG.md index cd4de306d4..39c2740f84 100644 --- a/packages/solhint-plugin-mud/CHANGELOG.md +++ b/packages/solhint-plugin-mud/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ## 2.2.12 diff --git a/packages/solhint-plugin-mud/package.json b/packages/solhint-plugin-mud/package.json index 0ddca9076c..eac28b2ce4 100644 --- a/packages/solhint-plugin-mud/package.json +++ b/packages/solhint-plugin-mud/package.json @@ -1,6 +1,6 @@ { "name": "solhint-plugin-mud", - "version": "2.2.13", + "version": "2.2.14", "repository": { "type": "git", "url": "https://github.com/latticexyz/mud.git", diff --git a/packages/stash/CHANGELOG.md b/packages/stash/CHANGELOG.md index 4f6eab6e88..f4bef51ee7 100644 --- a/packages/stash/CHANGELOG.md +++ b/packages/stash/CHANGELOG.md @@ -1,5 +1,44 @@ # @latticexyz/stash +## 2.2.14 + +### Patch Changes + +- 93d0e76: Added `useStash` React hook. It's heavily inspired by Zustand's `useStore` and accepts a stash, a state selector, an an optional equality function to avoid unnecessary re-render cycles when returning unstable values. + + Also updated `getRecord` and `getRecords` to each take either a `stash` or `state` object for more ergonomic use with `useStash`. + + ```ts + import { useStash } from "@latticexyz/stash/react"; + import { getRecord } from "@latticexyz/stash"; + import config from "../mud.config"; + + const tables = config.namespaces.app.tables; + + export function PlayerName({ playerId }) { + const record = useStash(stash, (state) => getRecord({ state, table: tables.Player, key: { playerId } })); + ... + } + ``` + + ```ts + import isEqual from "fast-deep-equal"; + import { useStash } from "@latticexyz/stash/react"; + import { getRecords } from "@latticexyz/stash"; + import config from "../mud.config"; + + export function PlayerNames() { + const record = useStash(stash, (state) => getRecords({ state, table: tables.Player }), { isEqual }); + ... + } + ``` + + - @latticexyz/common@2.2.14 + - @latticexyz/config@2.2.14 + - @latticexyz/protocol-parser@2.2.14 + - @latticexyz/schema-type@2.2.14 + - @latticexyz/store@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/stash/package.json b/packages/stash/package.json index fab083d463..4df9785283 100644 --- a/packages/stash/package.json +++ b/packages/stash/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/stash", - "version": "2.2.13", + "version": "2.2.14", "description": "High performance client store and query engine for MUD", "repository": { "type": "git", diff --git a/packages/store-indexer/CHANGELOG.md b/packages/store-indexer/CHANGELOG.md index b0280ab5a1..7da7c4e9cd 100644 --- a/packages/store-indexer/CHANGELOG.md +++ b/packages/store-indexer/CHANGELOG.md @@ -1,5 +1,15 @@ # @latticexyz/store-indexer +## 2.2.14 + +### Patch Changes + +- @latticexyz/store-sync@2.2.14 +- @latticexyz/block-logs-stream@2.2.14 +- @latticexyz/common@2.2.14 +- @latticexyz/protocol-parser@2.2.14 +- @latticexyz/store@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/store-indexer/package.json b/packages/store-indexer/package.json index 4f43405fff..7636bc7557 100644 --- a/packages/store-indexer/package.json +++ b/packages/store-indexer/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/store-indexer", - "version": "2.2.13", + "version": "2.2.14", "description": "Minimal Typescript indexer for Store", "repository": { "type": "git", diff --git a/packages/store-sync/CHANGELOG.md b/packages/store-sync/CHANGELOG.md index 0ce66c9a58..0855b88bb5 100644 --- a/packages/store-sync/CHANGELOG.md +++ b/packages/store-sync/CHANGELOG.md @@ -1,5 +1,20 @@ # @latticexyz/store-sync +## 2.2.14 + +### Patch Changes + +- Updated dependencies [93d0e76] + - @latticexyz/stash@2.2.14 + - @latticexyz/block-logs-stream@2.2.14 + - @latticexyz/common@2.2.14 + - @latticexyz/config@2.2.14 + - @latticexyz/protocol-parser@2.2.14 + - @latticexyz/recs@2.2.14 + - @latticexyz/schema-type@2.2.14 + - @latticexyz/store@2.2.14 + - @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/store-sync/package.json b/packages/store-sync/package.json index 44d4c8647c..b484410fd2 100644 --- a/packages/store-sync/package.json +++ b/packages/store-sync/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/store-sync", - "version": "2.2.13", + "version": "2.2.14", "description": "Utilities to sync MUD Store events with a client or cache", "repository": { "type": "git", diff --git a/packages/store/CHANGELOG.md b/packages/store/CHANGELOG.md index 11f5f45b4a..febd2addca 100644 --- a/packages/store/CHANGELOG.md +++ b/packages/store/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 +- @latticexyz/config@2.2.14 +- @latticexyz/protocol-parser@2.2.14 +- @latticexyz/schema-type@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/store/package.json b/packages/store/package.json index 6d5bf7d7c5..17b1518b34 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/store", - "version": "2.2.13", + "version": "2.2.14", "description": "Store", "repository": { "type": "git", diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 04f099225c..ce9c3444e3 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## 2.2.14 + ## 2.2.13 ## 2.2.12 diff --git a/packages/utils/package.json b/packages/utils/package.json index caf079b688..73ea915d21 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/utils", - "version": "2.2.13", + "version": "2.2.14", "repository": { "type": "git", "url": "https://github.com/latticexyz/mud.git", diff --git a/packages/world-module-erc20/CHANGELOG.md b/packages/world-module-erc20/CHANGELOG.md index ec480f34f0..d86539c0df 100644 --- a/packages/world-module-erc20/CHANGELOG.md +++ b/packages/world-module-erc20/CHANGELOG.md @@ -1,5 +1,14 @@ # @latticexyz/world-module-erc20 +## 2.2.14 + +### Patch Changes + +- 8eaad30: Changed ERC20 and ERC721 related modules to use public library methods instead of manual `delegatecall`s. + - @latticexyz/schema-type@2.2.14 + - @latticexyz/store@2.2.14 + - @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/world-module-erc20/package.json b/packages/world-module-erc20/package.json index 2baec5a430..e5a483c838 100644 --- a/packages/world-module-erc20/package.json +++ b/packages/world-module-erc20/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/world-module-erc20", - "version": "2.2.13", + "version": "2.2.14", "description": "ERC20 world module", "repository": { "type": "git", diff --git a/packages/world-module-metadata/CHANGELOG.md b/packages/world-module-metadata/CHANGELOG.md index b6ef0d6138..2dbdd1d7ab 100644 --- a/packages/world-module-metadata/CHANGELOG.md +++ b/packages/world-module-metadata/CHANGELOG.md @@ -1,5 +1,13 @@ # @latticexyz/world-module-metadata +## 2.2.14 + +### Patch Changes + +- @latticexyz/schema-type@2.2.14 +- @latticexyz/store@2.2.14 +- @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/world-module-metadata/package.json b/packages/world-module-metadata/package.json index 3d764f52f3..bba356c77a 100644 --- a/packages/world-module-metadata/package.json +++ b/packages/world-module-metadata/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/world-module-metadata", - "version": "2.2.13", + "version": "2.2.14", "description": "Metadata world module", "repository": { "type": "git", diff --git a/packages/world-modules/CHANGELOG.md b/packages/world-modules/CHANGELOG.md index b3ff337d82..dcc252a1ac 100644 --- a/packages/world-modules/CHANGELOG.md +++ b/packages/world-modules/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- 8eaad30: Changed ERC20 and ERC721 related modules to use public library methods instead of manual `delegatecall`s. + - @latticexyz/common@2.2.14 + - @latticexyz/config@2.2.14 + - @latticexyz/schema-type@2.2.14 + - @latticexyz/store@2.2.14 + - @latticexyz/world@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/world-modules/package.json b/packages/world-modules/package.json index 45431ca5d6..fadfa1252a 100644 --- a/packages/world-modules/package.json +++ b/packages/world-modules/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/world-modules", - "version": "2.2.13", + "version": "2.2.14", "description": "World modules", "repository": { "type": "git", diff --git a/packages/world/CHANGELOG.md b/packages/world/CHANGELOG.md index c39386b036..84c010ef77 100644 --- a/packages/world/CHANGELOG.md +++ b/packages/world/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.2.14 + +### Patch Changes + +- @latticexyz/common@2.2.14 +- @latticexyz/config@2.2.14 +- @latticexyz/protocol-parser@2.2.14 +- @latticexyz/schema-type@2.2.14 +- @latticexyz/store@2.2.14 + ## 2.2.13 ### Patch Changes diff --git a/packages/world/package.json b/packages/world/package.json index e9842d110e..ed2f7ab488 100644 --- a/packages/world/package.json +++ b/packages/world/package.json @@ -1,6 +1,6 @@ { "name": "@latticexyz/world", - "version": "2.2.13", + "version": "2.2.14", "description": "World framework", "repository": { "type": "git", From 9c1ca41560e2b3b319976794a73807f391e78b1b Mon Sep 17 00:00:00 2001 From: Karolis Ramanauskas Date: Fri, 25 Oct 2024 12:46:53 +0300 Subject: [PATCH 2/3] fix(explorer): format default sql query (#3307) --- .changeset/perfect-zebras-rest.md | 5 + .../[worldAddress]/explore/Explorer.tsx | 6 +- .../worlds/[worldAddress]/explore/consts.ts | 370 ++++++++++++++++++ 3 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 .changeset/perfect-zebras-rest.md diff --git a/.changeset/perfect-zebras-rest.md b/.changeset/perfect-zebras-rest.md new file mode 100644 index 0000000000..1916fe7731 --- /dev/null +++ b/.changeset/perfect-zebras-rest.md @@ -0,0 +1,5 @@ +--- +"@latticexyz/explorer": patch +--- + +When accessing a new table in Explore tab, the SQL editor now encloses column names that are also PostgreSQL keywords in double quotes in order to prevent invalid queries. diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/Explorer.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/Explorer.tsx index f7d19fbf86..69ca454bf9 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/Explorer.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/Explorer.tsx @@ -12,6 +12,7 @@ import { indexerForChainId } from "../../../../utils/indexerForChainId"; import { SQLEditor } from "./SQLEditor"; import { TableSelector } from "./TableSelector"; import { TablesViewer } from "./TablesViewer"; +import { postgresKeywords } from "./consts"; export function Explorer() { const { worldAddress } = useParams(); @@ -31,7 +32,10 @@ export function Explorer() { if (indexer.type === "sqlite") { setQuery(`SELECT * FROM "${tableName}"`); } else { - setQuery(`SELECT ${Object.keys(table.schema).join(", ")} FROM ${tableName}`); + const columns = Object.keys(table.schema).map((column) => + postgresKeywords.includes(column.toLowerCase()) ? `"${column}"` : column, + ); + setQuery(`SELECT ${columns.join(", ")} FROM ${tableName}`); } } }, [chainId, setQuery, selectedTableId, table, worldAddress, prevSelectedTableId, query, indexer.type]); diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/consts.ts b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/consts.ts index acbc6a9f10..74ecfa50ae 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/consts.ts +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/consts.ts @@ -41,3 +41,373 @@ export const monacoOptions: editor.IStandaloneEditorConstructionOptions = { automaticLayout: true, fixedOverflowWidgets: true, }; + +// Ref: https://www.postgresql.org/docs/8.1/sql-keywords-appendix.html +export const postgresKeywords = [ + "a", + "abort", + "absolute", + "access", + "action", + "add", + "admin", + "after", + "aggregate", + "all", + "also", + "alter", + "always", + "analyse", + "analyze", + "and", + "any", + "array", + "as", + "asc", + "assertion", + "assignment", + "asymmetric", + "at", + "authorization", + "backward", + "before", + "begin", + "between", + "bigint", + "binary", + "bit", + "boolean", + "both", + "by", + "cache", + "called", + "cascade", + "cascaded", + "case", + "cast", + "catalog", + "chain", + "char", + "character", + "characteristics", + "check", + "checkpoint", + "class", + "close", + "cluster", + "coalesce", + "collate", + "column", + "comment", + "commit", + "committed", + "configuration", + "connection", + "constraint", + "constraints", + "content", + "continue", + "conversion", + "copy", + "cost", + "create", + "cross", + "csv", + "current", + "current_catalog", + "current_date", + "current_role", + "current_time", + "current_timestamp", + "current_user", + "cursor", + "cycle", + "database", + "day", + "deallocate", + "dec", + "decimal", + "declare", + "default", + "defaults", + "deferrable", + "deferred", + "delete", + "delimiter", + "delimiters", + "desc", + "dictionary", + "disable", + "discard", + "distinct", + "do", + "document", + "domain", + "double", + "drop", + "each", + "else", + "enable", + "encoding", + "encrypted", + "end", + "escape", + "except", + "exclude", + "excluding", + "exclusive", + "execute", + "exists", + "explain", + "external", + "extract", + "false", + "family", + "fetch", + "first", + "float", + "following", + "for", + "force", + "foreign", + "forward", + "freeze", + "from", + "full", + "function", + "functions", + "global", + "grant", + "granted", + "greatest", + "group", + "handler", + "having", + "header", + "hold", + "hour", + "identity", + "if", + "ilike", + "immediate", + "immutable", + "implicit", + "in", + "including", + "increment", + "index", + "indexes", + "inherit", + "inherits", + "initially", + "inner", + "inout", + "input", + "insensitive", + "insert", + "instead", + "int", + "integer", + "intersect", + "interval", + "into", + "invoker", + "is", + "isnull", + "isolation", + "join", + "key", + "language", + "large", + "last", + "lateral", + "leading", + "least", + "left", + "level", + "like", + "limit", + "listen", + "load", + "local", + "localtime", + "localtimestamp", + "location", + "lock", + "mapping", + "match", + "maxvalue", + "minute", + "minvalue", + "mode", + "month", + "move", + "name", + "names", + "national", + "natural", + "nchar", + "new", + "next", + "no", + "none", + "not", + "nothing", + "notify", + "notnull", + "nowait", + "null", + "nullif", + "numeric", + "object", + "of", + "off", + "offset", + "oids", + "old", + "on", + "only", + "operator", + "option", + "options", + "or", + "order", + "out", + "outer", + "over", + "overlaps", + "overlay", + "owned", + "owner", + "parser", + "partial", + "partition", + "passing", + "password", + "placing", + "plans", + "position", + "preceding", + "precision", + "prepare", + "prepared", + "preserve", + "primary", + "prior", + "privileges", + "procedural", + "procedure", + "quote", + "range", + "read", + "real", + "reassign", + "recheck", + "recursive", + "ref", + "references", + "reindex", + "relative", + "release", + "rename", + "repeatable", + "replace", + "replica", + "reset", + "restart", + "restrict", + "returning", + "returns", + "revoke", + "right", + "role", + "rollback", + "row", + "rows", + "rule", + "savepoint", + "schema", + "scroll", + "search", + "second", + "security", + "select", + "sequence", + "sequences", + "serializable", + "server", + "session", + "session_user", + "set", + "setof", + "share", + "show", + "similar", + "simple", + "smallint", + "some", + "stable", + "standalone", + "start", + "statement", + "statistics", + "stdin", + "stdout", + "storage", + "strict", + "strip", + "substring", + "symmetric", + "sysid", + "system", + "table", + "tablespace", + "temp", + "template", + "temporary", + "text", + "then", + "time", + "timestamp", + "to", + "trailing", + "transaction", + "treat", + "trigger", + "trim", + "true", + "truncate", + "trusted", + "type", + "unbounded", + "uncommitted", + "unencrypted", + "union", + "unique", + "unknown", + "unlisten", + "until", + "update", + "vacuum", + "valid", + "validator", + "value", + "values", + "varchar", + "variadic", + "varying", + "verbose", + "version", + "view", + "volatile", + "when", + "where", + "whitespace", + "window", + "with", + "without", + "work", + "write", + "year", + "zone", +]; From b8afc07a8fab2a504943e7329ee80413d71d4d3f Mon Sep 17 00:00:00 2001 From: Karolis Ramanauskas Date: Fri, 25 Oct 2024 13:19:19 +0300 Subject: [PATCH 3/3] fix(explorer): handle empty queries (#3326) --- .../[chainName]/worlds/WorldsForm.tsx | 2 +- .../explore/EditableTableCell.tsx | 4 ++- .../[worldAddress]/explore/TableSelector.tsx | 2 +- .../[worldAddress]/explore/TablesViewer.tsx | 35 ++++++++++--------- .../explore/useMonacoErrorMarker.ts | 5 +-- .../explore/useQueryValidator.ts | 15 +++++--- .../(explorer)/api/sqlite-indexer/route.ts | 2 +- .../src/app/(explorer)/hooks/useHashState.ts | 3 +- .../(explorer)/queries/useTableDataQuery.ts | 23 ++++++------ .../app/(explorer)/queries/useTablesQuery.ts | 3 ++ .../explorer/src/components/AccountSelect.tsx | 2 +- packages/explorer/src/observer/store.ts | 1 + packages/explorer/tsconfig.json | 1 + 13 files changed, 58 insertions(+), 40 deletions(-) diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/WorldsForm.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/WorldsForm.tsx index 7fe546dd6a..d590fcfc20 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/WorldsForm.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/WorldsForm.tsx @@ -41,7 +41,7 @@ export function WorldsForm({ worlds }: { worlds: Address[] }) { function onLuckyWorld() { if (worlds.length > 0) { const luckyAddress = worlds[Math.floor(Math.random() * worlds.length)]; - router.push(getWorldUrl(chainName as string, luckyAddress)); + router.push(getWorldUrl(chainName as string, luckyAddress as Address)); } } diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/EditableTableCell.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/EditableTableCell.tsx index 921add083e..7d1e8a8cf0 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/EditableTableCell.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/EditableTableCell.tsx @@ -37,10 +37,12 @@ export function EditableTableCell({ name, table, keyTuple, value: defaultValue } const account = useAccount(); const valueSchema = getValueSchema(table); - const fieldType = valueSchema[name as never].type; + const fieldType = valueSchema?.[name as never]?.type; const { mutate, isPending } = useMutation({ mutationFn: async (newValue: unknown) => { + if (!fieldType) throw new Error("Field type not found"); + const fieldIndex = getFieldIndex(getSchemaTypes(valueSchema), name); const encodedFieldValue = encodeField(fieldType, newValue); const txHash = await writeContract(wagmiConfig, { diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TableSelector.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TableSelector.tsx index ee01049a33..e526d6f62c 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TableSelector.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TableSelector.tsx @@ -39,7 +39,7 @@ export function TableSelector({ tables }: { tables?: Table[] }) { const selectedTableConfig = tables?.find(({ tableId }) => tableId === selectedTableId); useEffect(() => { - if (!selectedTableId && Array.isArray(tables) && tables.length > 0) { + if (!selectedTableId && tables?.[0]) { setTableId(tables[0].tableId); } }, [selectedTableId, setTableId, tables]); diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TablesViewer.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TablesViewer.tsx index 51c137400e..5f6303fc55 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TablesViewer.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/TablesViewer.tsx @@ -1,8 +1,8 @@ import { ArrowUpDownIcon, LoaderIcon, TriangleAlertIcon } from "lucide-react"; import { parseAsJson, parseAsString, useQueryState } from "nuqs"; import { useMemo } from "react"; -import { Schema, Table as TableType } from "@latticexyz/config"; -import { getKeySchema, getKeyTuple, getSchemaPrimitives } from "@latticexyz/protocol-parser/internal"; +import { Table as TableType } from "@latticexyz/config"; +import { getKeySchema, getKeyTuple } from "@latticexyz/protocol-parser/internal"; import { ColumnDef, SortingState, @@ -37,7 +37,7 @@ export function TablesViewer({ table, query }: { table?: TableType; query?: stri const [globalFilter, setGlobalFilter] = useQueryState("filter", parseAsString.withDefault("")); const [sorting, setSorting] = useQueryState("sort", parseAsJson().withDefault(initialSortingState)); - const tableColumns: ColumnDef>[] = useMemo(() => { + const tableColumns: ColumnDef>[] = useMemo(() => { if (!table || !tableData) return []; return tableData.columns.map((name) => { @@ -125,22 +125,23 @@ export function TablesViewer({ table, query }: { table?: TableType; query?: stri
- {reactTable.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder - ? null - : flexRender(header.column.columnDef.header, header.getContext())} - - ); - })} - - ))} + {!isError && + reactTable.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender(header.column.columnDef.header, header.getContext())} + + ); + })} + + ))} - {reactTable.getRowModel().rows?.length ? ( + {!isError && reactTable.getRowModel().rows?.length ? ( reactTable.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useMonacoErrorMarker.ts b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useMonacoErrorMarker.ts index 03aebc2698..504b0d3422 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useMonacoErrorMarker.ts +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useMonacoErrorMarker.ts @@ -17,8 +17,9 @@ export function useMonacoErrorMarker() { startColumn: number; endColumn: number; }) => { - if (monaco) { - monaco.editor.setModelMarkers(monaco.editor.getModels()[0], "sql", [ + const model = monaco?.editor.getModels()[0]; + if (model) { + monaco.editor.setModelMarkers(model, "sql", [ { severity: monaco.MarkerSeverity.Error, message, diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useQueryValidator.ts b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useQueryValidator.ts index 6d02f1d729..2b65ee70f7 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useQueryValidator.ts +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/explore/useQueryValidator.ts @@ -17,12 +17,15 @@ function findErrorPosition(query: string, target: string) { let currentPosition = 0; for (let i = 0; i < lines.length; i++) { - if (currentPosition + lines[i].length >= query.indexOf(target)) { + const len = lines[i]?.length; + if (!len) continue; + + if (currentPosition + len >= query.indexOf(target)) { startLineNumber = i + 1; startColumn = query.indexOf(target) - currentPosition + 1; break; } - currentPosition += lines[i].length + 1; + currentPosition += len + 1; } return { @@ -76,17 +79,21 @@ export function useQueryValidator(table?: Table) { } } - monaco.editor.setModelMarkers(monaco.editor.getModels()[0], "sql", []); + const model = monaco?.editor.getModels()[0]; + if (model) { + monaco.editor.setModelMarkers(model, "sql", []); + } return true; } catch (error) { if (error instanceof Error) { const lines = decodedQuery.split("\n"); + const lastLine = lines[lines.length - 1]; setErrorMarker({ message: error.message, startLineNumber: 1, endLineNumber: lines.length, startColumn: 1, - endColumn: lines[lines.length - 1].length + 1, + endColumn: lastLine ? lastLine.length + 1 : 1, }); } return false; diff --git a/packages/explorer/src/app/(explorer)/api/sqlite-indexer/route.ts b/packages/explorer/src/app/(explorer)/api/sqlite-indexer/route.ts index 8fd38407d6..5ba1f543bb 100644 --- a/packages/explorer/src/app/(explorer)/api/sqlite-indexer/route.ts +++ b/packages/explorer/src/app/(explorer)/api/sqlite-indexer/route.ts @@ -19,7 +19,7 @@ export async function POST(request: Request) { const result = []; for (const { query } of queries) { const data = (await db?.prepare(query).all()) as SqliteTable; - if (!data) { + if (!data || !data[0]) { throw new Error("No data found"); } diff --git a/packages/explorer/src/app/(explorer)/hooks/useHashState.ts b/packages/explorer/src/app/(explorer)/hooks/useHashState.ts index b34f70189f..b43298afa4 100644 --- a/packages/explorer/src/app/(explorer)/hooks/useHashState.ts +++ b/packages/explorer/src/app/(explorer)/hooks/useHashState.ts @@ -17,7 +17,7 @@ export function useHashState() { const setHash = (newHash: string) => { let updatedUrl = window.location.href; updatedUrl = queryString.stringifyUrl({ - url: updatedUrl.split("#")[0], + url: updatedUrl.split("#")[0] ?? "", fragmentIdentifier: newHash, }); @@ -37,7 +37,6 @@ export function useHashState() { useEffect(() => { window.addEventListener("hashchange", handleHashChange); - return () => { window.removeEventListener("hashchange", handleHashChange); }; diff --git a/packages/explorer/src/app/(explorer)/queries/useTableDataQuery.ts b/packages/explorer/src/app/(explorer)/queries/useTableDataQuery.ts index 0ef6993129..38c112d42b 100644 --- a/packages/explorer/src/app/(explorer)/queries/useTableDataQuery.ts +++ b/packages/explorer/src/app/(explorer)/queries/useTableDataQuery.ts @@ -13,7 +13,7 @@ type Props = { export type TableData = { columns: string[]; - rows: Record[]; + rows: Record[]; }; export function useTableDataQuery({ table, query }: Props) { @@ -45,21 +45,24 @@ export function useTableDataQuery({ table, query }: Props) { return data; }, - select: (data: DozerResponse) => { - if (!table || !data?.result?.[0]) return; + select: (data: DozerResponse): TableData | undefined => { + if (!table || !data?.result?.[0]) return undefined; - const schemaKeys = Object.keys(table.schema); const result = data.result[0]; - const columnKeys = result[0] - .map((columnKey) => { - const schemaKey = schemaKeys.find((schemaKey) => schemaKey.toLowerCase() === columnKey); + // if columns are undefined, the result is empty + if (!result[0]) return undefined; + + const schema = Object.keys(table.schema); + const columns = result[0] + ?.map((columnKey) => { + const schemaKey = schema.find((schemaKey) => schemaKey.toLowerCase() === columnKey); return schemaKey || columnKey; }) - .filter((key) => schemaKeys.includes(key)); - const rows = result.slice(1).map((row) => Object.fromEntries(columnKeys.map((key, index) => [key, row[index]]))); + .filter((key) => schema.includes(key)); + const rows = result.slice(1).map((row) => Object.fromEntries(columns.map((key, index) => [key, row[index]]))); return { - columns: columnKeys, + columns, rows, }; }, diff --git a/packages/explorer/src/app/(explorer)/queries/useTablesQuery.ts b/packages/explorer/src/app/(explorer)/queries/useTablesQuery.ts index 8220d89803..cce7ea9550 100644 --- a/packages/explorer/src/app/(explorer)/queries/useTablesQuery.ts +++ b/packages/explorer/src/app/(explorer)/queries/useTablesQuery.ts @@ -1,5 +1,6 @@ import { useParams } from "next/navigation"; import { Hex } from "viem"; +import { isDefined } from "@latticexyz/common/utils"; import { Table } from "@latticexyz/config"; import mudConfig from "@latticexyz/store/mud.config"; import { useQuery } from "@tanstack/react-query"; @@ -42,6 +43,7 @@ export function useTablesQuery() { return data.result[0] .slice(1) .map((row: string[]) => { + if (!row[0] || !row[2] || !row[3] || !row[4] || !row[5]) return undefined; return decodeTable({ tableId: row[0], keySchema: row[2], @@ -50,6 +52,7 @@ export function useTablesQuery() { abiEncodedFieldNames: row[5], }); }) + .filter(isDefined) .sort(({ namespace }) => (internalNamespaces.includes(namespace) ? 1 : -1)); }, refetchInterval: 5000, diff --git a/packages/explorer/src/components/AccountSelect.tsx b/packages/explorer/src/components/AccountSelect.tsx index e7a276e9fe..f6aecade8e 100644 --- a/packages/explorer/src/components/AccountSelect.tsx +++ b/packages/explorer/src/components/AccountSelect.tsx @@ -9,7 +9,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from ". import { TruncatedHex } from "./ui/TruncatedHex"; function AccountSelectItem({ connector }: { connector: AnvilConnector }) { - const address = connector.accounts[0].address; + const address = connector.accounts[0]?.address; const { data: balance } = useBalance({ address, query: { diff --git a/packages/explorer/src/observer/store.ts b/packages/explorer/src/observer/store.ts index 19c2196dae..680b5e6e6e 100644 --- a/packages/explorer/src/observer/store.ts +++ b/packages/explorer/src/observer/store.ts @@ -36,6 +36,7 @@ channel.addEventListener("message", ({ data }: MessageEvent) => { if (data.type === "ping") return; store.setState((state) => { const write = data.type === "write" ? ({ ...data, events: [] } satisfies Write) : state.writes[data.writeId]; + if (!write) return state; return { writes: { ...state.writes, diff --git a/packages/explorer/tsconfig.json b/packages/explorer/tsconfig.json index 97843caf0c..de514c0fed 100644 --- a/packages/explorer/tsconfig.json +++ b/packages/explorer/tsconfig.json @@ -4,6 +4,7 @@ "allowJs": true, "incremental": true, "isolatedModules": true, + "noUncheckedIndexedAccess": true, "jsx": "preserve", "plugins": [ {