Skip to content

V2.0 to main - #381

Merged
CarlosNZ merged 215 commits into
mainfrom
v2.0-dev
Jun 24, 2026
Merged

V2.0 to main#381
CarlosNZ merged 215 commits into
mainfrom
v2.0-dev

Conversation

@CarlosNZ

Copy link
Copy Markdown
Owner

All work on V2.0, now solid enough to become main in preparation for beta release

CarlosNZ and others added 30 commits May 26, 2026 18:13
The pnpm workspace relies on three .npmrc settings:
- script-shell=/bin/zsh
- enable-pre-post-scripts=true (so prebuild/postbuild hooks run)
- include-workspace-root=true (so -r and --filter include core)

Previously .npmrc was gitignored, which meant these settings had to be
recreated on every fresh clone. Track the file so the workspace works
out of the box.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the harness's local permission allowlist so it carries forward
across branches in the v2 stack.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…separate-packages

#238 Split themes + custom components into separate packages
* Create workflow for comparing PR build sizes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
#243)

The previous postpublish hook ran a script in the background after a 10s
sleep, and only handled `json-edit-react`. With Changesets, a release can
publish any combination of the three packages, and a postpublish hook on
core won't even fire for a themes-only or components-only release.

Decouple the sync from publish:
- Rewrite scripts/installLatestPackage.mjs to read target versions from
  each package's local package.json, only update deps that the consumer
  actually declares, and poll npm for the exact version (up to 2 min)
  before running `yarn add`.
- Expose it as `pnpm sync-demos`; drop the install step from postpublish
  (README restore still runs).
- Update package-management-guide.md: add `pnpm sync-demos` as step 7 of
  the release flow and fix two stale references.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Add generic type parameter `T` to JsonEditor
`JsonData` collapses to `unknown`, so consumers lost their data shape at
the component boundary. Introduce `JsonEditor<T = JsonData>` and thread
`T` through the public callback types (`UpdateFunction`,
`OnChangeFunction`, `OnErrorFunction`, `FilterFunction`, `NodeData.fullData`,
etc.). Default of `JsonData` preserves source compatibility for existing
consumers.

The generic stays at the boundary: per-node value slots (`NodeData.value`,
`UpdateFunctionProps.newValue/currentValue`, `OnErrorFunction.errorValue/
currentValue`) remain wide, since they are arbitrary-depth slices that no
static type can relate to `T`. Internal types (`BaseNodeProps`,
`CollectionNodeProps`, etc.) keep using the un-parameterized form which
resolves to the `JsonData` default; the inner `Editor` is explicitly
specialised to `JsonEditorProps<JsonData>` and the outer wrapper casts at
the boundary.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Document generic `JsonEditor<T>` in README and migration guide

Adds a "Typed data" subsection under Managing State with a concrete
example, a `[!NOTE]` callout flagging that `T` is an input contract
rather than a runtime invariant, and a one-line note in the Quick
overview migration table.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Add changeset for generic `JsonEditor<T>`

Major bump on `json-edit-react`: emitted `.d.ts` signatures change
(though runtime behaviour and source compatibility for untyped
consumers are preserved by the `T = JsonData` default).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update demo apps to use generic type

* Widen updateLiveData param to JsonData

Aligns updateLiveData's signature with the JsonData root type used by
useUndo<JsonData> in the demo, so the call site no longer needs a cast.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PR bundle-size workflow runs on Ubuntu where /bin/zsh isn't installed.
pnpm wraps every script (even single commands) in `<script-shell> -c
"<body>"`, so any `pnpm <script>` invocation on a non-mac runner blows
up with `spawn /bin/zsh ENOENT`. PR #240 only touched src/**, so the
workflow's paths-filter routed it through `pnpm exec rollup -c` (direct
binary, no shell) — the latent zsh dependency wasn't exercised.
PR #257 touches packages/themes and packages/components, which invokes
`pnpm --filter ... build`, exposing the issue.

The zsh pin was incidental — codified from a local mac dev environment
when .npmrc was first committed; no script in the workspace uses
zsh-specific syntax. Removing it lets pnpm default to /bin/sh on Unix,
which handles every script here and works on Linux clones / CI runners
out of the box.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Implement standardisation and improved build/publish scripts
* Add changeset for publish workflow standardization

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Refactor out the use of dot.strings as path identifiers
* Add changeset for path identity refactor
* Fix toPathString injectivity for single-empty-key path

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Standardise demo + CCL scripts, add :pack mode, fix base URL

The demo and CCL had inconsistent script vocabularies (demo used
`start:*`, CCL used `dev:*`) and the `:local` suffix meant two
different things in the demo (`start:local` swapped package source;
`build:local` only swapped Vite's base URL). Both projects also used
`base: 'https://carlosnz.github.io/json-edit-react/'` — a CRA carry-over
that caused `vite preview` to load the deployed assets instead of the
local build, which we worked around with ad-hoc `--base=/` flags.

Changes:

- Switch demo's vite `base` to relative `/json-edit-react/`. Removes
  the need for `--base=/` overrides everywhere; deployed behaviour is
  unchanged because gh-pages serves at exactly that path.
- Align demo + CCL script names: bare = npm source, `:local` = workspace
  src, `:build` = workspace build, `:pack` = locally-packed tarball.
  `:local` now consistently means "use local source" everywhere.
- Add `:pack` mode (`pnpm pack-all`): builds and packs all three
  packages via their existing `preview-publish` scripts, extracts each
  tarball to `pack-output/<name>/package/`, strips peer/dev deps, and
  `npm install`s runtime deps so vite can resolve transitive imports
  (e.g. `react-datepicker` for components). Closest pre-publish
  dress rehearsal available.
- Add bare `^json-edit-react$` alias in both vite configs — sub-packages'
  built JS imports core via that name, and in `:pack` mode their files
  live outside the workspace so node_modules walk-up resolution fails
  without it.
- Replace stale `demo:package` root script (referenced non-existent
  `start:package`) with `demo:pack` (chains `pack-all` + `start:pack`).
- Document `:pack` mode and add a "first v2 publish" reminder in
  package-management-guide.md about adding the scoped packages to
  demo/CCL `dependencies` once they're on npm — `yarn build`/`deploy`
  remain broken in default `npm` mode until then.'
- Update SourceIndicator badge for new JRE source modes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Remove useData, add JsonViewer
* Update V2-roadmap.md
* Address Copilot PR review: strip externalTriggers + fix restrictDrag in migration
- JsonViewer also strips externalTriggers at runtime (TS Omit alone wouldn't help JS consumers), since useTriggers bypasses the restrict filters
- Migration recipe (and changeset) include restrictDrag for the toggle case where consumers had explicitly enabled drag in v1
- Hoist NOOP to helpers and re-use across JsonEditor / JsonViewer / ValueNodeWrapper

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Test harness setup
* Add additional utils tests + big re-organisation of utils file structure
* Re-organise utils test to match utils folder
* Add first cluster of Edit flow tests
* Add next round of behavioural RTL tests
* Add testing to build script
Delete the composing useTreeState hook and update all seven consumers to
import only the slice(s) they actually use: useEditing, useCollapse, and
useDragSource. The TreeStateProvider component stays as a thin composing
wrapper for JsonEditor's render.

Add a slice-isolation test suite that asserts each setter only re-renders
its own slice's consumers, pinning the structural claim of the refactor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EditingProvider now exposes named action functions (startEdit, cancelEdit,
setTabDirection, recordPreviousEdit, setPreviousValue), each wrapped in
useCallback for stable identities. The four editing fields share a single
useState object so multi-field transitions commit atomically. cancelOp
stays in a useRef as an imperative side channel. Six consumers updated.

Move ValueNodeWrapper's Tab-nav retry from the render body to a useEffect.
This removes React's "Cannot update a component while rendering a different
component" warning that fired whenever Tab landed on a hidden/uneditable
node.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the state-with-2s-timer collapse model with a pub-sub broadcast.
CollapseProvider exposes `subscribe(handler)` and `setCollapseState(cmd)` —
each CollectionNode subscribes on mount with a path-matching handler; the
broadcast fires synchronously and is not retained anywhere.

Two long-standing oddities go away:
- Back-to-back identical commands now fire reliably (no need to wait out
  the 2s reset window).
- Nodes that mount after a collapse command no longer auto-apply it.

One behavioural trade-off (documented in migration-guide §7): broadcasts
can't punch through a collapse boundary - newly-mounted children evaluate
the current `collapseFilter` rather than replaying a recent command. For
"expand a deep subtree" use cases consumers should manage the `collapse`
prop as state. Path-scoped commands targeting mounted nodes behave the
same as before. V2-roadmap §10 carries a "To consider" note for a future
imperative `expandPath`-style helper if real-world feedback shows users
need it.

Tests:
- New collapseBroadcasts.test.tsx with 10-scenario end-to-end coverage:
  Collapse-All/Expand-All, path-scoped commands with and without
  includeChildren, back-to-back identical commands, late-mount isolation,
  data-swap isolation, onCollapse callback, array-of-commands, and an
  explicit "no setTimeout artefacts" assertion via fake timers.
- New tests in JsonEditor.test.tsx covering the perf optimization
  (children of collapsed nodes don't mount), a multi-criteria functional
  collapse filter (key match, array size, depth), a cascading filter
  change, and a state-dependent filter that flips collapse states across
  a 4-level tree on toggle.
- sliceIsolation.test.tsx collapse test updated to assert the stronger
  pub-sub property: setCollapseState causes zero React re-renders in any
  consumer; the broadcast reaches a subscriber via its handler only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wrap each of the three providers' context-value objects in useMemo so
the value identity is stable across re-renders that don't change the
provider's inputs. With the setters already useCallback-stable from
Parts 3 and 4, the wrapping object literal was the last source of
identity churn — this closes that loop and is the precondition §16's
React.memo pass needs.

Audit of eslint-disabled exhaustive-deps comments across consumer files:
- JsonEditor.tsx: cancelEdit added to the search-debounce effect's deps
  (Part 3's stability promise redeemed).
- CollectionNode.tsx, useTriggers.ts, ValueNodeWrapper.tsx: comments
  sharpened to spell out why the missing deps are *intentionally* not
  listed (fire-only-on-X semantic decisions, not stability workarounds).
- Others left as-is — they're idiomatic closure-stable patterns or
  pre-existing decisions outside §4's scope.

Add a slice-isolation test pinning the memoization promise: forcing the
parent above TreeStateProvider to re-render produces *reference-equal*
context values from each useEditing/useCollapse/useDragSource hook. This
is the property §16's React.memo consumers will rely on to bail out.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fix Tab-nav flicker through filtered nodes (Part 3 regression)

Switch the Tab-navigation retry from useEffect to useLayoutEffect. The useEffect version commits the "filtered-out node is editing" state to
the DOM, paints, then redirects in a second commit — visible as a brief
close/reopen of the current node's editor when there's no viable next
target. useLayoutEffect runs synchronously before paint, so the redirect
batches into the same paint as the commit that flagged this node, and
the user sees only the final state.

Roadmap §16 carries the followup: make `getNextOrPrevious` filter-aware
so the Tab handler picks a viable target up front, dropping the
setState-after-render pattern entirely.

Doc updates

PR review fixes

Update migration-guide.md

PR review fix

PR review fixes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CarlosNZ and others added 27 commits June 18, 2026 17:01
* Create theme-icons-spec.md

* Rewrite types

* Add icons to defaultTheme

* Rewire theme engine to new structure

* Create tests

* Create iconFromSvg method, plus tests

* Update README.md

* Make React a peer dep of themes package

* Docs

* Render icons correctly in the demo

* Remove collectionInner, add headerRow, valueRow to themeable elements

* Add example
commit 902970c
Merge: dfb5c46 3bcb9fc
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 17:11:33 2026 +1200

    Merge remote-tracking branch 'origin/v2.0-dev' into r18jv-theme

    # Conflicts:
    #	packages/themes/CLAUDE.md

commit dfb5c46
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 17:01:13 2026 +1200

    Add deploy script for V2 demo site

commit 2bdecc1
Merge: e948237 686c4cb
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 16:23:17 2026 +1200

    Merge branch '369-roll-icons-into-themes' into r18jv-theme

commit 686c4cb
Merge: 3fe57e7 ca6ab22
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 16:23:07 2026 +1200

    Merge branch 'v2.0-dev' into 369-roll-icons-into-themes

commit 3fe57e7
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 16:14:00 2026 +1200

    Add example

commit e948237
Merge: aefe2ad 6077b05
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 14:14:24 2026 +1200

    Merge branch '369-roll-icons-into-themes' into r18jv-theme

commit aefe2ad
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 14:13:56 2026 +1200

    Update r18jv theme

commit 6077b05
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 14:12:49 2026 +1200

    Remove collectionInner, add headerRow, valueRow to themeable elements

commit 6f7537c
Merge: ff6536a ca502ef
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 13:13:20 2026 +1200

    Merge branch '369-roll-icons-into-themes' into r18jv-theme

commit ca502ef
Merge: feef61f b71a96b
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 13:13:10 2026 +1200

    Merge branch 'v2.0-dev' into 369-roll-icons-into-themes

commit ff6536a
Merge: 7e9595f feef61f
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 12:19:14 2026 +1200

    Merge branch '369-roll-icons-into-themes' into r18jv-theme

commit feef61f
Merge: 41a4881 646d78b
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 12:19:03 2026 +1200

    Merge branch 'v2.0-dev' into 369-roll-icons-into-themes

commit 7e9595f
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 11:41:58 2026 +1200

    Create index.tsx

commit fda1d5c
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 11:41:09 2026 +1200

    Add theme

commit 41a4881
Merge: db97a27 2cfdeae
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 10:07:35 2026 +1200

    Merge remote-tracking branch 'origin/v2.0-dev' into 369-roll-icons-into-themes

    # Conflicts:
    #	src/contexts/ThemeProvider/ThemeProvider.tsx

commit db97a27
Merge: 622ffb9 b9fef80
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 01:07:58 2026 +1200

    Merge branch 'v2.0-dev' into 369-roll-icons-into-themes

commit 622ffb9
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 00:46:00 2026 +1200

    Render icons correctly in the demo

commit 74be507
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Thu Jun 18 00:03:06 2026 +1200

    Docs

commit 4c1e71e
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 23:42:35 2026 +1200

    Make React a peer dep of themes package

commit 675831a
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 23:32:30 2026 +1200

    Update README.md

commit b088dcc
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 23:30:24 2026 +1200

    Create iconFromSvg method, plus tests

commit 7aa1043
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 18:18:23 2026 +1200

    Create tests

commit a4f557f
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 18:10:17 2026 +1200

    Rewire theme engine to new structure

commit b1f6bb2
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 17:29:12 2026 +1200

    Add icons to defaultTheme

commit fba7105
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 17:23:07 2026 +1200

    Rewrite types

commit 47af3f5
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Wed Jun 17 17:15:49 2026 +1200

    Create theme-icons-spec.md
* Update README.md

* README and Examples WIP

* Update example to use valueDataTypes not standard

* New keys/defaults example

* Finish the Editing section

* More README and examples WIP

* Tweak

* onChange/onError examples

* Update README.md

* Add JSONSchema validation example

* Big refactor to move demo data definitions to Example pages and make them the canonical reference, but still use the demo data pages as we do now

* Fix style quirks, example links

* Color tweak

* Generalize SearchBox

* Add search to several others

* Add "View source code" links to main demo

* Fix Superman logo

* Themeing README tidy up, more examples

* README WIP

* More README and examples

* More README editing

* Custom component section re-write, create first Example page

* Add display/edit mode example

* Tweak edit/display example

* Add BigInt example

* Changing types example

* Tweak custom type example

* Remove customKeys from main demo, link to example from README

* Custom Collection Nodes example

* Student cards example

* Collection as value examples

* Update README for TextEditor prop

* Finish writing UI Overrides section

* Setup example page import structure

* Fix comment wrap

* Refactor example imports

* Add copy toast, tidy up example index page

* Update ExamplesIndex.tsx

* Change to event signals

* Tweak event signals

* Tidy up onEditEvent section of README

* Collapse example

* Create imperative control example

* Update imperative handle example

* Adjust README

* Big README link fix sweep

* Tidy up contents, remove leftovers, fix links
* Commit open edit when displaced by opening another node (#376)

Opening an edit on another node (its pencil, double-clicking another
value, or clicking another key to rename) now COMMITS the in-progress
edit instead of cancelling it — matching Tab. Previously the two
"leave this field and go edit elsewhere" gestures behaved oppositely
(Tab committed, click-away discarded), silently dropping typed text.

Behaviour now mirrors Tab:
- changed edit -> commits (onUpdate runs), then opens the new node
- unchanged edit -> closes via commit* (no onUpdate / setData), opens new
- can't commit (malformed JSON, duplicate key, throwing fromStandardType)
  -> switch is BLOCKED; editor stays open with its inline error
- object-add session -> still cancels (you can't Tab out of a new-key edit)

The outgoing node registers a commit-on-displace callback in the editing
store (alongside cancelOp); open() invokes it on a switch, deferring the
new node's opening into the commit's onCommit. The callback forwards to
the node's LIVE handleEdit via a ref so it commits the current buffer,
not a stale closure. submit() now also abandons gracefully if a
commit-on-displace fires for a session whose node already unmounted.

Includes rewritten + new regression tests, the A8 manual-test matrix,
a changeset, and migration-guide / README notes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Set up RTL test infrastructure

* Add drag-and-drop and undo-on-cancel test coverage

* Tests: address DnD review feedback — onUpdate-reject coverage, tighten editing-gate test, cleanup

* Tests: split dragStart into its own act() so editing-gate test isolates the clause

---------

Co-authored-by: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
commit e46f146
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 13:24:37 2026 +1200

    Tweak text selection colours

commit 07c95bd
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 13:10:28 2026 +1200

    Add slight margin to Cancel button

commit bd8ee0a
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 13:05:43 2026 +1200

    Tweak Psychedlic theme

commit af7fcc0
Merge: 069d1b6 0c2019a
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 12:26:43 2026 +1200

    Merge branch 'v2.0-dev' into theme-improvements

commit 069d1b6
Merge: 3a65163 78fe892
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 11:59:44 2026 +1200

    Merge branch 'v2.0-dev' into theme-improvements

commit 3a65163
Merge: 4d10092 39b7f03
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 11:21:30 2026 +1200

    Merge branch 'v2.0-dev' into theme-improvements

commit 4d10092
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 08:29:05 2026 +1200

    Update index.tsx

commit 78f9c7f
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 04:22:26 2026 +1200

    Update Psychedelic theme

commit 598a473
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 04:09:05 2026 +1200

    Update Github themes

commit 6de364b
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 03:56:27 2026 +1200

    Update CandyWrapper theme

commit c5150c3
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Tue Jun 23 01:11:47 2026 +1200

    Remove some comments

commit 162e677
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Mon Jun 22 23:24:55 2026 +1200

    Update Tokyo Night theme

commit 56300be
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Mon Jun 22 23:08:42 2026 +1200

    Update Monokai theme

commit f641a32
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Mon Jun 22 22:58:27 2026 +1200

    Update Dracula theme

commit 4eb7db1
Author: Carl Smith <5456533+CarlosNZ@users.noreply.github.com>
Date:   Mon Jun 22 22:22:40 2026 +1200

    Change Solarized icons
…) (#380)

* Implement new return shape

* Enable Jest restoreMocks so console spies can't leak across tests

Addresses PR review: a `jest.spyOn(console, 'warn')` whose manual
`mockRestore()` runs only on success leaks the spy into later tests if an
assertion throws first. Enable `restoreMocks: true` globally so every spy
auto-restores after each test, and drop the now-redundant manual restores
(in the both-keys test and the pre-existing drag-and-drop key-collision
test).

* Document that an undefined override key means "no override"

Addresses PR review: clarify that `{ value: undefined }` / `{ data: undefined }`
are deliberately treated as "no override for this key" (consistent with the
protocol's top-level `undefined`/`void` = proceed, and the adjacent `error`
check), rather than overriding a node to `undefined`. Comment only — no
behaviour change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/CollectionNode.tsx
@CarlosNZ
CarlosNZ merged commit eb412ea into main Jun 24, 2026
1 of 2 checks passed
@CarlosNZ
CarlosNZ deleted the v2.0-dev branch June 24, 2026 04:39
@CarlosNZ
CarlosNZ restored the v2.0-dev branch June 24, 2026 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants