httpd:
- Serve the API at /api, not only under /v1
- Keep serving it at /api/v1, without a redirect, until the first
major release after explorer and the Open Graph worker switch
to /api
- Remove apiVersion: released explorers do not read it
- Add `httpd.releases` to `/info`, set by the artifacts feature
explorer:
- Remove the API version check, its config and the unused
compare-versions dependency
- Keep the node version in a plain parse error message
- Add `minimumSupportedVersion`, set to 0.28.0, and warn on nodes
whose major is older, treating 0.y as the major before 1.0
- Do not warn on builds without a release number
- Show a warning on the node page of an outdated node
- Mark an outdated node in the seed picker on every page
- Name the node version and the floor in parse errors
- Drop the `/node` fallback for httpd without `/info`, which
predates the floor
- Check the status, not `ResponseError`, so the Open Graph worker
can import compat without the fetcher
- Name the httpd release each shim serves, not a date
- Drop the mime shim for httpd 0.18.1 and the unused `lib/file.ts`
- Read the node from `/info` in repo views
- Pass the node and its features to repo views as one `node` param
- Show the releases tab and pages when the node supports releases,
and the counter only when there is a count
- Read a release count as release support on older httpd
- Test the flag and the fallback
docs:
- Restructure docs/api-changes.md: the supported versions, one
table of removals, fixed fields per change, and a link to ADR
0001 for the rules
- Say in ADR 0001 that each compat comment names what the other
side does
- Say in ADR 0001 when a capability needs a flag in /info
tests:
- Run e2e tests on httpd 0.30.0, above the floor, instead of 0.26.0
- Run the release tests on it too, so they cover the compat shims
- Skip only those that need release counts per scope on it
- Test a node without release support through a mocked `/info`
flag, instead of an httpd that predates the floor
Extracts the avatar components and the style tokens into shared/ui, which
both apps consume as a workspace package, to try out ADR 2. Nix and the
Docker setups are not updated yet.
Makes explorer and desktop sibling projects, as proposed in ADR 1.
This commit only moves files; paths in CI, scripts and docs are fixed
in the following commits.
- Add twemoji as npm dependency instead of build download
- Package build assets with a Vite plugin instead of scripts
- Keep the eslint and prettier caches in one directory
This also upgrades dompurify to the latest version, outside our cooldown
window, for a security fix (verified safe with extra security checks).
Newer dompurify versions expose a bug where happy-dom renders one of our
custom elements incorrectly in tests, unlike real browsers. Switch the unit
test environment from happy-dom to jsdom to fix the failing tests.
Changes which were needed after the upgrade:
- Replace vite-plugin-virtual (vite 8 incompatible) with vite's
built-in `define` for the buildTimeConfig injection
- tsconfig: drop deprecated `baseUrl` (TS 5+ resolves `paths`
relative to tsconfig)
- Vitest 4: import `defineConfig` from `vitest/config` so `test`
is valid in vite configs
- Zod 4: rename `.errors` to `.issues`, make `ZodSchema` a
type-only import, drop the removed `SafeParseReturnType`
- Tighten/loosen generic casts in localStore to match stricter
zod 4 inference
- ESLint 9 `no-useless-assignment`: remove redundant initializers
and dead reassignments; disable the rule where Svelte's reactive
blocks confuse the analyser
- Svelte/eslint `prefer-svelte-reactivity`: disable for legacy
Svelte usages of URL / Set
- Misc naming-convention and prefer-const fixes
Playwright 1.52 hangs under Node 24 when loading test files that
transitively import modules with top-level await (tests/support/
support.ts). Node 24 enables require(esm) by default, and the old
CJS-based .ts transformer deadlocks on TLA.
Also update CLAUDE.md: playwright 1.59's --project flag is variadic
and greedily consumes trailing args, so the file path must come
before --project.
This also drops .tool-versions to keep a single source of truth for the
node version in .nvmrc. We also point the github actions to .nvmrc now.
I'm the only dev who's using asdf to manage my tooling and I decided to
just configure it to fall back to .nvmrc via `legacy_version_file =
yes`.
Our Cloudflare deployments via GitHub broke. We can run deployments
manually to app.radicle.xyz via:
npm run deploy
This also takes care of injecting the plausible.io script.
Instead of sending data to a third-party by default, users can run privacy
friendly local log analysis systems like GoatCounter.
After this commit, Radicle Explorer will not randomly connect to unexpected
hosts anymore.
We where using `sinon` in the `playwright` tests to simulate a different
time, which since `playwright@1.45.0` can be done with the Clock API
calling `page.clock.setFixedTime`.
And to test the mutex executor we can use the vitest utils spy function
`vi.fn()` instead of `sinon.spy()`
Since the legacy config is being deprecated at the end of 2024, we
should start moving to the eslint flat config.
I avoided the tseslint config helper function so we avoid wrapping
magic.
This seems to have triggered more checking since any checks in svelte
files have appeared and the $$Generic type that is being deprecated had
to be rewritten.
Also fixes some any types that weren't caught previously
The execa update allows us two simplify two things
1. Output collection in a log file with a prefix can be done through
`stdout` and `stderr` options of `execa`.
2. We don’t need to ensure that all subprocesses are killed when the
main process exits. `execa` takes care of this
We have a new apiVersion value in the config json that needs to be
changed for each breaking change on httpd so we can simulate a new
resource to the cache and get it cleared.
Also improves the ResponseParseError giving the user more information
on, if the node or the web client is outdated
When using axios, its dependency library follow-redirects
only clears authorization header during cross-domain redirect,
but allows the proxy-authentication header which contains credentials too.