Set the measurement ID that replaces the Universal Analytics property
shut down in 2023, which leaves tracking disabled until now. Update
the README section, which still described the ID as empty.
modern-normalize hands form controls the inherited page font and puts
a system stack on `html`. The XOOPS theme styles `body` and leaves
the rest to the defaults it was authored against, so the search box
rendered in the theme font at the theme size rather than as the plain
controls it was drawn for.
State those defaults explicitly instead, so the rendering no longer
depends on whichever browser is in use. box-sizing: border-box stays
-- the theme has no measurements that assume content-box.
sirv sent no Cache-Control for static-contents, only an ETag, so the
browser was free to apply heuristic caching and answer from a stale
copy without revalidating. A re-dump would then go unnoticed, and two
sites served from the same localhost port answered with each other's
JSON.
maxAge 0 sends `public, max-age=0, must-revalidate`; a matching ETag
still yields a 304, so nothing extra is transferred.
- adopt bsi-ni's .gitignore, which is the vite template's
- delete dl-limit-items.csv, an exporter report that xoops-static-
exporter now writes into its own data/
- add a description meta tag, which bsi-ni already had
- the ncu config is .ncurc.js now, not .ncurc.json
Every data URL was written as a root-absolute path, so the app only
worked when served from the document root. Derive a base from
import.meta.env.BASE_URL the way bsi-ni does, and prefix the URLs
with it. Routing still assumes the root: BrowserRouter takes no
basename in either site.
The tsconfigs were still the ones the CRA conversion produced, while
bsi-ni had been brought in line with the npm create vite@latest
react-ts template.
- take the three tsconfigs from bsi-ni verbatim: ES2023, and
types: ["vite/client"] in place of src/vite-env.d.ts, which the
template no longer ships
- drop the CRA leftovers useDefineForClassFields, resolveJsonModule,
esModuleInterop and forceConsistentCasingInFileNames
- pin typescript with ~ rather than ^, as bsi-ni does
- drop the redundant build.outDir and the server/preview port
overrides, leaving vite's defaults
- fix a vite.config comment that still pointed at the removed etc/
The old section said only "upload the contents of dist/", which misses
everything the modules/ layout needs.
- spell out the five steps: build, send the data, push the build, link
the data in, check the result
- push the build before creating the symlinks, so that --delete needs
no --exclude and each deploy recreates the links from scratch
- link the data in with a glob over static-contents/, which keeps
rss.xml from being forgotten: it sits beside modules/ rather than
inside it, so linking only modules leaves /rss.xml a 404 that
npm run preview cannot reproduce
- record what an upgrade from v1.0.0 does and does not need
The dumped data shared a namespace with the SPA routes: /database
served both /database/item/1587 and /database/file/..., and the same
went for /credits and the pico modules. It only worked because a real
file wins over the SPA fallback. Group it by source XOOPS module the
way bsi-ni.brain.riken.jp does, so routes and data no longer collide.
- database/ -> modules/xoonips/, credits/ -> modules/credits/,
manual_ja/ and primface/ -> modules/
- give each pico module its own modules/<dirname>/config.json instead
of one shared pico/config.json, so its index sits next to its pages
- redirect the v1.0.0 /database/file/ links to their new home, and
point the legacy download.php redirect there too
The bundle was a single 745 kB chunk, and lokijs pulled in a bare `fs`
import that vite had to externalize.
- externalize fs and exclude it from dependency optimization
- split node_modules into vendor-react (react, react-dom, scheduler)
and vendor-misc: react is over 200 kB on its own, so a single
dependency chunk would stay above the 500 kB warning threshold, and
it changes far less often than the rest
- configure this through rolldownOptions.output.codeSplitting, the
native rolldown API: manualChunks is only a compatibility shim under
vite 8 and did not group the react packages as asked, and
rollupOptions is deprecated
@types/node was excluded from ncu via `reject`, which also hid patch
and minor releases inside the 24.x line we pin to match the Node 24
runtime. Its "latest" dist-tag points at the 22.x line, so merely
dropping the rule would report no updates either. Select the target
per package instead.
- replace .ncurc.json with .ncurc.js so target can be a function
- use the "minor" target for @types/node, "latest" for everything else
- pick up @types/node 24.13.4
Biome reported 229 diagnostics after aligning the config with
bsi-ni.brain.riken.jp. Fix them all so `biome check` passes clean
without per-rule overrides.
- replace `any` in LokiJS queries with an `ItemFilter` interface and
a single `asLokiQuery()` cast, matching bsi-ni
- type the XOOPS redirect maps as
`Record<string, { key: string; isNumber: boolean }>`
- use `ItemSubTypes<string>` instead of `any` for sub item types
- join author lists with `.join(', ')` instead of index-keyed nodes
- give list elements stable keys derived from their own data
- return `React.ReactNode` from `ListBase.renderBody()`
- drop the temporary `noArrayIndexKey` override from biome.json
- narrow lineWidth to 120 and use es5 trailing commas
- format JSON at the same indent as the rest, dropping the override
- exclude the vendored XOOPS theme under src/common/assets
- drop the stale static-contents and public exclusions
The dumps were imported into the bundle, which tied a data refresh to a
rebuild and put generated content in the source tree. They now sit in
static-contents/ with the rest of the site data, as on
bsi-ni.brain.riken.jp.
- add siteData.ts, which fetches the six files in parallel
- hand them to the singletons from main.tsx before the first render, so
components still read them synchronously
- type the four ranking lists, which have three different shapes
react-router removed withRouter in v6, and the shim that replaced it
kept nineteen components tied to injected router props. They now read
the state directly, matching how bsi-ni.brain.riken.jp is written.
- convert the remaining class components to function components
- call useLocation, useNavigate and useParams in place of the props
- drop src/common/lib/withRouter.tsx
writeBundle copied all 10 GB of it into dist/ on every build, although
the web server maps the directory in directly.
- drop the copy, which takes dist from 10 GB to 4.8 MB
- mount the directory on the preview server too, so that previewing a
build still behaves like production
The generated site data is not part of the source tree, so it now sits
beside the checkout, matching the bsi-ni.brain.riken.jp layout.
- resolve the directory from config.root rather than the process cwd
- drop the ignore rule, which no longer matches anything
The CRA toolchain was several major versions behind and no longer
maintained, so the whole build, lint and runtime stack is replaced.
- replace react-scripts with Vite 8 and TypeScript 7
- upgrade to React 19 and react-router 8
- swap unmaintained libraries: react-html-parser, axios, react-ga,
react-image-lightbox, react-helmet, moment, react-spinner-material
- replace ESLint with Biome for linting and formatting
- switch the package manager from yarn to npm
- serve static-contents/ with sirv in dev and copy it into the bundle
- keep a withRouter shim so the class components can stay as they are
for now