foldkit 0.35.1 → 0.36.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.
@@ -6,208 +6,243 @@ import { createDevtoolsStore } from '../devtools/store';
6
6
  import { fromString as urlFromString } from '../url';
7
7
  import { patch, toVNode } from '../vdom';
8
8
  import { addBfcacheRestoreListener, addNavigationEventListeners, } from './browserListeners';
9
- import { defaultErrorView, noOpDispatch } from './errorUI';
10
- const SLOW_VIEW_THRESHOLD_MS = 16;
9
+ import { defaultCrashView, noOpDispatch } from './crashUI';
11
10
  const DEFAULT_DEVTOOLS_SHOW = 'Development';
12
11
  const DEFAULT_DEVTOOLS_POSITION = 'BottomRight';
13
12
  const DEFAULT_DEVTOOLS_MODE = 'TimeTravel';
13
+ const DEFAULT_SLOW_VIEW_SHOW = 'Development';
14
+ const DEFAULT_SLOW_VIEW_THRESHOLD_MS = 16;
15
+ const defaultSlowViewCallback = (context) => {
16
+ const trigger = Option.match(context.message, {
17
+ onNone: () => 'init',
18
+ onSome: message => {
19
+ const tag = Predicate.isRecord(message) && '_tag' in message
20
+ ? String(message['_tag'])
21
+ : 'unknown';
22
+ return tag;
23
+ },
24
+ });
25
+ console.warn(`[foldkit] Slow view: ${context.durationMs.toFixed(1)}ms (budget: ${context.thresholdMs}ms), triggered by ${trigger}. Consider moving computation to update or memoizing with createLazy.`, ...Option.toArray(context.message));
26
+ };
14
27
  /** Effect service tag that provides message dispatching to the view layer. */
15
28
  export class Dispatch extends Context.Tag('@foldkit/Dispatch')() {
16
29
  }
17
- const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscriptions, container, browser: browserConfig, errorView, slowViewThresholdMs = SLOW_VIEW_THRESHOLD_MS, resources, managedResources, devtools, }) => (hmrModel) => Effect.scoped(Effect.gen(function* () {
18
- const maybeResourceLayer = resources
19
- ? Option.some(yield* Layer.memoize(resources))
20
- : Option.none();
21
- const managedResourceEntries = managedResources
22
- ? /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
23
- Record.toEntries(managedResources)
24
- : [];
25
- const managedResourceRefs = yield* Effect.forEach(managedResourceEntries, ([_key, config]) => Ref.make(Option.none()).pipe(Effect.map(ref => ({ config, ref }))));
26
- const mergeResourceIntoLayer = (layer, { config, ref }) => Layer.merge(layer, Layer.succeed(
27
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
28
- config.resource._tag, ref));
29
- const maybeManagedResourceLayer = Array.match(managedResourceRefs, {
30
- onEmpty: () => Option.none(),
31
- onNonEmpty: refs => Option.some(Array.reduce(refs,
30
+ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscriptions, container, browser: browserConfig, crash, slowView, resources, managedResources, devtools, }) => {
31
+ const resolvedSlowView = pipe(slowView ?? {}, Option.liftPredicate(config => config !== false), Option.filter(config => Match.value(config.show ?? DEFAULT_SLOW_VIEW_SHOW).pipe(Match.when('Always', () => true), Match.when('Development', () => !!import.meta.hot), Match.exhaustive)), Option.map(config => ({
32
+ thresholdMs: config.thresholdMs ?? DEFAULT_SLOW_VIEW_THRESHOLD_MS,
33
+ onSlowView: config.onSlowView ?? defaultSlowViewCallback,
34
+ })));
35
+ return (hmrModel) => Effect.scoped(Effect.gen(function* () {
36
+ const maybeResourceLayer = resources
37
+ ? Option.some(yield* Layer.memoize(resources))
38
+ : Option.none();
39
+ const managedResourceEntries = managedResources
40
+ ? /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
41
+ Record.toEntries(managedResources)
42
+ : [];
43
+ const managedResourceRefs = yield* Effect.forEach(managedResourceEntries, ([_key, config]) => Ref.make(Option.none()).pipe(Effect.map(ref => ({ config, ref }))));
44
+ const mergeResourceIntoLayer = (layer, { config, ref }) => Layer.merge(layer, Layer.succeed(
32
45
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
33
- Layer.empty, mergeResourceIntoLayer)),
34
- });
35
- const provideAllResources = (effect) => {
36
- const withResources = Option.match(maybeResourceLayer, {
37
- onNone: () => effect,
38
- onSome: resourceLayer => Effect.provide(effect, resourceLayer),
39
- });
40
- return Option.match(maybeManagedResourceLayer, {
41
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
42
- onNone: () => withResources,
43
- onSome: managedLayer =>
46
+ config.resource._tag, ref));
47
+ const maybeManagedResourceLayer = Array.match(managedResourceRefs, {
48
+ onEmpty: () => Option.none(),
49
+ onNonEmpty: refs => Option.some(Array.reduce(refs,
44
50
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
45
- Effect.provide(withResources, managedLayer),
51
+ Layer.empty, mergeResourceIntoLayer)),
46
52
  });
47
- };
48
- const flags = yield* resolveFlags;
49
- const modelEquivalence = Schema.equivalence(Model);
50
- const messageQueue = yield* Queue.unbounded();
51
- const enqueueMessage = (message) => Queue.offer(messageQueue, message);
52
- const currentUrl = Option.fromNullable(browserConfig).pipe(Option.flatMap(() => urlFromString(window.location.href)));
53
- const [initModel, initCommands] = Predicate.isNotUndefined(hmrModel)
54
- ? pipe(hmrModel, Schema.decodeUnknownEither(Model), Either.match({
55
- onLeft: () => init(flags, Option.getOrUndefined(currentUrl)),
56
- onRight: restoredModel => [restoredModel, []],
57
- }))
58
- : init(flags, Option.getOrUndefined(currentUrl));
59
- const modelSubscriptionRef = yield* SubscriptionRef.make(initModel);
60
- yield* Effect.forEach(initCommands, command => Effect.forkDaemon(command.pipe(provideAllResources, Effect.flatMap(enqueueMessage))));
61
- if (browserConfig) {
62
- addNavigationEventListeners(messageQueue, browserConfig);
63
- }
64
- const modelRef = yield* Ref.make(initModel);
65
- const maybeCurrentVNodeRef = yield* Ref.make(Option.none());
66
- const maybeRuntimeRef = yield* Ref.make(Option.none());
67
- const maybeDevtoolsStoreRef = yield* Ref.make(Option.none());
68
- const processMessage = (message) => Effect.gen(function* () {
69
- const currentModel = yield* Ref.get(modelRef);
70
- const [nextModel, commands] = update(currentModel, message);
71
- if (currentModel !== nextModel) {
72
- yield* Ref.set(modelRef, nextModel);
73
- const isPaused = yield* pipe(maybeDevtoolsStoreRef, Ref.get, Effect.flatMap(Option.match({
74
- onNone: () => Effect.succeed(false),
75
- onSome: ({ stateRef }) => SubscriptionRef.get(stateRef).pipe(Effect.map(({ isPaused }) => isPaused)),
76
- })));
77
- if (!isPaused) {
78
- yield* render(nextModel);
79
- }
80
- if (!modelEquivalence(currentModel, nextModel)) {
81
- yield* SubscriptionRef.set(modelSubscriptionRef, nextModel);
82
- preserveModel(nextModel);
83
- }
53
+ const provideAllResources = (effect) => {
54
+ const withResources = Option.match(maybeResourceLayer, {
55
+ onNone: () => effect,
56
+ onSome: resourceLayer => Effect.provide(effect, resourceLayer),
57
+ });
58
+ return Option.match(maybeManagedResourceLayer, {
59
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
60
+ onNone: () => withResources,
61
+ onSome: managedLayer =>
62
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
63
+ Effect.provide(withResources, managedLayer),
64
+ });
65
+ };
66
+ const flags = yield* resolveFlags;
67
+ const modelEquivalence = Schema.equivalence(Model);
68
+ const messageQueue = yield* Queue.unbounded();
69
+ const enqueueMessage = (message) => Queue.offer(messageQueue, message);
70
+ const currentUrl = Option.fromNullable(browserConfig).pipe(Option.flatMap(() => urlFromString(window.location.href)));
71
+ const [initModel, initCommands] = Predicate.isNotUndefined(hmrModel)
72
+ ? pipe(hmrModel, Schema.decodeUnknownEither(Model), Either.match({
73
+ onLeft: () => init(flags, Option.getOrUndefined(currentUrl)),
74
+ onRight: restoredModel => [restoredModel, []],
75
+ }))
76
+ : init(flags, Option.getOrUndefined(currentUrl));
77
+ const modelSubscriptionRef = yield* SubscriptionRef.make(initModel);
78
+ yield* Effect.forEach(initCommands, command => Effect.forkDaemon(command.pipe(provideAllResources, Effect.flatMap(enqueueMessage))));
79
+ if (browserConfig) {
80
+ addNavigationEventListeners(messageQueue, browserConfig);
84
81
  }
85
- yield* Effect.forEach(commands, command => Effect.forkDaemon(command.pipe(provideAllResources, Effect.flatMap(enqueueMessage))));
86
- const maybeDevtoolsStore = yield* Ref.get(maybeDevtoolsStoreRef);
87
- yield* Option.match(maybeDevtoolsStore, {
88
- onNone: () => Effect.void,
89
- onSome: store => store.recordMessage(
90
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
91
- message, nextModel, commands.length, !modelEquivalence(currentModel, nextModel)),
82
+ const modelRef = yield* Ref.make(initModel);
83
+ const maybeCurrentVNodeRef = yield* Ref.make(Option.none());
84
+ const currentMessageRef = yield* Ref.make(Option.none());
85
+ const maybeRuntimeRef = yield* Ref.make(Option.none());
86
+ const maybeDevtoolsStoreRef = yield* Ref.make(Option.none());
87
+ const processMessage = (message) => Effect.gen(function* () {
88
+ const currentModel = yield* Ref.get(modelRef);
89
+ const [nextModel, commands] = update(currentModel, message);
90
+ if (currentModel !== nextModel) {
91
+ yield* Ref.set(modelRef, nextModel);
92
+ const isPaused = yield* pipe(maybeDevtoolsStoreRef, Ref.get, Effect.flatMap(Option.match({
93
+ onNone: () => Effect.succeed(false),
94
+ onSome: ({ stateRef }) => SubscriptionRef.get(stateRef).pipe(Effect.map(({ isPaused }) => isPaused)),
95
+ })));
96
+ if (!isPaused) {
97
+ yield* render(nextModel, Option.some(message));
98
+ }
99
+ if (!modelEquivalence(currentModel, nextModel)) {
100
+ yield* SubscriptionRef.set(modelSubscriptionRef, nextModel);
101
+ preserveModel(nextModel);
102
+ }
103
+ }
104
+ yield* Effect.forEach(commands, command => Effect.forkDaemon(command.pipe(provideAllResources, Effect.flatMap(enqueueMessage))));
105
+ const maybeDevtoolsStore = yield* Ref.get(maybeDevtoolsStoreRef);
106
+ yield* Option.match(maybeDevtoolsStore, {
107
+ onNone: () => Effect.void,
108
+ onSome: store => store.recordMessage(
109
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
110
+ message, nextModel, commands.length, !modelEquivalence(currentModel, nextModel)),
111
+ });
92
112
  });
93
- });
94
- const runProcessMessage = (messageEffect) => (runtime) => {
95
- try {
96
- Runtime.runSync(runtime)(messageEffect);
97
- }
98
- catch (error) {
99
- const squashed = Runtime.isFiberFailure(error)
100
- ? Cause.squash(error[Runtime.FiberFailureCauseId])
101
- : error;
102
- const appError = squashed instanceof Error
103
- ? squashed
104
- : new Error(String(squashed));
105
- renderErrorView(appError, errorView, container, maybeCurrentVNodeRef);
113
+ const runProcessMessage = (message, messageEffect) => (runtime) => {
114
+ try {
115
+ Runtime.runSync(runtime, messageEffect);
116
+ }
117
+ catch (error) {
118
+ const squashed = Runtime.isFiberFailure(error)
119
+ ? Cause.squash(error[Runtime.FiberFailureCauseId])
120
+ : error;
121
+ const appError = squashed instanceof Error
122
+ ? squashed
123
+ : new Error(String(squashed));
124
+ const model = Ref.get(modelRef).pipe(Effect.runSync);
125
+ renderCrashView({ error: appError, model, message }, crash, container, maybeCurrentVNodeRef);
126
+ }
127
+ };
128
+ const dispatchSync = (message) => {
129
+ const maybeRuntime = Ref.get(maybeRuntimeRef).pipe(Effect.runSync);
130
+ Option.match(maybeRuntime, {
131
+ onNone: Function.constVoid,
132
+ onSome: runProcessMessage(
133
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
134
+ message,
135
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
136
+ processMessage(message)),
137
+ });
138
+ };
139
+ const dispatchAsync = (message) =>
140
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
141
+ enqueueMessage(message);
142
+ const render = (model, message) => Effect.gen(function* () {
143
+ const viewStart = performance.now();
144
+ const nextVNodeNullish = yield* view(model);
145
+ const viewDuration = performance.now() - viewStart;
146
+ Option.match(resolvedSlowView, {
147
+ onNone: Function.constVoid,
148
+ onSome: ({ thresholdMs, onSlowView }) => {
149
+ if (viewDuration > thresholdMs) {
150
+ onSlowView({
151
+ model,
152
+ message,
153
+ durationMs: viewDuration,
154
+ thresholdMs,
155
+ });
156
+ }
157
+ },
158
+ });
159
+ const maybeCurrentVNode = yield* Ref.get(maybeCurrentVNodeRef);
160
+ const patchedVNode = yield* Effect.sync(() => patchVNode(maybeCurrentVNode, nextVNodeNullish, container));
161
+ yield* Ref.set(maybeCurrentVNodeRef, Option.some(patchedVNode));
162
+ }).pipe(Effect.provideService(Dispatch, {
163
+ dispatchAsync,
164
+ dispatchSync,
165
+ }));
166
+ const runtime = yield* Effect.runtime();
167
+ yield* Ref.set(maybeRuntimeRef, Option.some(runtime));
168
+ const isInIframe = window.self !== window.top;
169
+ const resolvedDevtools = pipe(devtools ?? {}, Option.liftPredicate(config => config !== false), Option.filter(config => Match.value(config.show ?? DEFAULT_DEVTOOLS_SHOW).pipe(Match.when('Always', () => true), Match.when('Development', () => !!import.meta.hot && !isInIframe), Match.exhaustive)), Option.map(config => ({
170
+ position: config.position ?? DEFAULT_DEVTOOLS_POSITION,
171
+ mode: config.mode ?? DEFAULT_DEVTOOLS_MODE,
172
+ maybeBanner: Option.fromNullable(config.banner),
173
+ })));
174
+ if (Option.isSome(resolvedDevtools)) {
175
+ const { position, mode, maybeBanner } = resolvedDevtools.value;
176
+ const devtoolsStore = yield* createDevtoolsStore({
177
+ replay: (model, message) =>
178
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
179
+ Tuple.getFirst(update(model, message)),
180
+ render: model =>
181
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
182
+ render(model, Option.none()),
183
+ getCurrentModel: Ref.get(modelRef),
184
+ });
185
+ yield* Ref.set(maybeDevtoolsStoreRef, Option.some(devtoolsStore));
186
+ yield* devtoolsStore.recordInit(initModel);
187
+ yield* createOverlay(devtoolsStore, position, mode, maybeBanner);
106
188
  }
107
- };
108
- const dispatchSync = (message) => {
109
- const maybeRuntime = Effect.runSync(Ref.get(maybeRuntimeRef));
110
- Option.match(maybeRuntime, {
111
- onNone: Function.constVoid,
112
- onSome: runProcessMessage(
113
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
114
- processMessage(message)),
115
- });
116
- };
117
- const dispatchAsync = (message) =>
118
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
119
- enqueueMessage(message);
120
- const render = (model) => Effect.gen(function* () {
121
- const viewStart = performance.now();
122
- const nextVNodeNullish = yield* view(model);
123
- const viewDuration = performance.now() - viewStart;
124
- if (import.meta.hot &&
125
- slowViewThresholdMs !== false &&
126
- viewDuration > slowViewThresholdMs) {
127
- console.warn(`[foldkit] Slow view: ${viewDuration.toFixed(1)}ms (budget: ${slowViewThresholdMs}ms). Consider moving computation to update or memoizing with createLazy.`);
189
+ yield* render(initModel, Option.none());
190
+ addBfcacheRestoreListener();
191
+ if (subscriptions) {
192
+ yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { schema, modelToDependencies, depsToStream }]) => {
193
+ const modelStream = Stream.concat(Stream.make(initModel), modelSubscriptionRef.changes);
194
+ return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDependencies), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(command => command.pipe(Effect.flatMap(enqueueMessage))), provideAllResources));
195
+ }, {
196
+ concurrency: 'unbounded',
197
+ discard: true,
198
+ }));
128
199
  }
129
- const maybeCurrentVNode = yield* Ref.get(maybeCurrentVNodeRef);
130
- const patchedVNode = yield* Effect.sync(() => patchVNode(maybeCurrentVNode, nextVNodeNullish, container));
131
- yield* Ref.set(maybeCurrentVNodeRef, Option.some(patchedVNode));
132
- }).pipe(Effect.provideService(Dispatch, {
133
- dispatchAsync,
134
- dispatchSync,
135
- }));
136
- const runtime = yield* Effect.runtime();
137
- yield* Ref.set(maybeRuntimeRef, Option.some(runtime));
138
- const show = devtools?.show ?? DEFAULT_DEVTOOLS_SHOW;
139
- const devtoolsPosition = devtools?.position ?? DEFAULT_DEVTOOLS_POSITION;
140
- const devtoolsMode = devtools?.mode ?? DEFAULT_DEVTOOLS_MODE;
141
- const maybeDevtoolsBanner = Option.fromNullable(devtools?.banner);
142
- const isInIframe = window.self !== window.top;
143
- const isDevtoolsEnabled = Match.value(show).pipe(Match.when('Never', () => false), Match.when('Always', () => true), Match.when('Development', () => !!import.meta.hot && !isInIframe), Match.exhaustive);
144
- if (isDevtoolsEnabled) {
145
- const devtoolsStore = yield* createDevtoolsStore({
146
- replay: (model, message) =>
147
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
148
- Tuple.getFirst(update(model, message)),
149
- render: model =>
150
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
151
- render(model),
152
- getCurrentModel: Ref.get(modelRef),
153
- });
154
- yield* Ref.set(maybeDevtoolsStoreRef, Option.some(devtoolsStore));
155
- yield* devtoolsStore.recordInit(initModel);
156
- yield* createOverlay(devtoolsStore, devtoolsPosition, devtoolsMode, maybeDevtoolsBanner);
157
- }
158
- yield* render(initModel);
159
- addBfcacheRestoreListener();
160
- if (subscriptions) {
161
- yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { schema, modelToDependencies, depsToStream }]) => {
200
+ const maybeRequirementsToLifecycle = (config, resourceRef) => (maybeRequirements) => {
201
+ if (Option.isOption(maybeRequirements) &&
202
+ Option.isNone(maybeRequirements)) {
203
+ return Stream.empty;
204
+ }
205
+ const requirements = Option.isOption(maybeRequirements)
206
+ ? Option.getOrThrow(maybeRequirements)
207
+ : maybeRequirements;
208
+ const acquire = Effect.gen(function* () {
209
+ const value = yield* config.acquire(requirements);
210
+ yield* Ref.set(resourceRef, Option.some(value));
211
+ return value;
212
+ });
213
+ const release = (value) => Effect.gen(function* () {
214
+ yield* config.release(value);
215
+ yield* Ref.set(resourceRef, Option.none());
216
+ yield* enqueueMessage(config.onReleased());
217
+ }).pipe(Effect.catchAllCause(() => Effect.void));
218
+ return pipe(Stream.scoped(Effect.acquireRelease(acquire, release)), Stream.flatMap(value => Stream.concat(Stream.make(config.onAcquired(value)), Stream.never)), Stream.map(Effect.succeed), Stream.catchAll(error => Stream.make(Effect.succeed(config.onAcquireError(error)))));
219
+ };
220
+ const forkManagedResourceLifecycle = ({ config, ref: resourceRef, }) => Effect.gen(function* () {
162
221
  const modelStream = Stream.concat(Stream.make(initModel), modelSubscriptionRef.changes);
163
- return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDependencies), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(command => command.pipe(Effect.flatMap(enqueueMessage))), provideAllResources));
164
- }, {
222
+ const equivalence = Schema.equivalence(config.schema);
223
+ yield* Effect.forkDaemon(modelStream.pipe(Stream.map(config.modelToMaybeRequirements), Stream.changesWith(equivalence), Stream.flatMap(maybeRequirementsToLifecycle(config, resourceRef), {
224
+ switch: true,
225
+ }), Stream.runForEach(Effect.flatMap(enqueueMessage))));
226
+ });
227
+ yield* Effect.forEach(managedResourceRefs, forkManagedResourceLifecycle, {
165
228
  concurrency: 'unbounded',
166
229
  discard: true,
167
- }));
168
- }
169
- const maybeRequirementsToLifecycle = (config, resourceRef) => (maybeRequirements) => {
170
- if (Option.isOption(maybeRequirements) &&
171
- Option.isNone(maybeRequirements)) {
172
- return Stream.empty;
173
- }
174
- const requirements = Option.isOption(maybeRequirements)
175
- ? Option.getOrThrow(maybeRequirements)
176
- : maybeRequirements;
177
- const acquire = Effect.gen(function* () {
178
- const value = yield* config.acquire(requirements);
179
- yield* Ref.set(resourceRef, Option.some(value));
180
- return value;
181
230
  });
182
- const release = (value) => Effect.gen(function* () {
183
- yield* config.release(value);
184
- yield* Ref.set(resourceRef, Option.none());
185
- yield* enqueueMessage(config.onReleased());
186
- }).pipe(Effect.catchAllCause(() => Effect.void));
187
- return pipe(Stream.scoped(Effect.acquireRelease(acquire, release)), Stream.flatMap(value => Stream.concat(Stream.make(config.onAcquired(value)), Stream.never)), Stream.map(Effect.succeed), Stream.catchAll(error => Stream.make(Effect.succeed(config.onAcquireError(error)))));
188
- };
189
- const forkManagedResourceLifecycle = ({ config, ref: resourceRef, }) => Effect.gen(function* () {
190
- const modelStream = Stream.concat(Stream.make(initModel), modelSubscriptionRef.changes);
191
- const equivalence = Schema.equivalence(config.schema);
192
- yield* Effect.forkDaemon(modelStream.pipe(Stream.map(config.modelToMaybeRequirements), Stream.changesWith(equivalence), Stream.flatMap(maybeRequirementsToLifecycle(config, resourceRef), {
193
- switch: true,
194
- }), Stream.runForEach(Effect.flatMap(enqueueMessage))));
195
- });
196
- yield* Effect.forEach(managedResourceRefs, forkManagedResourceLifecycle, {
197
- concurrency: 'unbounded',
198
- discard: true,
199
- });
200
- yield* pipe(Effect.forever(Effect.gen(function* () {
201
- const message = yield* Queue.take(messageQueue);
202
- yield* processMessage(message);
203
- })), Effect.catchAllCause(cause => Effect.sync(() => {
204
- const squashed = Cause.squash(cause);
205
- const appError = squashed instanceof Error
206
- ? squashed
207
- : new Error(String(squashed));
208
- renderErrorView(appError, errorView, container, maybeCurrentVNodeRef);
209
- })));
210
- }));
231
+ yield* pipe(Effect.forever(Effect.gen(function* () {
232
+ const message = yield* Queue.take(messageQueue);
233
+ yield* Ref.set(currentMessageRef, Option.some(message));
234
+ yield* processMessage(message);
235
+ })), Effect.catchAllCause(cause => Effect.sync(() => {
236
+ const squashed = Cause.squash(cause);
237
+ const appError = squashed instanceof Error
238
+ ? squashed
239
+ : new Error(String(squashed));
240
+ const model = Ref.get(modelRef).pipe(Effect.runSync);
241
+ const message = Ref.get(currentMessageRef).pipe(Effect.runSync, Option.getOrThrow);
242
+ renderCrashView({ error: appError, model, message }, crash, container, maybeCurrentVNodeRef);
243
+ })));
244
+ }));
245
+ };
211
246
  const patchVNode = (maybeCurrentVNode, nextVNodeNullish, container) => {
212
247
  const nextVNode = Predicate.isNotNull(nextVNodeNullish)
213
248
  ? nextVNodeNullish
@@ -217,21 +252,29 @@ const patchVNode = (maybeCurrentVNode, nextVNodeNullish, container) => {
217
252
  onSome: currentVNode => patch(currentVNode, nextVNode),
218
253
  });
219
254
  };
220
- const renderErrorView = (appError, errorView, container, maybeCurrentVNodeRef) => {
221
- console.error('[foldkit] Application error:', appError);
255
+ const renderCrashView = (context, crash, container, maybeCurrentVNodeRef) => {
256
+ console.error('[foldkit] Application crash:', context.error);
257
+ if (crash?.report) {
258
+ try {
259
+ crash.report(context);
260
+ }
261
+ catch (reportError) {
262
+ console.error('[foldkit] crash.report failed:', reportError);
263
+ }
264
+ }
222
265
  try {
223
- const errorHtml = errorView
224
- ? errorView(appError)
225
- : defaultErrorView(appError);
266
+ const crashHtml = crash?.view
267
+ ? crash.view(context)
268
+ : defaultCrashView(context);
226
269
  const maybeCurrentVNode = Ref.get(maybeCurrentVNodeRef).pipe(Effect.runSync);
227
- const vnode = errorHtml.pipe(Effect.provideService(Dispatch, noOpDispatch), Effect.runSync);
270
+ const vnode = crashHtml.pipe(Effect.provideService(Dispatch, noOpDispatch), Effect.runSync);
228
271
  patchVNode(maybeCurrentVNode, vnode, container);
229
272
  }
230
273
  catch (viewError) {
231
- console.error('[foldkit] Custom errorView failed:', viewError);
274
+ console.error('[foldkit] crash.view failed:', viewError);
232
275
  const maybeCurrentVNode = Ref.get(maybeCurrentVNodeRef).pipe(Effect.runSync);
233
276
  const fallbackViewError = viewError instanceof Error ? viewError : new Error(String(viewError));
234
- const vnode = defaultErrorView(appError, fallbackViewError).pipe(Effect.provideService(Dispatch, noOpDispatch), Effect.runSync);
277
+ const vnode = defaultCrashView(context, fallbackViewError).pipe(Effect.provideService(Dispatch, noOpDispatch), Effect.runSync);
235
278
  patchVNode(maybeCurrentVNode, vnode, container);
236
279
  }
237
280
  };
@@ -242,9 +285,9 @@ export function makeElement(config) {
242
285
  view: config.view,
243
286
  ...(config.subscriptions && { subscriptions: config.subscriptions }),
244
287
  container: config.container,
245
- ...(config.errorView && { errorView: config.errorView }),
246
- ...(Predicate.isNotUndefined(config.slowViewThresholdMs) && {
247
- slowViewThresholdMs: config.slowViewThresholdMs,
288
+ ...(config.crash && { crash: config.crash }),
289
+ ...(Predicate.isNotUndefined(config.slowView) && {
290
+ slowView: config.slowView,
248
291
  }),
249
292
  ...(config.resources && { resources: config.resources }),
250
293
  ...(config.managedResources && {
@@ -284,9 +327,9 @@ export function makeApplication(config) {
284
327
  ...(config.subscriptions && { subscriptions: config.subscriptions }),
285
328
  container: config.container,
286
329
  browser: config.browser,
287
- ...(config.errorView && { errorView: config.errorView }),
288
- ...(Predicate.isNotUndefined(config.slowViewThresholdMs) && {
289
- slowViewThresholdMs: config.slowViewThresholdMs,
330
+ ...(config.crash && { crash: config.crash }),
331
+ ...(Predicate.isNotUndefined(config.slowView) && {
332
+ slowView: config.slowView,
290
333
  }),
291
334
  ...(config.resources && { resources: config.resources }),
292
335
  ...(config.managedResources && {
@@ -322,13 +365,28 @@ const preserveModel = (model) => {
322
365
  import.meta.hot.send('foldkit:preserve-model', model);
323
366
  }
324
367
  };
368
+ const PLUGIN_RESPONSE_TIMEOUT_MS = 500;
325
369
  /** Starts a Foldkit runtime, with HMR support for development. */
326
370
  export const run = (foldkitRuntime) => {
327
371
  if (import.meta.hot) {
328
- import.meta.hot.on('foldkit:restore-model', model => {
329
- BrowserRuntime.runMain(foldkitRuntime(model));
330
- });
331
- import.meta.hot.send('foldkit:request-model');
372
+ const hot = import.meta.hot;
373
+ const requestPreservedModel = pipe(Effect.async(resume => {
374
+ hot.on('foldkit:restore-model', model => {
375
+ resume(Effect.succeed(model));
376
+ });
377
+ hot.send('foldkit:request-model');
378
+ }), Effect.timeoutTo({
379
+ onTimeout: () => {
380
+ console.warn('[foldkit] No response from vite-plugin-foldkit. Add it to your vite.config.ts for HMR model preservation:\n\n' +
381
+ " import foldkit from 'vite-plugin-foldkit'\n\n" +
382
+ ' export default defineConfig({ plugins: [foldkit()] })\n\n' +
383
+ 'Starting without HMR support.');
384
+ return undefined;
385
+ },
386
+ onSuccess: Function.identity,
387
+ duration: PLUGIN_RESPONSE_TIMEOUT_MS,
388
+ }), Effect.flatMap(foldkitRuntime));
389
+ BrowserRuntime.runMain(requestPreservedModel);
332
390
  }
333
391
  else {
334
392
  BrowserRuntime.runMain(foldkitRuntime());
@@ -98,27 +98,28 @@ export declare const UpdatedInputValue: import("../../schema").CallableTaggedStr
98
98
  /** Sent when the optional toggle button is clicked. */
99
99
  export declare const PressedToggleButton: import("../../schema").CallableTaggedStruct<"PressedToggleButton", {}>;
100
100
  /** Union of all messages the combobox component can produce. */
101
- export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"Opened", {
102
- maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
103
- }>, import("../../schema").CallableTaggedStruct<"Closed", {}>, import("../../schema").CallableTaggedStruct<"ClosedByTab", {}>, import("../../schema").CallableTaggedStruct<"ActivatedItem", {
104
- index: typeof S.Number;
105
- activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
106
- maybeImmediateSelection: S.OptionFromSelf<S.Struct<{
107
- item: typeof S.String;
108
- displayText: typeof S.String;
109
- }>>;
110
- }>, import("../../schema").CallableTaggedStruct<"DeactivatedItem", {}>, import("../../schema").CallableTaggedStruct<"SelectedItem", {
111
- item: typeof S.String;
112
- displayText: typeof S.String;
113
- }>, import("../../schema").CallableTaggedStruct<"MovedPointerOverItem", {
114
- index: typeof S.Number;
115
- screenX: typeof S.Number;
116
- screenY: typeof S.Number;
117
- }>, import("../../schema").CallableTaggedStruct<"RequestedItemClick", {
118
- index: typeof S.Number;
119
- }>, import("../../schema").CallableTaggedStruct<"CompletedScrollLock", {}>, import("../../schema").CallableTaggedStruct<"CompletedScrollUnlock", {}>, import("../../schema").CallableTaggedStruct<"CompletedInertSetup", {}>, import("../../schema").CallableTaggedStruct<"CompletedInertTeardown", {}>, import("../../schema").CallableTaggedStruct<"CompletedInputFocus", {}>, import("../../schema").CallableTaggedStruct<"CompletedScrollIntoView", {}>, import("../../schema").CallableTaggedStruct<"CompletedItemClick", {}>, import("../../schema").CallableTaggedStruct<"AdvancedTransitionFrame", {}>, import("../../schema").CallableTaggedStruct<"EndedTransition", {}>, import("../../schema").CallableTaggedStruct<"DetectedInputMovement", {}>, import("../../schema").CallableTaggedStruct<"UpdatedInputValue", {
120
- value: typeof S.String;
121
- }>, import("../../schema").CallableTaggedStruct<"PressedToggleButton", {}>]>;
101
+ export declare const Message: S.Union<[
102
+ typeof Opened,
103
+ typeof Closed,
104
+ typeof ClosedByTab,
105
+ typeof ActivatedItem,
106
+ typeof DeactivatedItem,
107
+ typeof SelectedItem,
108
+ typeof MovedPointerOverItem,
109
+ typeof RequestedItemClick,
110
+ typeof CompletedScrollLock,
111
+ typeof CompletedScrollUnlock,
112
+ typeof CompletedInertSetup,
113
+ typeof CompletedInertTeardown,
114
+ typeof CompletedInputFocus,
115
+ typeof CompletedScrollIntoView,
116
+ typeof CompletedItemClick,
117
+ typeof AdvancedTransitionFrame,
118
+ typeof EndedTransition,
119
+ typeof DetectedInputMovement,
120
+ typeof UpdatedInputValue,
121
+ typeof PressedToggleButton
122
+ ]>;
122
123
  export type Opened = typeof Opened.Type;
123
124
  export type Closed = typeof Closed.Type;
124
125
  export type ClosedByTab = typeof ClosedByTab.Type;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/shared.ts"],"names":[],"mappings":"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"}