@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.
Files changed (128) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +294 -0
  3. package/dist/contribution-component.d.ts +82 -0
  4. package/dist/contribution-component.d.ts.map +1 -0
  5. package/dist/contribution-component.js +12 -0
  6. package/dist/contribution-component.js.map +1 -0
  7. package/dist/extension-outlet.d.ts +155 -0
  8. package/dist/extension-outlet.d.ts.map +1 -0
  9. package/dist/extension-outlet.js +229 -0
  10. package/dist/extension-outlet.js.map +1 -0
  11. package/dist/extension-registry-provider.d.ts +26 -0
  12. package/dist/extension-registry-provider.d.ts.map +1 -0
  13. package/dist/extension-registry-provider.js +82 -0
  14. package/dist/extension-registry-provider.js.map +1 -0
  15. package/dist/index.d.ts +22 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +14 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/internal/adapter-configuration.d.ts +54 -0
  20. package/dist/internal/adapter-configuration.d.ts.map +1 -0
  21. package/dist/internal/adapter-configuration.js +89 -0
  22. package/dist/internal/adapter-configuration.js.map +1 -0
  23. package/dist/internal/adapter-context.d.ts +24 -0
  24. package/dist/internal/adapter-context.d.ts.map +1 -0
  25. package/dist/internal/adapter-context.js +23 -0
  26. package/dist/internal/adapter-context.js.map +1 -0
  27. package/dist/internal/adapter-registry-bridge.d.ts +58 -0
  28. package/dist/internal/adapter-registry-bridge.d.ts.map +1 -0
  29. package/dist/internal/adapter-registry-bridge.js +494 -0
  30. package/dist/internal/adapter-registry-bridge.js.map +1 -0
  31. package/dist/internal/adapter-registry-protocol.d.ts +53 -0
  32. package/dist/internal/adapter-registry-protocol.d.ts.map +1 -0
  33. package/dist/internal/adapter-registry-protocol.js +182 -0
  34. package/dist/internal/adapter-registry-protocol.js.map +1 -0
  35. package/dist/internal/adapter-scope.d.ts +87 -0
  36. package/dist/internal/adapter-scope.d.ts.map +1 -0
  37. package/dist/internal/adapter-scope.js +346 -0
  38. package/dist/internal/adapter-scope.js.map +1 -0
  39. package/dist/internal/implementation-classifier.d.ts +21 -0
  40. package/dist/internal/implementation-classifier.d.ts.map +1 -0
  41. package/dist/internal/implementation-classifier.js +39 -0
  42. package/dist/internal/implementation-classifier.js.map +1 -0
  43. package/dist/internal/managed-lazy-generation.d.ts +100 -0
  44. package/dist/internal/managed-lazy-generation.d.ts.map +1 -0
  45. package/dist/internal/managed-lazy-generation.js +419 -0
  46. package/dist/internal/managed-lazy-generation.js.map +1 -0
  47. package/dist/internal/outlet-commit-lease.d.ts +46 -0
  48. package/dist/internal/outlet-commit-lease.d.ts.map +1 -0
  49. package/dist/internal/outlet-commit-lease.js +137 -0
  50. package/dist/internal/outlet-commit-lease.js.map +1 -0
  51. package/dist/internal/outlet-error-pipeline.d.ts +122 -0
  52. package/dist/internal/outlet-error-pipeline.d.ts.map +1 -0
  53. package/dist/internal/outlet-error-pipeline.js +214 -0
  54. package/dist/internal/outlet-error-pipeline.js.map +1 -0
  55. package/dist/internal/outlet-input.d.ts +42 -0
  56. package/dist/internal/outlet-input.d.ts.map +1 -0
  57. package/dist/internal/outlet-input.js +86 -0
  58. package/dist/internal/outlet-input.js.map +1 -0
  59. package/dist/internal/outlet-membership-boundary.d.ts +93 -0
  60. package/dist/internal/outlet-membership-boundary.d.ts.map +1 -0
  61. package/dist/internal/outlet-membership-boundary.js +710 -0
  62. package/dist/internal/outlet-membership-boundary.js.map +1 -0
  63. package/dist/internal/outlet-membership.d.ts +31 -0
  64. package/dist/internal/outlet-membership.d.ts.map +1 -0
  65. package/dist/internal/outlet-membership.js +65 -0
  66. package/dist/internal/outlet-membership.js.map +1 -0
  67. package/dist/internal/outlet-projection.d.ts +102 -0
  68. package/dist/internal/outlet-projection.d.ts.map +1 -0
  69. package/dist/internal/outlet-projection.js +228 -0
  70. package/dist/internal/outlet-projection.js.map +1 -0
  71. package/dist/internal/outlet-reporter-boundary.d.ts +42 -0
  72. package/dist/internal/outlet-reporter-boundary.d.ts.map +1 -0
  73. package/dist/internal/outlet-reporter-boundary.js +57 -0
  74. package/dist/internal/outlet-reporter-boundary.js.map +1 -0
  75. package/dist/internal/public-input-capture.d.ts +13 -0
  76. package/dist/internal/public-input-capture.d.ts.map +1 -0
  77. package/dist/internal/public-input-capture.js +34 -0
  78. package/dist/internal/public-input-capture.js.map +1 -0
  79. package/dist/internal/resolved-contributions-query.d.ts +42 -0
  80. package/dist/internal/resolved-contributions-query.d.ts.map +1 -0
  81. package/dist/internal/resolved-contributions-query.js +203 -0
  82. package/dist/internal/resolved-contributions-query.js.map +1 -0
  83. package/dist/react-adapter-diagnostics.d.ts +199 -0
  84. package/dist/react-adapter-diagnostics.d.ts.map +1 -0
  85. package/dist/react-adapter-diagnostics.js +257 -0
  86. package/dist/react-adapter-diagnostics.js.map +1 -0
  87. package/dist/react-adapter-error.d.ts +35 -0
  88. package/dist/react-adapter-error.d.ts.map +1 -0
  89. package/dist/react-adapter-error.js +37 -0
  90. package/dist/react-adapter-error.js.map +1 -0
  91. package/dist/react-extension-point.d.ts +26 -0
  92. package/dist/react-extension-point.d.ts.map +1 -0
  93. package/dist/react-extension-point.js +100 -0
  94. package/dist/react-extension-point.js.map +1 -0
  95. package/dist/react-lazy-contribution.d.ts +40 -0
  96. package/dist/react-lazy-contribution.d.ts.map +1 -0
  97. package/dist/react-lazy-contribution.js +18 -0
  98. package/dist/react-lazy-contribution.js.map +1 -0
  99. package/dist/resolved-contributions.d.ts +90 -0
  100. package/dist/resolved-contributions.d.ts.map +1 -0
  101. package/dist/resolved-contributions.js +455 -0
  102. package/dist/resolved-contributions.js.map +1 -0
  103. package/package.json +47 -0
  104. package/src/contribution-component.ts +118 -0
  105. package/src/extension-outlet.ts +590 -0
  106. package/src/extension-registry-provider.ts +179 -0
  107. package/src/index.ts +72 -0
  108. package/src/internal/adapter-configuration.ts +181 -0
  109. package/src/internal/adapter-context.ts +43 -0
  110. package/src/internal/adapter-registry-bridge.ts +723 -0
  111. package/src/internal/adapter-registry-protocol.ts +365 -0
  112. package/src/internal/adapter-scope.ts +500 -0
  113. package/src/internal/implementation-classifier.ts +59 -0
  114. package/src/internal/managed-lazy-generation.ts +540 -0
  115. package/src/internal/outlet-commit-lease.ts +216 -0
  116. package/src/internal/outlet-error-pipeline.ts +447 -0
  117. package/src/internal/outlet-input.ts +264 -0
  118. package/src/internal/outlet-membership-boundary.ts +1048 -0
  119. package/src/internal/outlet-membership.ts +125 -0
  120. package/src/internal/outlet-projection.ts +511 -0
  121. package/src/internal/outlet-reporter-boundary.ts +105 -0
  122. package/src/internal/public-input-capture.ts +55 -0
  123. package/src/internal/resolved-contributions-query.ts +318 -0
  124. package/src/react-adapter-diagnostics.ts +457 -0
  125. package/src/react-adapter-error.ts +88 -0
  126. package/src/react-extension-point.ts +181 -0
  127. package/src/react-lazy-contribution.ts +66 -0
  128. 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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"}