Skip to content

feat: add email register#147

Open
liguobao wants to merge 58 commits intoecmadao:masterfrom
liguobao:master
Open

feat: add email register#147
liguobao wants to merge 58 commits intoecmadao:masterfrom
liguobao:master

Conversation

@liguobao
Copy link
Copy Markdown

No description provided.

liguobao and others added 7 commits April 16, 2026 23:30
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>
liguobao added 21 commits April 17, 2026 00:22
…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.
liguobao and others added 30 commits April 18, 2026 10:48
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>
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.

1 participant