Skip to content

Commit e25a1e8

Browse files
committed
Remove @viewBinding decorator and related OO view infrastructure (v9 breaking change)
`viewBinding`, `ViewBinder`, `createViewForModel`, `DEFAULT_VIEW_KEY`, and `ViewMetadata` are removed from `esp-js-react`. These were part of the old OO model pattern where a decorator on a class instance bound it to a React view via prototype metadata — a pattern that no longer exists in v9. `ConnectableComponent` now requires an explicit `view` prop; view resolution via decorator metadata is gone. `viewContext` is also removed from `ConnectableComponentProps` and `connect()` as it only served the decorator lookup. With no remaining decorator usage in the codebase, `experimentalDecorators` and `emitDecoratorMetadata` are removed from the root `tsconfig.json`.
1 parent 236fa39 commit e25a1e8

10 files changed

Lines changed: 67 additions & 288 deletions

CHANGES-v9.md

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,65 @@ new ModelBuilder<MyModel>(router, 'my-model', initialModel)
321321

322322
---
323323

324-
## esp-js-polimer deprecation
324+
## esp-js-polimer removal
325325

326-
`esp-js-polimer` is deprecated as of v9. It will not receive new features. Bug fixes may be applied on a best-effort basis.
326+
`esp-js-polimer` has been **deleted** from the monorepo. The package is no longer published.
327327

328-
Polimer's concepts — immutable state, immer drafts, builder registration, event transforms — are the direct ancestors of the v9 `esp-js` API. Teams using polimer should migrate to the native `ModelBuilder` API. The functional shape is very similar; the main differences are:
328+
Polimer's concepts — immutable state, immer drafts, builder registration, event transforms — are the direct ancestors of the v9 `esp-js` API. The `ModelBuilder` in `esp-js` is the replacement.
329329

330-
- `PolimerModelBuilder``ModelBuilder`
331-
- `withStateHandlers(key, handlers)` (per-slice) → `withEventHandler` on the full model
332-
- `@eventTransformFor` (RxJS observable transforms) → `withEffect` + `withEventSubscription`
333-
- `PolimerModel.getImmutableModel()``router.getModelObservable()` returns the POJO directly
330+
Migration reference:
331+
332+
| esp-js-polimer | esp-js v9 |
333+
|---|---|
334+
| `PolimerModelBuilder` | `ModelBuilder` |
335+
| `withStateHandlers(key, handlers)` (per-slice) | `withEventHandler` on the full model |
336+
| `@eventTransformFor` (RxJS observable transforms) | `withEffect` + `withEventSubscription` |
337+
| `PolimerModel.getImmutableModel()` | `router.getModelObservable()` — emits the POJO directly |
338+
339+
---
340+
341+
## esp-js-react — polimer integration removed
342+
343+
`esp-js-react` no longer depends on or integrates with `esp-js-polimer`. The model contract is now simple: `router.getModelObservable()` always emits a **frozen immutable POJO** (produced by immer via `ModelBuilder`). No unwrapping is needed.
344+
345+
### `useSyncModelWithSelector` — removed option
346+
347+
`tryPreSelectPolimerImmutableModel` has been removed from `SyncModelWithSelectorOptions`. This option previously called `model.getEspPolimerImmutableModel()` before applying the selector. Since the model is now the direct frozen snapshot, no pre-selection is necessary.
348+
349+
**Before (v8 with polimer):**
350+
```typescript
351+
syncModelWithSelectorOptions<MyModel>()
352+
.setModelId('my-model')
353+
.setTryPreSelectPolimerImmutableModel(true) // removed
354+
.build()
355+
```
356+
357+
**After (v9):**
358+
```typescript
359+
syncModelWithSelectorOptions<MyModel>()
360+
.setModelId('my-model')
361+
.build()
362+
```
363+
364+
### `ConnectableComponent` — duck-typing removed
365+
366+
`ConnectableComponent` previously checked for `getEspPolimerImmutableModel` on the model and unwrapped it before passing to `mapModelToProps`. This duck-typing is removed. The raw frozen model is passed directly.
367+
368+
### Reactive API internalized
369+
370+
The `reactive/` module in `esp-js` is now internal-only and is not exported from `src/index.ts`. `Observable`, `Subject`, `RouterObservable`, and `RouterSubject` are no longer part of the public API.
371+
372+
Code that previously used `Observable.create` to wrap `router.getModelObservable()` must be updated to wrap the `subscribe` method directly:
373+
374+
```typescript
375+
// Before (broken — Observable is no longer exported):
376+
const wrapped = Observable.create<MyModel>(o => router.getModelObservable('id').subscribe(o));
377+
378+
// After:
379+
const upstream = router.getModelObservable<MyModel>('id');
380+
const wrapped = {
381+
subscribe(observer: any) {
382+
return upstream.subscribe(observer);
383+
}
384+
} as Subscribable<MyModel>;
385+
```

packages/esp-js-react/src/connect.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ export const connect = function <TModel, TPublishEventProps, TModelMappedToProps
1313
): ConnectableComponentFactory<TModel, TPublishEventProps, TModelMappedToProps> {
1414
return function (view: React.ComponentType) {
1515
return function (props: ConnectableComponentProps<TModel, TPublishEventProps, TModelMappedToProps>) {
16-
const {modelId, viewContext, ...rest} = props;
16+
const {modelId, ...rest} = props;
1717
return <ConnectableComponent
1818
modelId={modelId}
1919
view={view}
20-
viewContext={viewContext}
2120
createPublishEventProps={createPublishEventProps}
2221
mapModelToProps={mapModelToProps}
2322
{...rest}

packages/esp-js-react/src/connectableComponent.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {useRouter} from './espRouterContextProvider';
33
import {useMemo} from 'react';
44
import {Router} from 'esp-js';
55
import {EspModelContextProvider, useGetModelId} from './espModelContextProvider';
6-
import {createViewForModel} from './viewBindingDecorator';
76
import {syncModelWithSelectorOptions, useSyncModelWithSelector} from './useSyncModelWithSelector';
87

98
export type CreatePublishEventProps<TPublishEventProps> = (publishModelEvent: (eventType: string, event: any) => void) => TPublishEventProps;
@@ -12,7 +11,6 @@ export type MapModelToProps<TModel, TModelMappedToProps, TPublishEventProps = {}
1211

1312
export interface ConnectableComponentProps<TModel = {}, TPublishEventProps = {}, TModelMappedToProps = {}> {
1413
modelId?: string;
15-
viewContext?: string;
1614
view?: React.ComponentType;
1715
createPublishEventProps?: CreatePublishEventProps<TPublishEventProps>;
1816
mapModelToProps?: MapModelToProps<TModel, TModelMappedToProps, TPublishEventProps>;
@@ -56,7 +54,6 @@ export const ConnectableComponent = <TModel = {}, TPublishEventProps = {}, TMode
5654
mapModelToProps,
5755
createPublishEventProps,
5856
view,
59-
viewContext,
6057
...rest
6158
}: ConnectableComponentProps<TModel, TPublishEventProps, TModelMappedToProps>
6259
) => {
@@ -85,7 +82,7 @@ export const ConnectableComponent = <TModel = {}, TPublishEventProps = {}, TMode
8582
return null;
8683
}
8784
let childProps = getChildProps(router, modelId, rest, model, mapModelToProps, publishEventProps);
88-
let viewElement = createViewForModel(model, childProps, viewContext, view);
85+
let viewElement = view ? React.createElement(view as React.ComponentType<any>, childProps) : null;
8986
return (
9087
<EspModelContextProvider modelId={modelId} model={model} router={router} {...childProps}>
9188
{viewElement}

packages/esp-js-react/src/index.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
// notice_end
1818
//
1919

20-
export {ViewBinder} from './viewBinder';
21-
export {viewBinding, DEFAULT_VIEW_KEY} from './viewBindingDecorator';
22-
export {createViewForModel} from './viewBindingDecorator';
2320
export {
2421
connect,
2522
ConnectableComponentFactory

packages/esp-js-react/src/viewBinder.tsx

Lines changed: 0 additions & 51 deletions
This file was deleted.

packages/esp-js-react/src/viewBindingDecorator.ts

Lines changed: 0 additions & 113 deletions
This file was deleted.

0 commit comments

Comments
 (0)