Skip to content

refactor: replace lodash imports with built-in or custom#8878

Open
mscolnick wants to merge 3 commits intomainfrom
ms/reduce-lodash-es
Open

refactor: replace lodash imports with built-in or custom#8878
mscolnick wants to merge 3 commits intomainfrom
ms/reduce-lodash-es

Conversation

@mscolnick
Copy link
Copy Markdown
Contributor

Updated various components to use custom utility functions for string and array operations instead of lodash. This includes replacing capitalize, startCase, sortBy, uniq, and range with their respective implementations from local utility files. This change aims to reduce dependencies and improve code maintainability.

Updated various components to use custom utility functions for string and array operations instead of lodash. This includes replacing `capitalize`, `startCase`, `sortBy`, `uniq`, and `range` with their respective implementations from local utility files. This change aims to reduce dependencies and improve code maintainability.
Copilot AI review requested due to automatic review settings March 26, 2026 01:18
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
marimo-docs Ready Ready Preview, Comment Mar 27, 2026 2:09pm

Request Review

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors the frontend to reduce lodash-es usage by replacing common helpers (capitalize, startCase, sortBy, uniq, range, pick, isEqual, once, etc.) with locally defined utilities or smaller dedicated deps (dequal), aiming to shrink dependencies and centralize shared behavior.

Changes:

  • Added/extended local utility helpers in utils/strings.ts, utils/arrays.ts, and utils/objects.ts.
  • Replaced many lodash-es imports across plugins, core state, and UI components with local utilities (and dequal for deep equality).
  • Added unit tests for new array helpers.

Reviewed changes

Copilot reviewed 40 out of 40 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
frontend/src/utils/strings.ts Adds capitalize and reimplements startCase, wiring Strings.startCase to the new implementation.
frontend/src/utils/objects.ts Adds Objects.pick to replace lodash pick.
frontend/src/utils/arrays.ts Adds range, uniq, sortBy, partition to replace lodash helpers.
frontend/src/utils/tests/arrays.test.ts Adds unit tests for new array helpers.
frontend/src/plugins/impl/vega/params.ts Switches uniq import to local utils/arrays.
frontend/src/plugins/impl/vega/loader.ts Replaces lodash isNumber check with a native check in bigint parsing middleware.
frontend/src/plugins/impl/plotly/usePlotlyLayout.ts Replaces lodash isEqual/pick usage with dequal + Objects.pick.
frontend/src/plugins/impl/plotly/PlotlyPlugin.tsx Replaces lodash pick usage with Objects.pick for extracting Plotly point fields.
frontend/src/plugins/impl/data-frames/DataFramePlugin.tsx Replaces lodash isEqual with dequal.
frontend/src/plugins/impl/data-explorer/functions/types.ts Replaces lodash isString with typeof === "string".
frontend/src/plugins/impl/data-explorer/components/query-form.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/plugins/impl/data-editor/components.tsx Replaces lodash capitalize with local capitalize.
frontend/src/plugins/impl/chat/chat-ui.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/plugins/impl/RangeSliderPlugin.tsx Replaces lodash isEqual with dequal.
frontend/src/core/state/jotai.ts Replaces lodash isEqual with dequal for deep-equal atoms.
frontend/src/core/saving/state.ts Replaces lodash isEqual with dequal for save-dirty detection.
frontend/src/core/rtc/state.ts Replaces lodash once with local utils/once.
frontend/src/core/network/requests-network.ts Replaces lodash once with local utils/once.
frontend/src/core/codemirror/rtc/extension.ts Replaces lodash isEqual with dequal and uses local once.
frontend/src/core/cells/effects.ts Replaces lodash isEqual with dequal (keeps lodash debounce).
frontend/src/core/cells/cells.ts Replaces lodash isEqual with dequal.
frontend/src/components/variables/variables-table.tsx Replaces lodash sortBy with local sortBy.
frontend/src/components/editor/renderers/layout-select.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/components/editor/renderers/grid-layout/grid-layout.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/components/editor/connections/form-renderers.tsx Replaces lodash partition with local partition.
frontend/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/components/editor/actions/useNotebookActions.tsx Replaces lodash startCase with Strings.startCase.
frontend/src/components/datasources/datasources.tsx Replaces lodash sortBy with local sortBy.
frontend/src/components/data-table/pagination.tsx Replaces lodash range with local range.
frontend/src/components/data-table/hooks/use-column-pinning.ts Replaces lodash isEqual with dequal.
frontend/src/components/data-table/column-header.tsx Replaces lodash capitalize with local capitalize.
frontend/src/components/data-table/charts/storage.ts Replaces lodash capitalize with local capitalize.
frontend/src/components/data-table/charts/forms/common-chart.tsx Replaces lodash capitalize with local capitalize.
frontend/src/components/data-table/charts/components/form-fields.tsx Replaces lodash capitalize with local capitalize.
frontend/src/components/data-table/charts/components/chart-items.tsx Replaces lodash capitalize with local capitalize.
frontend/src/components/chat/tool-call-accordion.tsx Replaces lodash isEmpty with manual emptiness checks.
frontend/src/components/chat/acp/state.ts Replaces lodash capitalize with local capitalize.
frontend/src/components/chat/acp/blocks.tsx Updates imports to use local capitalize/Strings.
frontend/src/components/chat/acp/agent-panel.tsx Replaces lodash capitalize with local capitalize and handles optional agent id.
frontend/src/components/ai/ai-model-dropdown.tsx Replaces lodash capitalize with local capitalize.
Comments suppressed due to low confidence (2)

frontend/src/components/chat/tool-call-accordion.tsx:131

  • ToolArgsRenderer determines emptiness and object-ness via typeof input === "object" + Object.keys(...). This misclassifies arrays (and other non-plain objects) and can render {} for inputs that aren’t actually empty objects. If you only want to special-case plain objects, consider using Array.isArray and a plain-object check; otherwise handle arrays separately (render [] when empty).
  const isEmptyInput =
    typeof input === "object" &&
    Object.keys(input as Record<string, unknown>).length === 0;

  const isObject =
    typeof input === "object" &&
    Object.keys(input as Record<string, unknown>).length > 0;

frontend/src/plugins/impl/vega/loader.ts:58

  • typeof parsedInt === "number" is always true here because Number.parseInt always returns a number (including NaN). This makes the else branch unreachable and suggests the check is not doing what it intends. If the goal is to avoid NaN, use !Number.isNaN(parsedInt) / Number.isFinite(parsedInt); otherwise the conditional can be removed for clarity.

Comment on lines +109 to +121
// eslint-disable-next-line @typescript-eslint/no-explicit-any
pick<V extends Record<string, any>, K extends string>(
obj: V,
keys: readonly K[],
): Pick<V, K & keyof V> {
const result = {} as Record<string, unknown>;
for (const key of keys) {
if (key in obj) {
result[key] = obj[key];
}
}
return result as Pick<V, K & keyof V>;
},
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Objects.pick is a new utility but isn’t covered by the existing utils/__tests__/objects.test.ts suite. Adding a few unit tests (own vs inherited props, missing keys omitted, preserves undefined values for existing keys) would help ensure it behaves consistently with its call sites and the previous lodash behavior.

Copilot uses AI. Check for mistakes.
Comment on lines 75 to 81
{Object.entries(rest).map(([key, value]) => {
if (isEmpty(value)) {
if (
value == null ||
(typeof value === "object" && Object.keys(value).length === 0)
) {
return null;
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The replacement for lodash isEmpty only checks value == null and Object.keys(value).length === 0 for objects. This will incorrectly treat non-plain objects as empty even when they contain data (e.g., new Map([['k','v']]) has Object.keys(...) === []), and it no longer treats empty strings as empty. Consider reintroducing an isEmpty helper that matches the needed semantics (handle strings/arrays/Map/Set distinctly, and treat other objects as empty only when they’re plain objects with no own keys).

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
export function capitalize(str: string): string {
if (!str) {
return "";
}
return str.charAt(0).toUpperCase() + str.slice(1);
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

capitalize is newly exported and used broadly (not just via Strings.startCase), but the utils/__tests__/strings.test.ts suite doesn’t include direct tests for it. Adding a small set of unit tests (empty string, already-capitalized, non-letter first char, mixed-case) would lock in the intended behavior and make future refactors safer.

Copilot uses AI. Check for mistakes.
Comment on lines +81 to +95
export function sortBy<T>(
arr: readonly T[],
key: (item: T) => string | number | undefined | null,
): T[] {
return [...arr].sort((a, b) => {
const ka = key(a) ?? "";
const kb = key(b) ?? "";
if (ka < kb) {
return -1;
}
if (ka > kb) {
return 1;
}
return 0;
});
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sortBy coerces null/undefined keys to an empty string (key(a) ?? ""). This breaks numeric sort behavior when the key can be undefined (e.g., callers like cellIdToIndex.get(...)), because "" compares equal to 0 and will not reliably sort nullish values last (unlike lodash). Consider explicitly ordering null/undefined after non-nullish keys and comparing numbers vs strings in a type-safe way (e.g., handle nullish first, then number subtraction for numbers, else string localeCompare).

Copilot uses AI. Check for mistakes.
Comment on lines +81 to +96
export function sortBy<T>(
arr: readonly T[],
key: (item: T) => string | number | undefined | null,
): T[] {
return [...arr].sort((a, b) => {
const ka = key(a) ?? "";
const kb = key(b) ?? "";
if (ka < kb) {
return -1;
}
if (ka > kb) {
return 1;
}
return 0;
});
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new sortBy implementation doesn’t have a test case for null/undefined sort keys, which is a common usage pattern in this repo (e.g., sorting by Map.get(...)). Adding a unit test that asserts null/undefined keys sort to the end (and that numeric keys sort correctly) would prevent regressions here.

Copilot uses AI. Check for mistakes.
Comment on lines +114 to +118
const result = {} as Record<string, unknown>;
for (const key of keys) {
if (key in obj) {
result[key] = obj[key];
}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Objects.pick uses key in obj, which will include properties found on the prototype chain. Lodash pick only selects an object’s own properties, so this can be a behavioral change and can accidentally include inherited keys. Prefer Object.prototype.hasOwnProperty.call(obj, key) (or Object.hasOwn(obj, key) if available) to restrict picks to own properties.

Copilot uses AI. Check for mistakes.
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 26, 2026

Bundle Report

Changes will decrease total bundle size by 810.58kB (-3.17%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
marimo-esm 24.78MB -810.58kB (-3.17%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: marimo-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/cells-*.js 4.92kB 687.83kB 0.72%
assets/index-*.js -12.06kB 606.5kB -1.95%
assets/chunk-*.js 92 bytes 344.49kB 0.03%
assets/chunk-*.js -23.85kB 442.35kB -5.11%
assets/edit-*.js 62 bytes 371.63kB 0.02%
assets/index-*.css 80 bytes 360.62kB 0.02%
assets/dist-*.js 11.74kB 11.91kB 6944.97% ⚠️
assets/dist-*.js 65 bytes 169 bytes 62.5% ⚠️
assets/dist-*.js -28.15kB 104 bytes -99.63%
assets/dist-*.js (New) 28.26kB 28.26kB 100.0% 🚀
assets/JsonOutput-*.js 683 bytes 307.28kB 0.22%
assets/ai-*.js -18.02kB 248.35kB -6.76%
assets/glide-*.js -42 bytes 248.31kB -0.02%
assets/cell-*.js 45 bytes 182.77kB 0.02%
assets/add-*.js 6 bytes 55.34kB 0.01%
assets/add-*.js -370 bytes 182.08kB -0.2%
assets/agent-*.js -21 bytes 158.21kB -0.01%
assets/dependency-*.js 2 bytes 156.37kB 0.0%
assets/ConnectedDataExplorerComponent-*.js 16 bytes 135.47kB 0.01%
assets/layout-*.js 91 bytes 129.47kB 0.07%
assets/PTSans-*.woff2 (New) 113.56kB 113.56kB 100.0% 🚀
assets/PTSans-*.woff2 (New) 116.14kB 116.14kB 100.0% 🚀
assets/Lora-*.woff2 (New) 83.69kB 83.69kB 100.0% 🚀
assets/FiraMono-*.woff2 (New) 62.3kB 62.3kB 100.0% 🚀
assets/FiraMono-*.woff2 (New) 62.68kB 62.68kB 100.0% 🚀
assets/FiraMono-*.woff2 (New) 67.4kB 67.4kB 100.0% 🚀
assets/panels-*.js 427 bytes 48.49kB 0.89%
assets/file-*.js 170 bytes 47.04kB 0.36%
assets/textarea-*.js (New) 38.25kB 38.25kB 100.0% 🚀
assets/context-*.js -188 bytes 33.6kB -0.56%
assets/chat-*.js 5.98kB 14.66kB 68.92% ⚠️
assets/chat-*.js 1 bytes 32.39kB 0.0%
assets/chat-*.js (New) 8.7kB 8.7kB 100.0% 🚀
assets/dagre-*.js 16 bytes 11.21kB 0.14%
assets/dagre-*.js 1.39kB 28.7kB 5.1% ⚠️
assets/utils-*.js -150 bytes 27.1kB -0.55%
assets/form-*.js 35 bytes 26.31kB 0.13%
assets/react-*.browser.esm-CgWOEYeG.js (New) 25.64kB 25.64kB 100.0% 🚀
assets/session-*.js -119 bytes 24.94kB -0.47%
assets/vega-*.browser-BT4x4sta.js (New) 24.8kB 24.8kB 100.0% 🚀
assets/micromark-*.js (New) 24.12kB 24.12kB 100.0% 🚀
assets/MarimoErrorOutput-*.js 36 bytes 23.57kB 0.15%
assets/useNotebookActions-*.js -59 bytes 22.95kB -0.26%
assets/home-*.js 43 bytes 21.73kB 0.2%
assets/VisuallyHidden-*.js (New) 18.23kB 18.23kB 100.0% 🚀
assets/command-*.js -28 bytes 9.81kB -0.28%
assets/command-*.js 2 bytes 16.3kB 0.01%
assets/vega-*.js 7 bytes 12.7kB 0.06%
assets/app-*.js 47 bytes 11.43kB 0.41%
assets/CellStatus-*.js 1 bytes 11.37kB 0.01%
assets/_baseUniq-*.js 10.29kB 11.3kB 1017.9% ⚠️
assets/switch-*.js -237 bytes 11.24kB -2.06%
assets/useEventListener-*.js 76 bytes 11.21kB 0.68%
assets/spec-*.js -9 bytes 10.8kB -0.08%
assets/run-*.js -28 bytes 10.55kB -0.26%
assets/isArrayLikeObject-*.js 6.67kB 9.99kB 200.78% ⚠️
assets/useCellActionButton-*.js 4 bytes 9.48kB 0.04%
assets/useEvent-*.js 967 bytes 9.0kB 12.04% ⚠️
assets/scratchpad-*.js -28 bytes 8.39kB -0.33%
assets/react-*.esm-DxslCP1T.js (New) 8.37kB 8.37kB 100.0% 🚀
assets/azure-*.js -38.25kB 6.06kB -86.33%
assets/graphlib-*.js -153 bytes 5.93kB -2.51%
assets/useBoolean-*.js -4 bytes 5.77kB -0.07%
assets/markdown-*.js -11.9kB 5.12kB -69.95%
assets/RenderHTML-*.js -32 bytes 4.95kB -0.64%
assets/floating-*.js -32 bytes 4.79kB -0.66%
assets/emotion-*.esm-CyDtkjhK.js (New) 4.37kB 4.37kB 100.0% 🚀
assets/mermaid-*.core-D7O651vj.js (New) 2.38kB 2.38kB 100.0% 🚀
assets/state-*.js -485 bytes 746 bytes -39.4%
assets/_basePickBy-*.js 1.81kB 2.14kB 552.44% ⚠️
assets/get-*.js 363 bytes 1.51kB 31.73% ⚠️
assets/arrays-*.js (New) 1.41kB 1.41kB 100.0% 🚀
assets/merge-*.js -8 bytes 1.32kB -0.6%
assets/isEmpty-*.js 744 bytes 1.22kB 155.97% ⚠️
assets/debounce-*.js -3 bytes 1.06kB -0.28%
assets/strings-*.js (New) 1.06kB 1.06kB 100.0% 🚀
assets/createReducer-*.js 157 bytes 1.04kB 17.68% ⚠️
assets/useLifecycle-*.js -3.36kB 981 bytes -77.42%
assets/maps-*.js -8.36kB 793 bytes -91.34%
assets/isObject-*.js (New) 777 bytes 777 bytes 100.0% 🚀
assets/toNumber-*.js -3 bytes 588 bytes -0.51%
assets/sparkles-*.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/fileToBase64-*.js (New) 479 bytes 479 bytes 100.0% 🚀
assets/_baseSet-*.js -3 bytes 454 bytes -0.66%
assets/memoize-*.js 6 bytes 386 bytes 1.58%
assets/events-*.js (New) 341 bytes 341 bytes 100.0% 🚀
assets/SelectionIndicator-*.js (New) 324 bytes 324 bytes 100.0% 🚀
assets/once-*.js -1.06kB 304 bytes -77.75%
assets/process-*.js 35 bytes 243 bytes 16.83% ⚠️
assets/message-*.js (New) 241 bytes 241 bytes 100.0% 🚀
assets/useDeepCompareMemoize-*.js -1.0kB 232 bytes -81.17%
assets/kiosk-*.js 1 bytes 199 bytes 0.51%
assets/range-*.js (Deleted) -419 bytes 0 bytes -100.0% 🗑️
assets/isSymbol-*.js -3 bytes 152 bytes -1.94%
assets/clone-*.js 3 bytes 103 bytes 3.0%
assets/now-*.js -3 bytes 91 bytes -3.19%
assets/PTSans-*.ttf (Deleted) -288.34kB 0 bytes -100.0% 🗑️
assets/PTSans-*.ttf (Deleted) -278.61kB 0 bytes -100.0% 🗑️
assets/Lora-*.ttf (Deleted) -212.0kB 0 bytes -100.0% 🗑️
assets/FiraMono-*.ttf (Deleted) -170.2kB 0 bytes -100.0% 🗑️
assets/FiraMono-*.ttf (Deleted) -169.06kB 0 bytes -100.0% 🗑️
assets/FiraMono-*.ttf (Deleted) -201.71kB 0 bytes -100.0% 🗑️
assets/react-*.browser.esm-DDRqG5ui.js (Deleted) -25.64kB 0 bytes -100.0% 🗑️
assets/vega-*.browser-BJ9oKrvH.js (Deleted) -24.8kB 0 bytes -100.0% 🗑️
assets/_Uint8Array-*.js (Deleted) -7.42kB 0 bytes -100.0% 🗑️
assets/_baseIsEqual-*.js (Deleted) -4.78kB 0 bytes -100.0% 🗑️
assets/emotion-*.esm-D7FeWASw.js (Deleted) -4.37kB 0 bytes -100.0% 🗑️
assets/reduce-*.js (Deleted) -4.36kB 0 bytes -100.0% 🗑️
assets/mermaid-*.core-CdM8D_p_.js (Deleted) -2.38kB 0 bytes -100.0% 🗑️
assets/_baseEach-*.js (Deleted) -1.64kB 0 bytes -100.0% 🗑️
assets/min-*.js (Deleted) -1.62kB 0 bytes -100.0% 🗑️
assets/sortBy-*.js (Deleted) -1.31kB 0 bytes -100.0% 🗑️
assets/assertNever-*.js (Deleted) -1.15kB 0 bytes -100.0% 🗑️
assets/mode-*.js (Deleted) -533 bytes 0 bytes -100.0% 🗑️
assets/toString-*.js (Deleted) -465 bytes 0 bytes -100.0% 🗑️
assets/hasIn-*.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/_createAggregator-*.js (Deleted) -384 bytes 0 bytes -100.0% 🗑️
assets/_baseFlatten-*.js (Deleted) -364 bytes 0 bytes -100.0% 🗑️
assets/pick-*.js (Deleted) -325 bytes 0 bytes -100.0% 🗑️
assets/toInteger-*.js (Deleted) -248 bytes 0 bytes -100.0% 🗑️
assets/_baseMap-*.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/isString-*.js (Deleted) -169 bytes 0 bytes -100.0% 🗑️
assets/_baseSlice-*.js (Deleted) -168 bytes 0 bytes -100.0% 🗑️
assets/capitalize-*.js (Deleted) -155 bytes 0 bytes -100.0% 🗑️
assets/_hasUnicode-*.js (Deleted) -154 bytes 0 bytes -100.0% 🗑️
assets/_arrayReduce-*.js (Deleted) -121 bytes 0 bytes -100.0% 🗑️
assets/uniq-*.js (Deleted) -108 bytes 0 bytes -100.0% 🗑️

Files in assets/cells-*.js:

  • ./src/core/cells/cells.ts → Total Size: 34.76kB

  • ./src/core/rtc/state.ts → Total Size: 467 bytes

Files in assets/index-*.js:

  • ./src/components/data-table/charts/components/chart-items.tsx → Total Size: 15.46kB

  • ./src/components/data-table/charts/forms/common-chart.tsx → Total Size: 10.33kB

  • ./src/components/data-table/charts/components/form-fields.tsx → Total Size: 29.13kB

  • ./src/components/data-table/charts/storage.ts → Total Size: 1.36kB

  • ./src/core/network/requests-network.ts → Total Size: 11.44kB

  • ./src/plugins/impl/RangeSliderPlugin.tsx → Total Size: 5.3kB

Files in assets/edit-*.js:

  • ./src/components/editor/chrome/wrapper/footer-items/backend-status.tsx → Total Size: 3.6kB

  • ./src/core/cells/effects.ts → Total Size: 456 bytes

Files in assets/JsonOutput-*.js:

  • ./src/components/data-table/column-header.tsx → Total Size: 15.92kB

  • ./src/components/data-table/pagination.tsx → Total Size: 11.54kB

  • ./src/components/data-table/hooks/use-column-pinning.ts → Total Size: 888 bytes

Files in assets/ai-*.js:

  • ./src/components/ai/ai-model-dropdown.tsx → Total Size: 17.88kB

Files in assets/glide-*.js:

  • ./src/plugins/impl/data-editor/components.tsx → Total Size: 9.5kB

Files in assets/cell-*.js:

  • ./src/core/codemirror/rtc/extension.ts → Total Size: 7.81kB

  • ./src/core/saving/state.ts → Total Size: 945 bytes

Files in assets/add-*.js:

  • ./src/components/editor/connections/form-renderers.tsx → Total Size: 5.7kB

Files in assets/agent-*.js:

  • ./src/components/chat/acp/blocks.tsx → Total Size: 33.64kB

  • ./src/components/chat/acp/agent-panel.tsx → Total Size: 36.57kB

  • ./src/components/chat/acp/state.ts → Total Size: 4.39kB

Files in assets/ConnectedDataExplorerComponent-*.js:

  • ./src/plugins/impl/data-explorer/components/query-form.tsx → Total Size: 13.15kB

Files in assets/layout-*.js:

  • ./src/components/editor/renderers/grid-layout/grid-layout.tsx → Total Size: 31.38kB

Files in assets/chat-*.js:

  • ./src/plugins/impl/chat/chat-ui.tsx → Total Size: 25.03kB

Files in assets/chat-*.js:

  • ./src/components/chat/tool-call-accordion.tsx → Total Size: 10.58kB

Files in assets/session-*.js:

  • ./src/components/variables/variables-table.tsx → Total Size: 8.05kB

  • ./src/components/datasources/datasources.tsx → Total Size: 34.47kB

Files in assets/useNotebookActions-*.js:

  • ./src/components/editor/actions/useNotebookActions.tsx → Total Size: 20.62kB

  • ./src/components/editor/renderers/layout-select.tsx → Total Size: 2.36kB

Files in assets/useEvent-*.js:

  • ./src/core/state/jotai.ts → Total Size: 1.54kB

@mscolnick mscolnick added the bug Something isn't working label Mar 26, 2026
Return the original string value instead of empty string when
Number.parseInt returns NaN, matching lodash's previous behavior.
Also restructure as early return to satisfy linter.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants