Skip to content

Release: Nuxt 4 and Node 22 Modernization - #385

Closed
fellnerse wants to merge 32 commits into
mainfrom
prepare-main-merge
Closed

Release: Nuxt 4 and Node 22 Modernization#385
fellnerse wants to merge 32 commits into
mainfrom
prepare-main-merge

Conversation

@fellnerse

Copy link
Copy Markdown
Member

Summary

Production release promoting the full modernization sequence to main:

Production Deployment Checklist & Operational Notes

1. Static Frontend Deployment (Automated)

  • Merging to main triggers .github/workflows/deployment-live.yml.
  • In deployment-live.yml, NUXT_ENV_LOCAL is unset, automatically configuring:
    • Production PayPal Client ID (AUMWxSZrtBOA1RicR_3nGijYb8yYxyq2lxBjiwoQKfVc-8jfdPr5N7X5EFUackMCLb_K7HiKswnDBUJ8)
    • Production base URL (https://www.whatsanalyze.com)
    • No local functions emulator port (points directly to live Cloud Functions)
  • Nitro prerenders all 58 localized routes and deploys dist (with dist/CNAME pointing to whatsanalyze.com) to the gh-pages branch.
  • Sentry creates a production release for environment: live.

2. Firebase Cloud Functions

  • All 3 production functions (checksubscriberstatus, helloworld, and paypalwebhook) were already deployed and running on Node 22 in Google Cloud Functions (recorded in commit c87e39b).
  • Merging to main aligns the repository source tree with the live deployed functions.
  • If re-deploying functions in the future:
    nix develop --command firebase deploy --only functions
    Requires Google Secret Manager secrets PAYPAL_PASSWORD_PROD (and PAYPAL_PASSWORD_DEV).

3. Verification

  • pnpm run format:check - Clean Prettier formatting
  • pnpm run lint - Clean ESLint
  • pnpm run test - Unit tests pass
  • pnpm run build - Prerendered 58 routes
  • pnpm run test:generated - Verified 9 pages and PWA assets

Sebastian Fellner 💯 and others added 30 commits September 2, 2026 11:41
Establish deterministic frontend checks
Move frontend to Node 22 and final Nuxt 2
- helloworld now also returns the created subscriptionId (additive)
- opt-in Playwright suite (pnpm test:e2e:sandbox) boots the Functions
  emulator + dev server and exercises the real PayPal sandbox; buyer
  approval stays manual by design
- optional GitHub workflow runs it only when PAYPAL_PASSWORD_DEV secret
  is configured; emulator reads it from gitignored functions/.secret.local
- pin TMPDIR=/tmp for the emulator: macOS truncates unix-socket paths at
  ~104 chars, colliding worker sockets and routing requests to the wrong
  function
- raise CI test timeout to 120s and assertion timeout to 15s (nuxt dev
  cold-compiles pages; small runners exceeded Playwright's defaults)
The old sandbox plan had total_cycles=1 (PayPal's default when omitted),
so every subscription became EXPIRED one second after the first payment.
Point the dev config at the new plan P-0KW41015GP654580PNKMT6EY and set
total_cycles: 0 explicitly in createPlan.

Also documented: the sandbox webhook registration was missing
PAYMENT.SALE.COMPLETED (prod subscribes to *); it is now aligned to *.
- pin explicit pwa.workbox.globPatterns: @vite-pwa/nuxt replaces the
  workbox default when payload extraction is active, which left / out of
  the precache manifest and crashed every navigation with
  non-precached-url from createHandlerBoundToURL
- restructure the download dialog: a single activator button binds the
  activator props, pricing cards render outside the overlay. multi-root
  activator slots dropped the props, so the buttons' own @click handlers
  never fired
- markRaw the pdf worker instance so Vue reactivity cannot wrap it
- objectToDictionary converts Date instances to ISO strings; proxied
  dates cannot be structured-cloned and stalled the worker silently
- guard attachment image decoding:InvalidStateError on some WhatsApp
  jpegs now degrades to text rendering instead of killing the pdf run
- guard empty FileReader results and parse errors in zipLoadEndHandler;
  previously they surfaced as an unhandled jszip rejection ("Can't read
  the data of 'the loaded zip file'") with no UI feedback
- document the findings in docs/modernization-runbook.md
@gitguardian

gitguardian Bot commented Sep 4, 2026

Copy link
Copy Markdown

⚠️ GitGuardian has uncovered 3 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secrets in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
14799759 Triggered Generic Private Key 73e7199 localhost-key.pem View secret
14817188 Triggered Generic High Entropy Secret 0e1ea0a functions/backendClientRegistry.js View secret
14818802 Triggered Generic High Entropy Secret 0e1ea0a components/SubscribeBtn.vue View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secrets safely. Learn here the best practices.
  3. Revoke and rotate these secrets.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@fellnerse

Copy link
Copy Markdown
Member Author

Closing in favor of direct dev -> main PR #387

@fellnerse fellnerse closed this Sep 4, 2026
@fellnerse
fellnerse deleted the prepare-main-merge branch September 4, 2026 20:41
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