Open
Conversation
Add docker-compose with redis + besticon, plus a Dockerfile.dev that runs the app on Node 12 via linux/amd64 since arm64 has no Node 12 binaries. Uses non-default host ports (6390/8088) to avoid conflicting with locally-running services. Localdev config now points to the docker service names. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace babel-* packages with @babel/* scoped equivalents - Replace babel-polyfill with core-js/stable + regenerator-runtime/runtime in Node entry (app/index.js) and webpack entries (dll + v3 config) - Add explicit class-properties / private-methods / private-property-in-object plugins (all in loose mode) since stage-0 preset no longer exists - Drop stackimpact (unused) from deps - Fix a rest-with-trailing-comma syntax error that babel 7 rejects (frontend/pages/dashboard/routes/Records/redux/reducers.js) babel-loader kept at ^8.4.x for now — webpack 3 compatibility. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
better-npm-run (bnr) is unmaintained and only existed to set env vars before commands. cross-env does the same thing in one line, lets us inline NODE_ENV/DEBUG into the actual scripts, and removes the awkward indirection through the betterScripts JSON block. The 'start-app' script is split into start-app:server + start-app:client for clarity (was bnr local:app:start & bnr local:build:src). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PhantomJS has been dead since 2018 — no arm64 binary, no OpenSSL 3 support, and the 'phantom' npm wrapper can't install on current Node. Rewrite app/services/downloads.js on puppeteer-core 13.x (last line to support Node 12). The renderPdf flow is equivalent to the old one: - onePage -> 1024x600 fixed-size PDF - clipped -> A4 with 1cm top/bottom margins - Still waits for window.done === true before rendering Dockerfile.dev now installs chromium + CJK fonts from apt, and points puppeteer at /usr/bin/chromium via PUPPETEER_EXECUTABLE_PATH so it never downloads its own bundled chromium (works cross-platform). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…phase 5) Node 22 bundles a global fetch implementation, so the deprecated `request` dependency can go. The internal fetch proxy in `app/utils/fetch.js` keeps its public API (method-indexed proxy with retries, signature auth, gbk decoding, etc.) but delegates to `globalThis.fetch` + `AbortController`. The icon proxy in `home.js` now pipes the response body via `Readable.fromWeb`.
The asset-URL middleware used to snapshot webpack-assets.json at module-load time. If the node process happened to boot while webpack --watch was still producing the first dev build, it captured an old / in-flight manifest and kept serving stale asset paths until the next nodemon restart. Reload the manifest when its mtime changes so the running server always reflects the on-disk manifest.
log4js 6 overhauled its configure() shape: - appenders is now a named object (not an array) - categories is required to wire appenders to logger names - logger.setLevel() replaced by category-level config Migrate app/utils/logger.js accordingly. This removes the shelljs circular-dependency warnings that log4js 1.x pulled in via its old streamroller dependency.
- config 1.x → 3.x: removes DEP0044/0047/0055 (util.isArray, util.isDate, util.isRegExp) Node 22 deprecation warnings caused by config's old internal clone utilities. - nodemon 1.x → 3.x: drops 173 transitive packages (including the old chokidar/upath/shelljs tree), reduces install footprint, and properly supports Node 22. - husky 0.14 → 9.x: the old `precommit` key in package.json scripts was a husky 0.x convention that silently stopped working after husky 1+. Migrate to the modern .husky/pre-commit hook file and remove the dead `precommit` script entry.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace removed configureScope() with getCurrentScope(), and guard event.extra since it's no longer initialized by default. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
validator 6 → 13 (isURL still exported, drop-in) and mq-utils 0.1 → 0.2 (same factory API). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
cache-manager v7 replaces caching({store,max}) with createCache(); use
default in-memory store and convert ttl seconds to milliseconds for the
new wrap() signature. Revert mq-utils back to 0.1.0: 0.2.0 dropped the
redis source that localdev depends on.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
jQuery 4 removed .bind()/.unbind() event shortcuts and the bare .scroll()
event shortcut; replace with .on('<event>', fn).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
puppeteer.launch / page.goto / page.pdf API surface used here is unchanged since v13. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
jquery 4 changed its package exports to ESM-first, so webpack now
resolves require('jquery') to the module namespace object instead of
the callable jQuery function. ProvidePlugin entries need the ['jquery',
'default'] path to pluck the default export, otherwise call sites like
$(fn) fail with "r(...) is not a function" on page load.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
React 19 removed ReactDOM.findDOMNode but light-ui 1.5.10 still calls _reactDom.findDOMNode(this.childNode) in OutsideClickHandler, Slider, and BaseTipso. Add a react-dom shim that re-exports the real module plus a findDOMNode(ref) => DOM-node passthrough (light-ui always passes DOM refs captured by callback ref), and alias react-dom$ to the shim via webpack so light-ui picks it up without touching react-dom/client used by our own render entry. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Why: airbnb-19 peers reject eslint 9+/flat config, so 8.57 is the practical ceiling without replacing the shared config. babel-eslint is deprecated and replaced with @babel/eslint-parser. Disabled stylistic rules airbnb-19 newly introduces to keep the lint baseline (0 errors, 4 pre-existing no-console warnings) unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Koa 3 swaps ctx.throw() argument order to (status, message). Updated the bodyparser onerror handler; the rest of the app already uses the koa 3-compatible request/response surface via @koa/router and named middleware packages, so no other code changes were needed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
react-router 7 removes the imperative renderRoutes() pattern and the
stand-alone history package. BrowserRouter now owns its own history,
so the shared history module is gone. Route config kept as a plain
{ path, component } tree that AppContainer lifts into <Routes>/<Route>
JSX, which keeps the existing per-entry routes (Records, Resume,
Github, Setting) intact. Child paths are now relative to the /:login
parent. App uses useNavigate + useLocation via a thin functional
wrapper so the existing class component can stay as-is, and NavLink
switches to the className-callback form airbnb-19 expects.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Introduces a `mock: true` config flag (enabled in localdev.json) that lets the app run without any downstream services. When enabled: - A session middleware auto-logs-in as a demo user - fetch.js short-circuits outgoing HTTP calls through a fixture table - The Redis cache middleware falls back to an in-memory Map, so visualize endpoints that depend on ctx.cache don't 500 when Redis is unreachable Fixtures cover the user, github, and stat services with enough data for the dashboard shell plus visualize page (hotmap, repos, commits, languages, etc.) to render end-to-end. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds resumeHash so ResumeWrapper fetches the pub resume, reshapes the /resume fixture to include languages/updated_at (consumed by getResumeByHash), and populates demoResumeContent with plausible work experiences, educations and personal projects so /demo/resume renders comparable to a real shared resume in localdev. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
resume.languages is the locale-switcher list (expects {id,text} objects);
the mock was reusing the programming-language strings there, which made
ResumeUIWrapper.renderResumeLanguages render three empty spans joined
by "/" at the top of /demo/resume. Return an empty list instead so the
switcher short-circuits.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Expose zh/en options via resume.languages so ResumeUIWrapper renders the locale switcher (it short-circuits when fewer than two options exist). Clicking a locale reloads with ?locale=<id>; the mock returns the same payload either way but the affordance matches production. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Generate 365 days of deterministic hotmap data and populate per-repo `languages` dicts so visualize/github share pages render real streaks and language-usage percentages instead of null~null and NaN%. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
slick-carousel still calls $.type(), which jQuery 4 removed. Add a lightweight shim so the carousel initializes without errors. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
react-beautiful-dnd is deprecated and caps its peer dep at React 18. @hello-pangea/dnd is the maintained community fork with React 19 support and a drop-in API. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
chart.js 2.x predated React 19 and the modern tree-shakable plugin system. The config is rewritten to v4: import chart.js/auto so every controller auto-registers, Chart.defaults.global.X becomes Chart.defaults.X / Chart.defaults.font.family, options.title/legend move under plugins, options.tooltips becomes plugins.tooltip, and scales.xAxes/yAxes arrays collapse to scales.x/y with grid replacing gridLines. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- cal-heatmap 3 -> 4 - highcharts 8 -> 12 - mq-utils 0.1 -> 0.2 - add patch-package (light-ui 1.5.10 patch) with postinstall - remove rc-times Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Disable scrollbar instead of relying on removed height:0 option. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
rc-times was dropped; swap in a small native select for the resume reminder interval so the setting panel keeps working under React 19. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- mq middleware returns no-op queue when config.mock is on - uploader skips OSS ops when credentials are absent in mock mode and falls back to raw URLs for signed/object URL helpers Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- drop react-dom shim and webpack alias (no longer needed on react 19) - pass null instead of undefined for missing avatar src to avoid React 19's stricter img prop warnings - fall back to an identity reducer when combineReducers has no registered reducers (react-redux 9 throws otherwise) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.