refactor: Replace HookRegistry + DynamicPackageLoader with @RegisterClass middleware pattern#2157
Conversation
🦋 Changeset detectedLatest commit: f72b538 The changes in this PR will be included in the next version bump. This PR includes changesets to release 190 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Claude finished @jordanfanapour's task —— View job Todo List:
Review CompletedI've reviewed this PR and found that it contains no SQL migration files. All 24 changed files are TypeScript files related to the refactoring of server middleware from HookRegistry + DynamicPackageLoader to a @RegisterClass pattern. Since there are no migration files to review, there are no INSERT statements or stored procedures to check for hard-coded UUID compliance. The review has been submitted as a non-blocking COMMENT type as requested. |
There was a problem hiding this comment.
This PR does not contain any SQL migration files. All changes are TypeScript refactoring related to replacing HookRegistry and DynamicPackageLoader with the @RegisterClass middleware pattern. Therefore, there are no INSERT statements or stored procedures to review for hard-coded UUID compliance.
✅ Dependency Check ResultsAll dependencies are properly declared! No missing dependencies detected in this PR. |
…lass + ClassFactory middleware pattern Replaces the ad-hoc HookRegistry + DynamicPackageLoader + config-bag-threading approach with MJ's standard @RegisterClass + ClassFactory pattern for server middleware extensibility. Key changes: - Add BaseServerMiddleware abstract class with pipeline slots (PreAuth, PostAuth, PostRoute, Apollo plugins, schema transformers, data hooks, ConfigureExpressApp) - Add MJTenantFilterMiddleware as config-driven multi-tenancy default - Replace HookRegistry with thin RegisterDataHook/GetDataHooks/ClearAllDataHooks functions backed by GetGlobalObjectStore() - Delete DynamicPackageLoader (class manifest handles discovery) - Delete ServerExtensibilityOptions interface and hooks.ts - Simplify ServerBootstrap to remove mergeExtensibilityOptions and MERGEABLE_KEYS - serve() now discovers middleware via ClassFactory.GetAllRegistrations() with key-based deduplication (same key = higher priority wins) - Update all tests to match new API surface (1,352 tests passing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add resolver discovery to the middleware pipeline so that middleware classes (e.g., BCSaaSMiddleware) can contribute their own TypeGraphQL resolvers to the Apollo schema without manual wiring in MJAPI. - BaseServerMiddleware: new GetResolverPaths() method (default: []) - serve(): collects resolver globs from all active middleware, resolves via fast-glob, dynamically imports, and merges into the resolvers array passed to buildSchemaSync() This replaces the manual getBCSaaSResolverPaths() approach described in OPEN_APP_RESOLVERS.md with self-registration via the middleware pipeline — consistent with the @RegisterClass pattern used everywhere. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sterClass middleware pattern and add GetResolverPaths() Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ea8cd69 to
f72b538
Compare
Summary
@RegisterClass+ClassFactorypattern used everywhere else in MJ. Server middleware now self-registers via@RegisterClass(BaseServerMiddleware, key)and is discovered byserve()viaClassFactory.GetAllRegistrations().BaseServerMiddlewareabstract class — single contract for server middleware with slots for Express middleware (pre-auth, post-auth, post-route), Apollo plugins, schema transformers, resolver paths, and data hooks (PreRunView, PostRunView, PreSave).MJTenantFilterMiddleware— MJ's built-in multi-tenancy refactored as aBaseServerMiddlewaresubclass. BCSaaS extends and replaces it via same-key registration.GetResolverPaths()method — middleware classes can contribute TypeGraphQL resolver glob paths thatserve()auto-discovers and merges intobuildSchema(). Replaces manualgetBCSaaSResolverPaths()wiring.dataHooks.ts— replaces the ~160-lineHookRegistrywith two thin functions (RegisterDataHook/GetDataHooks) backed byGetGlobalObjectStore().HookRegistry,DynamicPackageLoader,DynamicPackageResult,ServerExtensibilityOptions,mergeExtensibilityOptions(),MERGEABLE_KEYS,registerHookEntry(),hooks.tsTest plan
npm run buildin MJServer — compiles cleanlynpm run testin MJServer — 160 passed, 56 skipped (expected: BCSaaS integration tests need DB)ClassFactory.GetRegistration(BaseServerMiddleware, 'mj:tenantFilter')returnsBCSaaSMiddlewarewhen BCSaaS is installedGetResolverPaths()— BCSaaS resolvers (BCFeatureFlagResolver, BCSettingsResolver, etc.) are discovered and included in the Apollo schemaGetResolverPaths()override — no resolvers added (empty array default)🤖 Generated with Claude Code