feat(thermidor)!: remove ComposedInterface and simplify facade resolution#8024
feat(thermidor)!: remove ComposedInterface and simplify facade resolution#8024jfcere-coveo wants to merge 8 commits into
Conversation
|
✅ Snyk checks have passed. No issues have been found so far.
💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse. |
There was a problem hiding this comment.
Pull request overview
This PR makes a breaking simplification to @coveo/thermidor by removing the ComposedInterface abstraction and flattening facade resolution so controllers/actions resolve a single thunk directly from an interface handle.
Changes:
- Removed the public/internal
composeInterfaces/ComposedInterfaceimplementation and related tests/exports. - Simplified facade resolution from
resolveFacades(...): EndpointThunk[]toresolveFacade(...): EndpointThunk, and updated controllers/actions/thunks accordingly. - Updated Thermidor documentation/ADRs to remove composition references and describe the new facade-resolution model.
Reviewed changes
Copilot reviewed 88 out of 88 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/thermidor/src/public/interfaces/compose.ts | Removed public composition API (deleted). |
| packages/thermidor/src/public/interfaces/compose.test.ts | Removed composition tests (deleted). |
| packages/thermidor/src/internal/interfaces/compose.ts | Removed internal composed interface implementation (deleted). |
| packages/thermidor/src/internal/utils/get-handle-internals.ts | Removed handle internals helper (deleted). |
| packages/thermidor/src/public/controllers/search-box/search-box-controller.ts | Use single resolved facade thunk; submit returns single result. |
| packages/thermidor/src/public/controllers/result-list/result-list-controller.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/public/controllers/result-list/result-list-controller.test.ts | Remove getHandleInternals usage in tests. |
| packages/thermidor/src/public/controllers/product-list/product-list-controller.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/public/controllers/pagination/pagination-controller.ts | Use single thunk instead of iterating an array. |
| packages/thermidor/src/public/controllers/converse/converse-controller.ts | Use getInterfaceInternals once for engine/stateId. |
| packages/thermidor/src/public/controllers/controllers-integration.test.ts | Remove composed-interface integration scenarios. |
| packages/thermidor/src/public/controllers/cart/cart-controller.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/public/controllers/cart/cart-controller.test.ts | Remove getHandleInternals usage in tests. |
| packages/thermidor/src/public/actions/search-parameters/search-parameters-actions.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/public/actions/search-box/search-box-state-getter.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/public/actions/search-box/search-box-actions.ts | Resolve one thunk and dispatch once. |
| packages/thermidor/src/public/actions/cart/cart-actions.ts | Swap to getInterfaceInternals usage. |
| packages/thermidor/src/internal/utils/interface-types.ts | Remove composition-related types; simplify resolver type. |
| packages/thermidor/src/internal/utils/interface-types.test-d.ts | Remove composed-interface type-level assertions. |
| packages/thermidor/src/internal/utils/index.ts | Stop exporting handle/composition utilities; update exported types. |
| packages/thermidor/src/internal/utils/base-interface.ts | Flatten facade cache + resolver signature; add runtime guard. |
| packages/thermidor/src/internal/utils/base-interface.test.ts | Update tests for new resolveFacade behavior and guard. |
| packages/thermidor/src/internal/interfaces/search.ts | Provide FacadeResolver record instead of factories. |
| packages/thermidor/src/internal/interfaces/index.ts | Stop exporting composed interface symbols/types. |
| packages/thermidor/src/internal/interfaces/generative.ts | Switch to FacadeResolver and simplify noop facade resolver. |
| packages/thermidor/src/internal/interfaces/commerce.ts | Provide FacadeResolver record instead of factories. |
| packages/thermidor/src/internal/features/triggers/triggers-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/triggers/triggers-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/sort/sort-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/sort/sort-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/sort/sort-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-parameters/search-parameters-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-parameters/search-parameters-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-parameters/search-parameters-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-box/search-box-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-box/search-box-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/search-box/search-box-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/result-list/result-list-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/result-list/result-list-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/result-list/result-list-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/query-correction/query-correction-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/query-correction/query-correction-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/product-list/product-list-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/product-list/product-list-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/product-list/product-list-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/pagination/pagination-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/pagination/pagination-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/pagination/pagination-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/generative/generative-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/generative/generative-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/generative/generative-hydration.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/generative/generative-hydration.test.ts | Update test to use getInterfaceInternals. |
| packages/thermidor/src/internal/features/generative/generative-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/facets/facets-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/facets/facets-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/facets/facets-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/cart/cart-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/cart/cart-selectors.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/features/cart/cart-actions.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/engine/index.ts | Remove EngineTrackedInterface export. |
| packages/thermidor/src/internal/engine/engine.ts | Track InterfaceHandle directly; use getInterfaceInternals. |
| packages/thermidor/src/internal/api/search/search-thunk.ts | Thunk factory now takes only iface. |
| packages/thermidor/src/internal/api/search/search-thunk.test.ts | Update tests/mocks for new thunk factory signature. |
| packages/thermidor/src/internal/api/search/search-thunk-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/api/search/search-request-selector.ts | Selector now scoped by iface directly. |
| packages/thermidor/src/internal/api/search/search-request-selector.test.ts | Update tests for new selector signature. |
| packages/thermidor/src/internal/api/search/search-facade.ts | Resolver now takes iface directly. |
| packages/thermidor/src/internal/api/query-suggest/query-suggest-thunk.ts | Thunk factory now takes only iface. |
| packages/thermidor/src/internal/api/query-suggest/query-suggest-facade.ts | Resolver now takes iface directly. |
| packages/thermidor/src/internal/api/commerce-search/commerce-search-thunk.ts | Thunk factory now takes only iface. |
| packages/thermidor/src/internal/api/commerce-search/commerce-search-thunk.test.ts | Update tests/mocks for new thunk factory signature. |
| packages/thermidor/src/internal/api/commerce-search/commerce-search-thunk-slice.ts | Use getInterfaceInternals for cache/stateId. |
| packages/thermidor/src/internal/api/commerce-search/commerce-search-request-selector.ts | Selector now scoped by iface directly. |
| packages/thermidor/src/internal/api/commerce-search/commerce-search-facade.ts | Resolver now takes iface directly. |
| packages/thermidor/src/internal/api/commerce-query-suggest/commerce-query-suggest-thunk.ts | Thunk factory now takes only iface. |
| packages/thermidor/src/internal/api/commerce-query-suggest/commerce-query-suggest-facade.ts | Resolver now takes iface directly. |
| packages/thermidor/src/index.ts | Stop exporting composition API from package entrypoint. |
| packages/thermidor/docs/why.md | Remove composition framing from overview doc. |
| packages/thermidor/docs/internal/adr/ADR-007-ssr-snapshot-api.md | Remove composed-interface mentions in SSR ADR. |
| packages/thermidor/docs/internal/adr/ADR-007-annex-ssr-implementation-details.md | Remove compose-related API surface from annex. |
| packages/thermidor/docs/internal/adr/ADR-006-annex-a-proposed-structure.md | Remove compose.ts from proposed tree. |
| packages/thermidor/docs/internal/adr/ADR-005-public-facing-abstractions.mermaid | Remove composed interface node/edges. |
| packages/thermidor/docs/internal/adr/ADR-005-public-facing-abstractions.md | Remove composed-interface concept from ADR text/examples. |
| packages/thermidor/docs/internal/adr/ADR-004-lazy-facade-resolvers.md | Update ADR to describe new resolver shape. |
| packages/thermidor/docs/internal/adr/ADR-002-multi-interface-engine.md | Update ADR to describe multi-interface without composition. |
| packages/thermidor/docs/glossary.md | Update glossary entries around facade resolution. |
| packages/thermidor/docs/generative-interface.md | Update KIND description. |
| packages/thermidor/docs/architecture.md | Update architecture doc to reflect single-thunk dispatch. |
Comments suppressed due to low confidence (1)
packages/thermidor/docs/glossary.md:245
- The referenced file path/link points to
src/core/..., but this package’s sources are undersrc/internal/...(andsrc/coredoes not exist). These links will be broken for readers.
**File**: [`src/core/interface/utils/interface-types.ts`](../src/core/interface/utils/interface-types.ts)
@coveo/atomic
@coveo/atomic-hosted-page
@coveo/atomic-legacy
@coveo/atomic-react
@coveo/auth
@coveo/bueno
@coveo/create-atomic
@coveo/create-atomic-component
@coveo/create-atomic-component-project
@coveo/create-atomic-result-component
@coveo/create-atomic-rollup-plugin
@coveo/headless
@coveo/headless-react
@coveo/relay
@coveo/shopify
commit: |
Remove the
ComposedInterfaceabstraction entirely from@coveo/thermidorand simplify the facade resolution layer.Changes
Deleted files
src/internal/interfaces/compose.tssrc/public/interfaces/compose.tssrc/public/interfaces/compose.test.tssrc/internal/utils/get-handle-internals.tsRemoved types and exports
ComposedInterface<T>,ComposedInterfaceImpl,getComposedInternalsEndpointStateScopegetHandleInternals,HandleInternalsFacadeResolverFactoryEngineTrackedInterface(replaced byInterfaceHandle)Simplified
getInterfaceInternalsBaseInterface<T>toInterfaceHandleinstanceof BaseInterfaceruntime guard (throws on invalid handles)InterfaceInternalsnon-genericFlattened facade resolution
(engine) => (iface) => thunkpatternengineparameter entirely — resolvers derive it fromgetInterfaceInternals(iface)FacadeResolversignature:(iface: InterfaceHandle) => EndpointThunkWeakMap<InterfaceHandle, Map<…>>toMap<Facades[T], EndpointThunk>Simplified
resolveFacaderesolveFacades(plural) toresolveFacade(singular)EndpointThunkinstead of an array (composition was the only reason for the array)this.#thunkdirectly instead of mapping overthis.#thunksUpdated all call sites
createSearchEndpointThunk,createCommerceSearchEndpointThunk,createQuerySuggestThunk,createCommerceSuggestionsThunk) now take onlyiface: InterfaceHandlegetHandleInternals(...)calls replaced withgetInterfaceInternals(...)Documentation
docs/why.md,docs/glossary.md, generative-interface docs, and architecture annexes