@primafuture/contrib-kit-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +294 -0
- package/dist/contribution-component.d.ts +82 -0
- package/dist/contribution-component.d.ts.map +1 -0
- package/dist/contribution-component.js +12 -0
- package/dist/contribution-component.js.map +1 -0
- package/dist/extension-outlet.d.ts +155 -0
- package/dist/extension-outlet.d.ts.map +1 -0
- package/dist/extension-outlet.js +229 -0
- package/dist/extension-outlet.js.map +1 -0
- package/dist/extension-registry-provider.d.ts +26 -0
- package/dist/extension-registry-provider.d.ts.map +1 -0
- package/dist/extension-registry-provider.js +82 -0
- package/dist/extension-registry-provider.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/adapter-configuration.d.ts +54 -0
- package/dist/internal/adapter-configuration.d.ts.map +1 -0
- package/dist/internal/adapter-configuration.js +89 -0
- package/dist/internal/adapter-configuration.js.map +1 -0
- package/dist/internal/adapter-context.d.ts +24 -0
- package/dist/internal/adapter-context.d.ts.map +1 -0
- package/dist/internal/adapter-context.js +23 -0
- package/dist/internal/adapter-context.js.map +1 -0
- package/dist/internal/adapter-registry-bridge.d.ts +58 -0
- package/dist/internal/adapter-registry-bridge.d.ts.map +1 -0
- package/dist/internal/adapter-registry-bridge.js +494 -0
- package/dist/internal/adapter-registry-bridge.js.map +1 -0
- package/dist/internal/adapter-registry-protocol.d.ts +53 -0
- package/dist/internal/adapter-registry-protocol.d.ts.map +1 -0
- package/dist/internal/adapter-registry-protocol.js +182 -0
- package/dist/internal/adapter-registry-protocol.js.map +1 -0
- package/dist/internal/adapter-scope.d.ts +87 -0
- package/dist/internal/adapter-scope.d.ts.map +1 -0
- package/dist/internal/adapter-scope.js +346 -0
- package/dist/internal/adapter-scope.js.map +1 -0
- package/dist/internal/implementation-classifier.d.ts +21 -0
- package/dist/internal/implementation-classifier.d.ts.map +1 -0
- package/dist/internal/implementation-classifier.js +39 -0
- package/dist/internal/implementation-classifier.js.map +1 -0
- package/dist/internal/managed-lazy-generation.d.ts +100 -0
- package/dist/internal/managed-lazy-generation.d.ts.map +1 -0
- package/dist/internal/managed-lazy-generation.js +419 -0
- package/dist/internal/managed-lazy-generation.js.map +1 -0
- package/dist/internal/outlet-commit-lease.d.ts +46 -0
- package/dist/internal/outlet-commit-lease.d.ts.map +1 -0
- package/dist/internal/outlet-commit-lease.js +137 -0
- package/dist/internal/outlet-commit-lease.js.map +1 -0
- package/dist/internal/outlet-error-pipeline.d.ts +122 -0
- package/dist/internal/outlet-error-pipeline.d.ts.map +1 -0
- package/dist/internal/outlet-error-pipeline.js +214 -0
- package/dist/internal/outlet-error-pipeline.js.map +1 -0
- package/dist/internal/outlet-input.d.ts +42 -0
- package/dist/internal/outlet-input.d.ts.map +1 -0
- package/dist/internal/outlet-input.js +86 -0
- package/dist/internal/outlet-input.js.map +1 -0
- package/dist/internal/outlet-membership-boundary.d.ts +93 -0
- package/dist/internal/outlet-membership-boundary.d.ts.map +1 -0
- package/dist/internal/outlet-membership-boundary.js +710 -0
- package/dist/internal/outlet-membership-boundary.js.map +1 -0
- package/dist/internal/outlet-membership.d.ts +31 -0
- package/dist/internal/outlet-membership.d.ts.map +1 -0
- package/dist/internal/outlet-membership.js +65 -0
- package/dist/internal/outlet-membership.js.map +1 -0
- package/dist/internal/outlet-projection.d.ts +102 -0
- package/dist/internal/outlet-projection.d.ts.map +1 -0
- package/dist/internal/outlet-projection.js +228 -0
- package/dist/internal/outlet-projection.js.map +1 -0
- package/dist/internal/outlet-reporter-boundary.d.ts +42 -0
- package/dist/internal/outlet-reporter-boundary.d.ts.map +1 -0
- package/dist/internal/outlet-reporter-boundary.js +57 -0
- package/dist/internal/outlet-reporter-boundary.js.map +1 -0
- package/dist/internal/public-input-capture.d.ts +13 -0
- package/dist/internal/public-input-capture.d.ts.map +1 -0
- package/dist/internal/public-input-capture.js +34 -0
- package/dist/internal/public-input-capture.js.map +1 -0
- package/dist/internal/resolved-contributions-query.d.ts +42 -0
- package/dist/internal/resolved-contributions-query.d.ts.map +1 -0
- package/dist/internal/resolved-contributions-query.js +203 -0
- package/dist/internal/resolved-contributions-query.js.map +1 -0
- package/dist/react-adapter-diagnostics.d.ts +199 -0
- package/dist/react-adapter-diagnostics.d.ts.map +1 -0
- package/dist/react-adapter-diagnostics.js +257 -0
- package/dist/react-adapter-diagnostics.js.map +1 -0
- package/dist/react-adapter-error.d.ts +35 -0
- package/dist/react-adapter-error.d.ts.map +1 -0
- package/dist/react-adapter-error.js +37 -0
- package/dist/react-adapter-error.js.map +1 -0
- package/dist/react-extension-point.d.ts +26 -0
- package/dist/react-extension-point.d.ts.map +1 -0
- package/dist/react-extension-point.js +100 -0
- package/dist/react-extension-point.js.map +1 -0
- package/dist/react-lazy-contribution.d.ts +40 -0
- package/dist/react-lazy-contribution.d.ts.map +1 -0
- package/dist/react-lazy-contribution.js +18 -0
- package/dist/react-lazy-contribution.js.map +1 -0
- package/dist/resolved-contributions.d.ts +90 -0
- package/dist/resolved-contributions.d.ts.map +1 -0
- package/dist/resolved-contributions.js +455 -0
- package/dist/resolved-contributions.js.map +1 -0
- package/package.json +47 -0
- package/src/contribution-component.ts +118 -0
- package/src/extension-outlet.ts +590 -0
- package/src/extension-registry-provider.ts +179 -0
- package/src/index.ts +72 -0
- package/src/internal/adapter-configuration.ts +181 -0
- package/src/internal/adapter-context.ts +43 -0
- package/src/internal/adapter-registry-bridge.ts +723 -0
- package/src/internal/adapter-registry-protocol.ts +365 -0
- package/src/internal/adapter-scope.ts +500 -0
- package/src/internal/implementation-classifier.ts +59 -0
- package/src/internal/managed-lazy-generation.ts +540 -0
- package/src/internal/outlet-commit-lease.ts +216 -0
- package/src/internal/outlet-error-pipeline.ts +447 -0
- package/src/internal/outlet-input.ts +264 -0
- package/src/internal/outlet-membership-boundary.ts +1048 -0
- package/src/internal/outlet-membership.ts +125 -0
- package/src/internal/outlet-projection.ts +511 -0
- package/src/internal/outlet-reporter-boundary.ts +105 -0
- package/src/internal/public-input-capture.ts +55 -0
- package/src/internal/resolved-contributions-query.ts +318 -0
- package/src/react-adapter-diagnostics.ts +457 -0
- package/src/react-adapter-error.ts +88 -0
- package/src/react-extension-point.ts +181 -0
- package/src/react-lazy-contribution.ts +66 -0
- package/src/resolved-contributions.ts +895 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PrimaFuture.cz s.r.o.
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# @primafuture/contrib-kit-react
|
|
2
|
+
|
|
3
|
+
Typed React contribution components and synchronous resolved Core views for Contrib
|
|
4
|
+
Kit. The package provides typed point helpers, a scoped registry provider,
|
|
5
|
+
`useResolvedContributions()`, and a headless `ExtensionOutlet` with logical placement,
|
|
6
|
+
isolated error boundaries, policy, retry, and commit-only managed-lazy loading.
|
|
7
|
+
|
|
8
|
+
Install the framework-neutral Core and React peers together:
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
pnpm add @primafuture/contrib-kit-core @primafuture/contrib-kit-react react react-dom
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import {
|
|
16
|
+
defineReactContributionComponent,
|
|
17
|
+
defineReactExtensionPoint,
|
|
18
|
+
defineReactLazyContribution,
|
|
19
|
+
ExtensionOutlet,
|
|
20
|
+
ExtensionRegistryProvider,
|
|
21
|
+
useResolvedContributions,
|
|
22
|
+
} from "@primafuture/contrib-kit-react";
|
|
23
|
+
import { createExtensionRegistry } from "@primafuture/contrib-kit-core";
|
|
24
|
+
|
|
25
|
+
interface PanelContext {
|
|
26
|
+
readonly locale: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface PanelData {
|
|
30
|
+
readonly title: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const Panel = defineReactContributionComponent(
|
|
34
|
+
function Panel(props: {
|
|
35
|
+
readonly context: PanelContext;
|
|
36
|
+
readonly contribution: {
|
|
37
|
+
readonly contributionId: string;
|
|
38
|
+
readonly data: PanelData;
|
|
39
|
+
};
|
|
40
|
+
readonly placement: {
|
|
41
|
+
readonly index: number;
|
|
42
|
+
readonly count: number;
|
|
43
|
+
readonly isFirst: boolean;
|
|
44
|
+
readonly isLast: boolean;
|
|
45
|
+
};
|
|
46
|
+
}) {
|
|
47
|
+
return `${props.context.locale}: ${props.contribution.data.title}`;
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const panels = defineReactExtensionPoint<PanelContext, PanelData>()({
|
|
52
|
+
pointId: "example.panels",
|
|
53
|
+
contractVersion: 1,
|
|
54
|
+
cardinality: "many",
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const lazyPanel = defineReactLazyContribution({
|
|
58
|
+
async load() {
|
|
59
|
+
return Panel;
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const registry = createExtensionRegistry();
|
|
64
|
+
registry.rootScope.registerPoint(panels);
|
|
65
|
+
const registration = registry.registerContribution(panels, {
|
|
66
|
+
contributionId: "example.panel",
|
|
67
|
+
expectedContractVersion: 1,
|
|
68
|
+
implementation: lazyPanel,
|
|
69
|
+
data: { title: "Overview" },
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await registration.whenActive();
|
|
73
|
+
|
|
74
|
+
function PanelList() {
|
|
75
|
+
const { state, refresh } = useResolvedContributions({
|
|
76
|
+
point: panels,
|
|
77
|
+
context: { locale: "en" },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (state.status === "failed") {
|
|
81
|
+
return <button onClick={refresh}>Retry resolution</button>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<ul>
|
|
86
|
+
{state.contributions.map((contribution) => (
|
|
87
|
+
<li key={contribution.registrationId}>{contribution.data.title}</li>
|
|
88
|
+
))}
|
|
89
|
+
</ul>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const app = (
|
|
94
|
+
<ExtensionRegistryProvider registry={registry}>
|
|
95
|
+
<PanelList />
|
|
96
|
+
<ExtensionOutlet
|
|
97
|
+
point={panels}
|
|
98
|
+
context={{ locale: "en" }}
|
|
99
|
+
renderLoading={({ contribution }) => (
|
|
100
|
+
<span>Loading {contribution.data.title}…</span>
|
|
101
|
+
)}
|
|
102
|
+
renderContributionError={({ error, retry }) => (
|
|
103
|
+
<button onClick={retry}>{error.code}</button>
|
|
104
|
+
)}
|
|
105
|
+
/>
|
|
106
|
+
</ExtensionRegistryProvider>
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
await registry.dispose();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The provider owns only React adapter subscriptions; the host still owns and disposes
|
|
113
|
+
the Core registry and contribution handles. `useResolvedContributions()` returns a
|
|
114
|
+
frozen synchronous view, classifies empty results as `noRegistrations` or
|
|
115
|
+
`excludedByPolicy`, and exposes a local `refresh()` that never commits Core state.
|
|
116
|
+
`ExtensionOutlet` uses no mandatory DOM wrapper, derives frozen placement from the
|
|
117
|
+
final Core order, preserves retained membership state across reorder, and confines each
|
|
118
|
+
contribution behind its own policy-controlled boundary. The `lazyPanel`
|
|
119
|
+
descriptor starts its loader only after a committed client passive effect. One retry
|
|
120
|
+
generation owns at most one loader attempt and `AbortController`; fulfillment renders
|
|
121
|
+
with the latest logical placement, while loader failures use the same contribution
|
|
122
|
+
policy and retry pipeline as render failures. Lifecycle loss always removes UI and
|
|
123
|
+
callback authority before dispatching an idempotent abort. A later loader settlement
|
|
124
|
+
cannot change the UI; while its original outlet and scope epoch are still current, it
|
|
125
|
+
may emit one safe `lateLazyResult` diagnostic without the value or rejection cause.
|
|
126
|
+
A current rejection named `AbortError` remains a normal `REACT_LAZY_LOAD_FAILED`
|
|
127
|
+
outcome. The host still owns any data fetching or module-loader strategy used inside
|
|
128
|
+
`load()`.
|
|
129
|
+
|
|
130
|
+
In React 19, placing a provider subtree inside `<Activity>` closes adapter-owned
|
|
131
|
+
subscriptions and pending lazy work while hidden without discarding React membership
|
|
132
|
+
state. Reveal catches up Core changes before the first visible view, preserves ready
|
|
133
|
+
components and failed presentation, and restarts only a still-pending lazy attempt
|
|
134
|
+
with a new abort signal. React 18 keeps the same Strict Mode lifecycle without an
|
|
135
|
+
Activity-specific API requirement.
|
|
136
|
+
|
|
137
|
+
## Server rendering
|
|
138
|
+
|
|
139
|
+
Traditional `renderToString()` uses the same public provider and outlet. Create one
|
|
140
|
+
mutable Core registry per request, register the shared immutable point contracts,
|
|
141
|
+
await every contribution that the response requires, and dispose the registry in the
|
|
142
|
+
request cleanup path:
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
import { renderToString } from "react-dom/server";
|
|
146
|
+
|
|
147
|
+
async function renderRequest(locale: string): Promise<string> {
|
|
148
|
+
const identifierPrefix = "request-a-";
|
|
149
|
+
const requestRegistry = createExtensionRegistry();
|
|
150
|
+
requestRegistry.rootScope.registerPoint(panels);
|
|
151
|
+
const requestPanel = requestRegistry.registerContribution(panels, {
|
|
152
|
+
contributionId: "request.panel",
|
|
153
|
+
expectedContractVersion: 1,
|
|
154
|
+
implementation: lazyPanel,
|
|
155
|
+
data: { title: "Overview" },
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
await requestPanel.whenActive();
|
|
160
|
+
return renderToString(
|
|
161
|
+
<ExtensionRegistryProvider registry={requestRegistry}>
|
|
162
|
+
<ExtensionOutlet
|
|
163
|
+
point={panels}
|
|
164
|
+
context={{ locale }}
|
|
165
|
+
renderLoading={({ contribution, placement }) => (
|
|
166
|
+
<span data-position={`${placement.index}/${placement.count}`}>
|
|
167
|
+
Loading {contribution.data.title}…
|
|
168
|
+
</span>
|
|
169
|
+
)}
|
|
170
|
+
/>
|
|
171
|
+
</ExtensionRegistryProvider>,
|
|
172
|
+
{ identifierPrefix },
|
|
173
|
+
);
|
|
174
|
+
} finally {
|
|
175
|
+
await requestRegistry.dispose();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Server rendering synchronously reads the already committed Core view. Eager
|
|
181
|
+
contributions render normally; managed-lazy contributions render their deterministic
|
|
182
|
+
loading state without starting the loader or creating an `AbortController`. No
|
|
183
|
+
adapter subscriber, effect lease, sink callback, or error policy runs on the server.
|
|
184
|
+
Descendant render failures pass through to the host's server error handling.
|
|
185
|
+
|
|
186
|
+
## Hydration
|
|
187
|
+
|
|
188
|
+
Before `hydrateRoot()`, reconstruct the same committed logical view in a new
|
|
189
|
+
client-owned Core registry. Point and contribution IDs, contract versions, data,
|
|
190
|
+
context, order, selection result, eager/lazy kind, and render props must match the
|
|
191
|
+
server response. Runtime registration IDs do not need to match and must not be
|
|
192
|
+
serialized into HTML or bootstrap data.
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
import { hydrateRoot } from "react-dom/client";
|
|
196
|
+
|
|
197
|
+
const clientRegistry = createExtensionRegistry();
|
|
198
|
+
clientRegistry.rootScope.registerPoint(panels);
|
|
199
|
+
const clientPanel = clientRegistry.registerContribution(panels, {
|
|
200
|
+
contributionId: "request.panel",
|
|
201
|
+
expectedContractVersion: 1,
|
|
202
|
+
implementation: lazyPanel,
|
|
203
|
+
data: { title: "Overview" },
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
await clientPanel.whenActive();
|
|
207
|
+
|
|
208
|
+
const clientRoot = hydrateRoot(
|
|
209
|
+
document.querySelector("#app")!,
|
|
210
|
+
<ExtensionRegistryProvider registry={clientRegistry}>
|
|
211
|
+
<ExtensionOutlet
|
|
212
|
+
point={panels}
|
|
213
|
+
context={{ locale: "en" }}
|
|
214
|
+
renderLoading={({ contribution, placement }) => (
|
|
215
|
+
<span data-position={`${placement.index}/${placement.count}`}>
|
|
216
|
+
Loading {contribution.data.title}…
|
|
217
|
+
</span>
|
|
218
|
+
)}
|
|
219
|
+
/>
|
|
220
|
+
</ExtensionRegistryProvider>,
|
|
221
|
+
{ identifierPrefix: "request-a-" },
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
async function disposeClient(): Promise<void> {
|
|
225
|
+
clientRoot.unmount();
|
|
226
|
+
await clientRegistry.dispose();
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The `identifierPrefix` must exactly match the corresponding server
|
|
231
|
+
`renderToString()` call; simultaneous roots need distinct prefixes. The first
|
|
232
|
+
hydration render uses the same logical snapshot and loading placement as the server.
|
|
233
|
+
A managed-lazy loader starts only after the client tree commits. If setup or hydration
|
|
234
|
+
fails before the host transfers ownership to its normal lifecycle, attempt React root
|
|
235
|
+
unmount first and Core registry disposal second, preserving the primary error and all
|
|
236
|
+
cleanup failures.
|
|
237
|
+
|
|
238
|
+
## Fast Refresh and Core HMR
|
|
239
|
+
|
|
240
|
+
React component refresh and Core point refresh are two independent development
|
|
241
|
+
lifecycles. Keep a component-only React Refresh boundary separate from point
|
|
242
|
+
definition and registration orchestration. A valid component-only edit can preserve
|
|
243
|
+
eligible local React state without committing Core state, re-registering the
|
|
244
|
+
contribution, or changing its activation identity.
|
|
245
|
+
|
|
246
|
+
For a point definition edit, pass the real bundler hot context and a stable `hotKey`
|
|
247
|
+
through `defineReactExtensionPoint()`:
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
export const panels = defineReactExtensionPoint<PanelContext, PanelData>()({
|
|
251
|
+
pointId: "app.panels",
|
|
252
|
+
contractVersion: 1,
|
|
253
|
+
cardinality: "many",
|
|
254
|
+
filter(panel, context) {
|
|
255
|
+
return panel.data.area === context.area;
|
|
256
|
+
},
|
|
257
|
+
}, {
|
|
258
|
+
hot: import.meta.hot,
|
|
259
|
+
hotKey: "app.panels",
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
import.meta.hot?.accept();
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
A compatible Core refresh keeps the canonical point and active registration IDs,
|
|
266
|
+
emits `pointDefinitionRefreshed`, and lets exact React consumers resolve the new
|
|
267
|
+
filter, ordering, or selection result atomically. An incompatible point contract is
|
|
268
|
+
rejected by Core with `INCOMPATIBLE_HOT_UPDATE` and delegates to the host invalidation
|
|
269
|
+
path without publishing a partial adapter view.
|
|
270
|
+
|
|
271
|
+
React Refresh state preservation remains a development-time best effort. Changing a
|
|
272
|
+
module's non-component exports can invalidate its refresh boundary and legitimately
|
|
273
|
+
produce a full reload or importer invalidation. Changing a managed-lazy loader or its
|
|
274
|
+
descriptor is likewise not an adapter Fast Refresh contract: use an explicit Core
|
|
275
|
+
contribution replacement or re-registration when the loader identity must change.
|
|
276
|
+
|
|
277
|
+
## Workspace examples
|
|
278
|
+
|
|
279
|
+
- The readable [React SPA](../../examples/react-spa) combines the provider, resolved
|
|
280
|
+
hook, headless outlet, Core ordering and selection, logical placement, isolated
|
|
281
|
+
failures, retry, managed lazy loading, Activity hide/reveal, and component-only
|
|
282
|
+
Fast Refresh.
|
|
283
|
+
- The [React SSR and hydration example](../../examples/react-ssr) demonstrates
|
|
284
|
+
request-local registries, activation readiness, `renderToString()`, matching
|
|
285
|
+
`hydrateRoot()` ownership, post-commit lazy loading, and root-before-registry
|
|
286
|
+
cleanup.
|
|
287
|
+
|
|
288
|
+
These applications provide readable development evidence. The exact-version
|
|
289
|
+
documentation and isolated compatibility fixtures cover the package and release
|
|
290
|
+
boundaries independently.
|
|
291
|
+
|
|
292
|
+
## License
|
|
293
|
+
|
|
294
|
+
ISC
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type * as react from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Privátní compile-time identita, která brání záměně komponent s odlišným kontraktem.
|
|
4
|
+
*/
|
|
5
|
+
declare const reactContributionComponentBrand: unique symbol;
|
|
6
|
+
/**
|
|
7
|
+
* Immutable public view of one contribution passed to a rendering component.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface ExtensionContributionView<Data> {
|
|
12
|
+
/** Stable identifier of the specific contribution within the registry. */
|
|
13
|
+
readonly contributionId: string;
|
|
14
|
+
/** Optional owner identifier when the contribution declares one publicly. */
|
|
15
|
+
readonly contributorId?: string;
|
|
16
|
+
/** Opaque data projection defined by the specific extension point. */
|
|
17
|
+
readonly data: Data;
|
|
18
|
+
/** Optional human-readable label without adapter runtime identity. */
|
|
19
|
+
readonly label?: string;
|
|
20
|
+
/** Optional local name that the host can use for readable identification. */
|
|
21
|
+
readonly localName?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Outlet-local logical placement within the final resolved contribution order.
|
|
25
|
+
*
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export interface ResolvedContributionPlacement {
|
|
29
|
+
/** Zero-based position within the final resolved collection. */
|
|
30
|
+
readonly index: number;
|
|
31
|
+
/** Total number of memberships in the final resolved collection. */
|
|
32
|
+
readonly count: number;
|
|
33
|
+
/** True only for the first membership in a non-empty collection. */
|
|
34
|
+
readonly isFirst: boolean;
|
|
35
|
+
/** True only for the last membership in a non-empty collection. */
|
|
36
|
+
readonly isLast: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The only required props passed by an outlet to a contribution component.
|
|
40
|
+
*
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
export interface ExtensionContributionProps<Context, Data> {
|
|
44
|
+
/** Context captured for the current resolution and render attempt. */
|
|
45
|
+
readonly context: Context;
|
|
46
|
+
/** Immutable public view of the contribution currently being rendered. */
|
|
47
|
+
readonly contribution: ExtensionContributionView<Data>;
|
|
48
|
+
/** Outlet-local logical placement in the final resolved order. */
|
|
49
|
+
readonly placement: ResolvedContributionPlacement;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* React component verified for the exact contribution context/data contract.
|
|
53
|
+
*
|
|
54
|
+
* A private brand keeps both types invariant and prevents assigning an
|
|
55
|
+
* unverified raw component without {@link defineReactContributionComponent}.
|
|
56
|
+
*
|
|
57
|
+
* @public
|
|
58
|
+
*/
|
|
59
|
+
export type ReactContributionComponent<Context, Data> = (react.ComponentType<any> | react.ExoticComponent<any>) & {
|
|
60
|
+
/** Compile-time identity; no property is added to the component at runtime. */
|
|
61
|
+
readonly [reactContributionComponentBrand]: {
|
|
62
|
+
/** Invariant anchor for rendering context. */
|
|
63
|
+
readonly context: (value: Context) => Context;
|
|
64
|
+
/** Invariant anchor for contribution data. */
|
|
65
|
+
readonly data: (value: Data) => Data;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Verifies a React component props contract and returns its original runtime reference.
|
|
70
|
+
*
|
|
71
|
+
* The component must require `context`, `contribution`, and `placement`, cannot
|
|
72
|
+
* require any additional prop, and may declare additional optional props.
|
|
73
|
+
*
|
|
74
|
+
* @public
|
|
75
|
+
*/
|
|
76
|
+
export declare function defineReactContributionComponent<const Component extends react.ComponentType<any> | react.ExoticComponent<any>, Props = Component extends react.ComponentType<infer ComponentProps> ? ComponentProps : Component extends react.ExoticComponent<infer ExoticProps> ? ExoticProps : never, Context = Props extends {
|
|
77
|
+
readonly context: infer ComponentContext;
|
|
78
|
+
} ? ComponentContext : never, Data = Props extends {
|
|
79
|
+
readonly contribution: ExtensionContributionView<infer ComponentData>;
|
|
80
|
+
} ? ComponentData : never>(component: Component & (Props extends ExtensionContributionProps<Context, Data> ? ExtensionContributionProps<Context, Data> extends Props ? unknown : never : never)): Component & ReactContributionComponent<Context, Data>;
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=contribution-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribution-component.d.ts","sourceRoot":"","sources":["../src/contribution-component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC;;GAEG;AACH,OAAO,CAAC,MAAM,+BAA+B,EAAE,OAAO,MAAM,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB,CAAC,IAAI;IAC9C,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEpB,sEAAsE;IACtE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC7C,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B,CAAC,OAAO,EAAE,IAAI;IACxD,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEvD,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,CAAC,OAAO,EAAE,IAAI,IACnD,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG;IACzD,+EAA+E;IAC/E,QAAQ,CAAC,CAAC,+BAA+B,CAAC,EAAE;QAC3C,8CAA8C;QAC9C,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;QAE9C,8CAA8C;QAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;KACrC,CAAC;CACF,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC/C,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAC7E,KAAK,GAAG,SAAS,SAAS,KAAK,CAAC,aAAa,CAAC,MAAM,cAAc,CAAC,GAChE,cAAc,GACd,SAAS,SAAS,KAAK,CAAC,eAAe,CAAC,MAAM,WAAW,CAAC,GACzD,WAAW,GACX,KAAK,EACT,OAAO,GAAG,KAAK,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,gBAAgB,CAAA;CAAE,GACjE,gBAAgB,GAChB,KAAK,EACR,IAAI,GAAG,KAAK,SAAS;IACpB,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC,MAAM,aAAa,CAAC,CAAC;CACtE,GACE,aAAa,GACb,KAAK,EAER,SAAS,EAAE,SAAS,GAAG,CACtB,KAAK,SAAS,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,GACpD,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,GACtD,OAAO,GACP,KAAK,GACN,KAAK,CACR,GACC,SAAS,GAAG,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,CAEvD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifies a React component props contract and returns its original runtime reference.
|
|
3
|
+
*
|
|
4
|
+
* The component must require `context`, `contribution`, and `placement`, cannot
|
|
5
|
+
* require any additional prop, and may declare additional optional props.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export function defineReactContributionComponent(component) {
|
|
10
|
+
return component;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=contribution-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribution-component.js","sourceRoot":"","sources":["../src/contribution-component.ts"],"names":[],"mappings":"AAoFA;;;;;;;GAOG;AACH,MAAM,UAAU,gCAAgC,CAgB/C,SAMC;IAED,OAAO,SAA6E,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type * as contribKitCore from "@primafuture/contrib-kit-core";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Společný frozen render state jedné logical outlet membership.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface ExtensionContributionRenderStateBase<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> {
|
|
9
|
+
/** Context exact outlet resolution snapshotu. */
|
|
10
|
+
readonly context: contribKitCore.ExtensionPointContext<Point>;
|
|
11
|
+
/** Bezpečný public contribution view bez registration identity. */
|
|
12
|
+
readonly contribution: import("./contribution-component.js").ExtensionContributionView<contribKitCore.ExtensionPointData<Point>>;
|
|
13
|
+
/** Outlet-local logická pozice ve finálním Core pořadí. */
|
|
14
|
+
readonly placement: import("./contribution-component.js").ResolvedContributionPlacement;
|
|
15
|
+
/** Exact canonical React extension point. */
|
|
16
|
+
readonly point: Point;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Frozen render state eager nebo již načtené contribution.
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export interface ExtensionContributionReadyRenderState<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> extends ExtensionContributionRenderStateBase<Point> {
|
|
24
|
+
/** Exact ověřená React contribution component reference. */
|
|
25
|
+
readonly component: import("./contribution-component.js").ReactContributionComponent<contribKitCore.ExtensionPointContext<Point>, contribKitCore.ExtensionPointData<Point>>;
|
|
26
|
+
/** Frozen default-render props sdílející tutéž placement referenci. */
|
|
27
|
+
readonly componentProps: import("./contribution-component.js").ExtensionContributionProps<contribKitCore.ExtensionPointContext<Point>, contribKitCore.ExtensionPointData<Point>>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Frozen render state dosud nenačtené managed-lazy membership.
|
|
31
|
+
*
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
export interface ExtensionContributionLoadingRenderState<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> extends ExtensionContributionRenderStateBase<Point> {
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Frozen render state izolované contribution chyby.
|
|
38
|
+
*
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
export interface ExtensionContributionErrorRenderState<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> extends ExtensionContributionRenderStateBase<Point> {
|
|
42
|
+
/** Tentýž frozen primary event použitý sinkem a policy. */
|
|
43
|
+
readonly error: import("./react-adapter-diagnostics.js").ReactAdapterErrorEvent;
|
|
44
|
+
/** Generation-bound recovery command dané membership. */
|
|
45
|
+
retry(): void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Placement-free frozen stav úspěšného prázdného outletu.
|
|
49
|
+
*
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export interface ExtensionEmptyRenderState<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> {
|
|
53
|
+
/** Context úspěšného empty resolution snapshotu. */
|
|
54
|
+
readonly context: contribKitCore.ExtensionPointContext<Point>;
|
|
55
|
+
/** Exact canonical point. */
|
|
56
|
+
readonly point: Point;
|
|
57
|
+
/** Rozlišení prázdného katalogu od policy-excluded výsledku. */
|
|
58
|
+
readonly reason: import("./resolved-contributions.js").ExtensionOutletEmptyReason;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Placement-free frozen stav neúspěšného outlet resolution.
|
|
62
|
+
*
|
|
63
|
+
* @public
|
|
64
|
+
*/
|
|
65
|
+
export interface ExtensionResolveErrorRenderState<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> {
|
|
66
|
+
/** Context neúspěšného query attemptu. */
|
|
67
|
+
readonly context: contribKitCore.ExtensionPointContext<Point>;
|
|
68
|
+
/** Frozen primary resolve event. */
|
|
69
|
+
readonly error: import("./react-adapter-diagnostics.js").ReactAdapterErrorEvent;
|
|
70
|
+
/** Exact canonical point. */
|
|
71
|
+
readonly point: Point;
|
|
72
|
+
/** Stabilní outlet-local invalidace bez Core commitu. */
|
|
73
|
+
refresh(): void;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Frozen discriminovaná recovery capability doručená outlet `onError` callbacku.
|
|
77
|
+
*
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
export type ExtensionOutletErrorEmission = {
|
|
81
|
+
/** Rozlišuje per-membership chybu. */
|
|
82
|
+
readonly kind: "contribution";
|
|
83
|
+
/** Frozen primary contribution event. */
|
|
84
|
+
readonly error: import("./react-adapter-diagnostics.js").ReactAdapterErrorEvent;
|
|
85
|
+
/** Generation-bound membership retry. */
|
|
86
|
+
retry(): void;
|
|
87
|
+
} | {
|
|
88
|
+
/** Rozlišuje celý failed resolve attempt. */
|
|
89
|
+
readonly kind: "resolve";
|
|
90
|
+
/** Frozen primary resolve event. */
|
|
91
|
+
readonly error: import("./react-adapter-diagnostics.js").ReactAdapterErrorEvent;
|
|
92
|
+
/** Stabilní outlet-local refresh command. */
|
|
93
|
+
refresh(): void;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Frozen evidence jednoho committed accepted membership retry.
|
|
97
|
+
*
|
|
98
|
+
* @public
|
|
99
|
+
*/
|
|
100
|
+
export interface ExtensionOutletRetryEvent {
|
|
101
|
+
/** Opaque scope-local boundary identita. */
|
|
102
|
+
readonly boundaryId: string;
|
|
103
|
+
/** Veřejná contribution identita bez business dat. */
|
|
104
|
+
readonly contributionId: string;
|
|
105
|
+
/** Opaque scope-local outlet identita. */
|
|
106
|
+
readonly outletId: string;
|
|
107
|
+
/** Veřejná point identita. */
|
|
108
|
+
readonly pointId: string;
|
|
109
|
+
/** Opaque exact Core activation identita. */
|
|
110
|
+
readonly registrationId: string;
|
|
111
|
+
/** Nově committed monotonická retry generation. */
|
|
112
|
+
readonly retryGeneration: number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Read-once props headless outletu inferované z exact React pointu.
|
|
116
|
+
*
|
|
117
|
+
* @public
|
|
118
|
+
*/
|
|
119
|
+
export interface ExtensionOutletProps<Point extends import("./react-extension-point.js").AnyReactExtensionPoint> {
|
|
120
|
+
/** Context předaný Core resolution pipeline a contribution props. */
|
|
121
|
+
readonly context: contribKitCore.ExtensionPointContext<Point>;
|
|
122
|
+
/** Lokální contribution policy; null obnoví package default. */
|
|
123
|
+
readonly errorPolicy?: import("./react-adapter-diagnostics.js").ReactErrorPolicy | null | undefined;
|
|
124
|
+
/** False eskaluje contribution failure bez policy izolace. */
|
|
125
|
+
readonly isolateErrors?: boolean | undefined;
|
|
126
|
+
/** Committed error callback s omezenou retry nebo refresh capability. */
|
|
127
|
+
readonly onError?: ((event: ExtensionOutletErrorEmission) => void) | undefined;
|
|
128
|
+
/** Callback až po commitu accepted retry generation. */
|
|
129
|
+
readonly onRetry?: ((event: ExtensionOutletRetryEvent) => void) | undefined;
|
|
130
|
+
/** Exact canonical React extension point. */
|
|
131
|
+
readonly point: Point;
|
|
132
|
+
/** Lokální pure context projector; null zruší inherited projector. */
|
|
133
|
+
readonly projectContext?: ((context: contribKitCore.ExtensionPointContext<Point>) => unknown) | null | undefined;
|
|
134
|
+
/** Explicitní registry s předností před nearest providerem. */
|
|
135
|
+
readonly registry?: contribKitCore.ExtensionRegistry | undefined;
|
|
136
|
+
/** Optional headless renderer ready membershipu. */
|
|
137
|
+
readonly renderContribution?: ((state: ExtensionContributionReadyRenderState<Point>) => react.ReactNode) | undefined;
|
|
138
|
+
/** Optional fallback renderer izolované contribution chyby. */
|
|
139
|
+
readonly renderContributionError?: ((state: ExtensionContributionErrorRenderState<Point>) => react.ReactNode) | undefined;
|
|
140
|
+
/** Optional renderer úspěšného prázdného výsledku. */
|
|
141
|
+
readonly renderEmpty?: ((state: ExtensionEmptyRenderState<Point>) => react.ReactNode) | undefined;
|
|
142
|
+
/** Optional renderer managed-lazy loading membershipu. */
|
|
143
|
+
readonly renderLoading?: ((state: ExtensionContributionLoadingRenderState<Point>) => react.ReactNode) | undefined;
|
|
144
|
+
/** Optional renderer celého resolve failure. */
|
|
145
|
+
readonly renderResolveError?: ((state: ExtensionResolveErrorRenderState<Point>) => react.ReactNode) | undefined;
|
|
146
|
+
/** Lokální diagnostic sink; null obnoví bezpečný package fallback. */
|
|
147
|
+
readonly sink?: import("./react-adapter-diagnostics.js").ReactAdapterSink | null | undefined;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Renderuje exact Core resolved kolekci jako headless React Fragment.
|
|
151
|
+
*
|
|
152
|
+
* @public
|
|
153
|
+
*/
|
|
154
|
+
export declare function ExtensionOutlet<Point extends import("./react-extension-point.js").AnyReactExtensionPoint>(props: ExtensionOutletProps<Point>): react.ReactElement | null;
|
|
155
|
+
//# sourceMappingURL=extension-outlet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-outlet.d.ts","sourceRoot":"","sources":["../src/extension-outlet.ts"],"names":[],"mappings":"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"}
|