@kontsedal/olas-core 0.0.1-rc.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/index.cjs +363 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +178 -0
  6. package/dist/index.d.cts.map +1 -0
  7. package/dist/index.d.mts +178 -0
  8. package/dist/index.d.mts.map +1 -0
  9. package/dist/index.mjs +339 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/dist/root-BImHnGj1.mjs +3270 -0
  12. package/dist/root-BImHnGj1.mjs.map +1 -0
  13. package/dist/root-Bazp5_Ik.cjs +3347 -0
  14. package/dist/root-Bazp5_Ik.cjs.map +1 -0
  15. package/dist/testing.cjs +81 -0
  16. package/dist/testing.cjs.map +1 -0
  17. package/dist/testing.d.cts +56 -0
  18. package/dist/testing.d.cts.map +1 -0
  19. package/dist/testing.d.mts +56 -0
  20. package/dist/testing.d.mts.map +1 -0
  21. package/dist/testing.mjs +78 -0
  22. package/dist/testing.mjs.map +1 -0
  23. package/dist/types-CAMgqCMz.d.mts +816 -0
  24. package/dist/types-CAMgqCMz.d.mts.map +1 -0
  25. package/dist/types-emq_lZd7.d.cts +816 -0
  26. package/dist/types-emq_lZd7.d.cts.map +1 -0
  27. package/package.json +47 -0
  28. package/src/__dev__.d.ts +8 -0
  29. package/src/controller/define.ts +50 -0
  30. package/src/controller/index.ts +12 -0
  31. package/src/controller/instance.ts +499 -0
  32. package/src/controller/root.ts +160 -0
  33. package/src/controller/types.ts +195 -0
  34. package/src/devtools.ts +0 -0
  35. package/src/emitter.ts +79 -0
  36. package/src/errors.ts +49 -0
  37. package/src/forms/field.ts +303 -0
  38. package/src/forms/form-types.ts +130 -0
  39. package/src/forms/form.ts +640 -0
  40. package/src/forms/index.ts +2 -0
  41. package/src/forms/types.ts +1 -0
  42. package/src/forms/validators.ts +70 -0
  43. package/src/index.ts +89 -0
  44. package/src/query/client.ts +934 -0
  45. package/src/query/define.ts +154 -0
  46. package/src/query/entry.ts +322 -0
  47. package/src/query/focus-online.ts +73 -0
  48. package/src/query/index.ts +3 -0
  49. package/src/query/infinite.ts +462 -0
  50. package/src/query/keys.ts +33 -0
  51. package/src/query/local.ts +113 -0
  52. package/src/query/mutation.ts +384 -0
  53. package/src/query/plugin.ts +135 -0
  54. package/src/query/types.ts +168 -0
  55. package/src/query/use.ts +321 -0
  56. package/src/scope.ts +42 -0
  57. package/src/selection.ts +146 -0
  58. package/src/signals/index.ts +3 -0
  59. package/src/signals/readonly.ts +22 -0
  60. package/src/signals/runtime.ts +115 -0
  61. package/src/signals/types.ts +31 -0
  62. package/src/testing.ts +142 -0
  63. package/src/timing/debounced.ts +32 -0
  64. package/src/timing/index.ts +2 -0
  65. package/src/timing/throttled.ts +46 -0
  66. package/src/utils.ts +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-emq_lZd7.d.cts","names":[],"sources":["../src/emitter.ts","../src/errors.ts","../src/signals/types.ts","../src/forms/types.ts","../src/forms/form-types.ts","../src/query/types.ts","../src/query/infinite.ts","../src/devtools.ts","../src/query/mutation.ts","../src/query/plugin.ts","../src/scope.ts","../src/controller/types.ts"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@kontsedal/olas-core",
3
+ "version": "0.0.1-rc.0",
4
+ "description": "Olas core — controller tree, signals, queries, mutations, forms",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.cts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.mts",
14
+ "default": "./dist/index.mjs"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.cts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ },
21
+ "./testing": {
22
+ "import": {
23
+ "types": "./dist/testing.d.mts",
24
+ "default": "./dist/testing.mjs"
25
+ },
26
+ "require": {
27
+ "types": "./dist/testing.d.cts",
28
+ "default": "./dist/testing.cjs"
29
+ }
30
+ }
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "src"
35
+ ],
36
+ "sideEffects": false,
37
+ "peerDependencies": {
38
+ "@preact/signals-core": "^1.8.0"
39
+ },
40
+ "devDependencies": {
41
+ "@preact/signals-core": "^1.14.2"
42
+ },
43
+ "scripts": {
44
+ "build": "tsdown",
45
+ "typecheck": "tsc --noEmit"
46
+ }
47
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Compile-time build flag. Substituted by tsdown's `define:` at bundle time
3
+ * — `JSON.stringify(process.env.NODE_ENV !== 'production')`. The published
4
+ * production `.mjs`/`.cjs` artefacts inline `false` here and the bundler's
5
+ * dead-code elimination drops the wrapped emit sites entirely. Under vitest
6
+ * the root `vitest.config.ts` substitutes `true`. See SPEC §23.x.
7
+ */
8
+ declare const __DEV__: boolean
@@ -0,0 +1,50 @@
1
+ import type { ControllerDef, Ctx } from './types'
2
+
3
+ type InternalControllerDef<Props, Api> = ControllerDef<Props, Api> & {
4
+ readonly __factory: (ctx: Ctx, props: Props) => Api
5
+ readonly __name?: string
6
+ }
7
+
8
+ /** Optional configuration for `defineController`. */
9
+ export type DefineControllerOptions = {
10
+ /**
11
+ * A short, human-readable name for this controller — used in the devtools
12
+ * tree, `controller:*` events, and error contexts (e.g. `["root","board[0]"]`).
13
+ *
14
+ * When omitted, the runtime falls back to `factory.name` (the JS-inferred
15
+ * function name) or `"anonymous"` for arrow-function factories defined
16
+ * inline. Naming is strongly recommended in app code.
17
+ */
18
+ name?: string
19
+ }
20
+
21
+ /**
22
+ * Create a controller definition. The factory is stored on the returned object
23
+ * and invoked during `createRoot` / `ctx.child` to build instances.
24
+ *
25
+ * `Props` defaults to `void` so a factory written as `(ctx) => ...` is typed
26
+ * as `ControllerDef<void, Api>` — the form `createRoot` requires.
27
+ */
28
+ export function defineController<Props = void, Api = unknown>(
29
+ factory: (ctx: Ctx, props: Props) => Api,
30
+ options?: DefineControllerOptions,
31
+ ): ControllerDef<Props, Api> {
32
+ const def: InternalControllerDef<Props, Api> = {
33
+ __olas: 'controller',
34
+ __factory: factory,
35
+ ...(options?.name !== undefined ? { __name: options.name } : {}),
36
+ } as InternalControllerDef<Props, Api>
37
+ return def
38
+ }
39
+
40
+ /** Internal — extracts the factory from a ControllerDef. */
41
+ export function getFactory<Props, Api>(
42
+ def: ControllerDef<Props, Api>,
43
+ ): (ctx: Ctx, props: Props) => Api {
44
+ return (def as InternalControllerDef<Props, Api>).__factory
45
+ }
46
+
47
+ /** Internal — extracts the explicit `name` option from a ControllerDef, if any. */
48
+ export function getName<Props, Api>(def: ControllerDef<Props, Api>): string | undefined {
49
+ return (def as InternalControllerDef<Props, Api>).__name
50
+ }
@@ -0,0 +1,12 @@
1
+ export { defineController } from './define'
2
+ export { createRoot, createRootWithProps } from './root'
3
+ export type {
4
+ AmbientDeps,
5
+ ControllerDef,
6
+ CtrlApi,
7
+ CtrlProps,
8
+ Ctx,
9
+ Field,
10
+ Root,
11
+ RootOptions,
12
+ } from './types'
@@ -0,0 +1,499 @@
1
+ import type { DevtoolsEmitter } from '../devtools'
2
+ import { createEmitter, type Emitter } from '../emitter'
3
+ import { dispatchError, type ErrorHandler } from '../errors'
4
+ import { bindFieldDevtoolsOwner, createField } from '../forms/field'
5
+ import { bindTreeToDevtools, createFieldArray, createForm } from '../forms/form'
6
+ import type {
7
+ FieldArray,
8
+ FieldArrayOptions,
9
+ Form,
10
+ FormOptions,
11
+ FormSchema,
12
+ ItemInitial,
13
+ } from '../forms/form-types'
14
+ import type { Validator } from '../forms/types'
15
+ import type { QueryClient } from '../query/client'
16
+ import type { InfiniteQuery } from '../query/infinite'
17
+ import { createLocalCache, type LocalCacheOptions } from '../query/local'
18
+ import { createMutation, type Mutation, type MutationSpec } from '../query/mutation'
19
+ import type { LocalCache, Query } from '../query/types'
20
+ import { createInfiniteUse, createUse } from '../query/use'
21
+ import type { Scope } from '../scope'
22
+ import { effect as standaloneEffect } from '../signals'
23
+ import { getFactory, getName } from './define'
24
+ import type { ControllerDef, Ctx, Field } from './types'
25
+
26
+ export type RootShared = {
27
+ readonly devtools: DevtoolsEmitter
28
+ readonly onError: ErrorHandler | undefined
29
+ readonly queryClient: QueryClient
30
+ }
31
+
32
+ type LifecycleEntry =
33
+ | {
34
+ kind: 'effect'
35
+ factory: () => void | (() => void)
36
+ dispose: (() => void) | null
37
+ }
38
+ | { kind: 'cleanup'; dispose: () => void }
39
+ | { kind: 'child'; instance: ControllerInstance }
40
+ | { kind: 'onDispose'; fn: () => void }
41
+ | { kind: 'onSuspend'; fn: () => void }
42
+ | { kind: 'onResume'; fn: () => void }
43
+ | { kind: 'subscription'; unsubscribe: () => void }
44
+
45
+ type State = 'constructing' | 'active' | 'suspended' | 'disposed'
46
+
47
+ export class ControllerInstance {
48
+ readonly path: readonly string[]
49
+ readonly deps: Record<string, unknown>
50
+
51
+ private state: State = 'constructing'
52
+ private readonly entries: LifecycleEntry[] = []
53
+ private readonly rootShared: RootShared
54
+ private readonly parent: ControllerInstance | null
55
+ private childCounter = 0
56
+ /** Scope values provided on this instance, keyed by `Scope.__id`. */
57
+ private scopes: Map<symbol, unknown> | null = null
58
+
59
+ constructor(
60
+ parent: ControllerInstance | null,
61
+ rootShared: RootShared,
62
+ pathSegment: string,
63
+ deps: Record<string, unknown>,
64
+ ) {
65
+ this.parent = parent
66
+ this.rootShared = rootShared
67
+ this.path = parent ? [...parent.path, pathSegment] : [pathSegment]
68
+ this.deps = deps
69
+ }
70
+
71
+ /**
72
+ * Run the factory and produce an api. On throw, the partially-constructed
73
+ * state is rolled back (entries disposed in reverse) and the error is rethrown.
74
+ */
75
+ construct<Props, Api>(factory: (ctx: Ctx, props: Props) => Api, props: Props): Api {
76
+ const ctx = this.buildCtx()
77
+ let api: Api
78
+ try {
79
+ api = factory(ctx, props)
80
+ } catch (err) {
81
+ this.rollbackPartialConstruction()
82
+ throw err
83
+ }
84
+ this.state = 'active'
85
+ if (__DEV__) {
86
+ this.rootShared.devtools.emit({
87
+ type: 'controller:constructed',
88
+ path: this.path,
89
+ props: props as unknown,
90
+ })
91
+ }
92
+ return api
93
+ }
94
+
95
+ private rollbackPartialConstruction(): void {
96
+ // Tear down what was built before the throw, in reverse order.
97
+ for (let i = this.entries.length - 1; i >= 0; i--) {
98
+ const entry = this.entries[i]
99
+ if (!entry) continue
100
+ try {
101
+ this.disposeEntry(entry)
102
+ } catch {
103
+ // Rollback paths can't throw further.
104
+ }
105
+ }
106
+ this.entries.length = 0
107
+ this.state = 'disposed'
108
+ }
109
+
110
+ dispose(): void {
111
+ if (this.state === 'disposed') return
112
+ const wasSuspended = this.state === 'suspended'
113
+ this.state = 'disposed'
114
+
115
+ for (let i = this.entries.length - 1; i >= 0; i--) {
116
+ const entry = this.entries[i]
117
+ if (!entry) continue
118
+ try {
119
+ this.disposeEntry(entry)
120
+ } catch (err) {
121
+ dispatchError(this.rootShared.onError, err, {
122
+ kind: 'effect',
123
+ controllerPath: this.path,
124
+ })
125
+ }
126
+ }
127
+ this.entries.length = 0
128
+ this.scopes = null
129
+
130
+ if (__DEV__) {
131
+ this.rootShared.devtools.emit({ type: 'controller:disposed', path: this.path })
132
+ }
133
+ // Silence "unused" — `wasSuspended` may inform future logic; intentionally a no-op for now.
134
+ void wasSuspended
135
+ }
136
+
137
+ private disposeEntry(entry: LifecycleEntry): void {
138
+ switch (entry.kind) {
139
+ case 'effect':
140
+ entry.dispose?.()
141
+ entry.dispose = null
142
+ break
143
+ case 'cleanup':
144
+ entry.dispose()
145
+ break
146
+ case 'child':
147
+ entry.instance.dispose()
148
+ break
149
+ case 'subscription':
150
+ entry.unsubscribe()
151
+ break
152
+ case 'onDispose':
153
+ entry.fn()
154
+ break
155
+ case 'onSuspend':
156
+ case 'onResume':
157
+ // No work on dispose.
158
+ break
159
+ }
160
+ }
161
+
162
+ suspend(): void {
163
+ if (this.state !== 'active') return
164
+ this.state = 'suspended'
165
+
166
+ for (let i = this.entries.length - 1; i >= 0; i--) {
167
+ const entry = this.entries[i]
168
+ if (!entry) continue
169
+ try {
170
+ switch (entry.kind) {
171
+ case 'effect':
172
+ entry.dispose?.()
173
+ entry.dispose = null
174
+ break
175
+ case 'child':
176
+ entry.instance.suspend()
177
+ break
178
+ case 'onSuspend':
179
+ entry.fn()
180
+ break
181
+ default:
182
+ break
183
+ }
184
+ } catch (err) {
185
+ dispatchError(this.rootShared.onError, err, {
186
+ kind: 'effect',
187
+ controllerPath: this.path,
188
+ })
189
+ }
190
+ }
191
+
192
+ if (__DEV__) {
193
+ this.rootShared.devtools.emit({ type: 'controller:suspended', path: this.path })
194
+ }
195
+ }
196
+
197
+ resume(): void {
198
+ if (this.state !== 'suspended') return
199
+ this.state = 'active'
200
+
201
+ for (const entry of this.entries) {
202
+ try {
203
+ switch (entry.kind) {
204
+ case 'effect':
205
+ entry.dispose = standaloneEffect(entry.factory)
206
+ break
207
+ case 'child':
208
+ entry.instance.resume()
209
+ break
210
+ case 'onResume':
211
+ entry.fn()
212
+ break
213
+ default:
214
+ break
215
+ }
216
+ } catch (err) {
217
+ dispatchError(this.rootShared.onError, err, {
218
+ kind: 'effect',
219
+ controllerPath: this.path,
220
+ })
221
+ }
222
+ }
223
+
224
+ if (__DEV__) {
225
+ this.rootShared.devtools.emit({ type: 'controller:resumed', path: this.path })
226
+ }
227
+ }
228
+
229
+ // --- Ctx surface --------------------------------------------------------
230
+
231
+ private buildCtx(): Ctx {
232
+ const self = this
233
+ const ctx: Ctx = {
234
+ get deps() {
235
+ return self.deps
236
+ },
237
+
238
+ effect(fn) {
239
+ if (self.isTerminal()) return
240
+ const entry: LifecycleEntry = {
241
+ kind: 'effect',
242
+ factory: () => fn(),
243
+ dispose: null,
244
+ }
245
+ // Wrap with error reporting so an effect throw goes through onError.
246
+ const wrapped = (): void | (() => void) => {
247
+ try {
248
+ return fn()
249
+ } catch (err) {
250
+ dispatchError(self.rootShared.onError, err, {
251
+ kind: 'effect',
252
+ controllerPath: self.path,
253
+ })
254
+ return undefined
255
+ }
256
+ }
257
+ entry.factory = wrapped
258
+ entry.dispose = standaloneEffect(wrapped)
259
+ self.entries.push(entry)
260
+ },
261
+
262
+ cache<T>(
263
+ fetcher: (signal: AbortSignal) => Promise<T>,
264
+ options?: LocalCacheOptions<T>,
265
+ ): LocalCache<T> {
266
+ const cache = createLocalCache<T>(fetcher, options)
267
+ self.entries.push({ kind: 'cleanup', dispose: () => cache.dispose() })
268
+ return cache
269
+ },
270
+
271
+ use(query: any, keyOrOptions?: any): any {
272
+ const brand = (query as { __olas?: string }).__olas
273
+ if (brand === 'infiniteQuery') {
274
+ const { subscription, dispose: d } = createInfiniteUse(
275
+ self.rootShared.queryClient,
276
+ query as InfiniteQuery<unknown[], unknown, unknown>,
277
+ keyOrOptions,
278
+ )
279
+ self.entries.push({ kind: 'cleanup', dispose: d })
280
+ return subscription
281
+ }
282
+ const { subscription, dispose: d } = createUse(
283
+ self.rootShared.queryClient,
284
+ query as Query<unknown[], unknown>,
285
+ keyOrOptions,
286
+ )
287
+ self.entries.push({ kind: 'cleanup', dispose: d })
288
+ return subscription
289
+ },
290
+
291
+ mutation<V, R>(spec: MutationSpec<V, R>): Mutation<V, R> {
292
+ const m = createMutation<V, R>(
293
+ spec,
294
+ self.rootShared.onError,
295
+ self.path,
296
+ self.rootShared.queryClient.mutationsInflight$,
297
+ self.rootShared.devtools,
298
+ )
299
+ self.entries.push({ kind: 'cleanup', dispose: () => m.dispose() })
300
+ return m
301
+ },
302
+
303
+ emitter<T>(): Emitter<T> {
304
+ const e = createEmitter<T>()
305
+ self.entries.push({ kind: 'cleanup', dispose: () => e.dispose() })
306
+ return e
307
+ },
308
+
309
+ field<T>(initial: T, validators?: ReadonlyArray<Validator<T>>): Field<T> {
310
+ const f = createField(initial, validators)
311
+ self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })
312
+ // Standalone fields (not inside a form) still publish field:validated
313
+ // events. Use the controller path with field name "(field)" — the
314
+ // devtools panel groups by path so this is fine.
315
+ bindFieldDevtoolsOwner(f, {
316
+ controllerPath: self.path,
317
+ fieldName: '(field)',
318
+ emitter: self.rootShared.devtools,
319
+ })
320
+ return f
321
+ },
322
+
323
+ form<S extends FormSchema>(schema: S, options?: FormOptions<S>): Form<S> {
324
+ const f = createForm(schema, options)
325
+ self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })
326
+ // Make every leaf field publish `field:validated` to the devtools bus
327
+ // with its key path inside the form. See spec §20.9.
328
+ const stop = bindTreeToDevtools(
329
+ f as unknown as Form<FormSchema>,
330
+ '',
331
+ self.path,
332
+ self.rootShared.devtools,
333
+ )
334
+ self.entries.push({ kind: 'cleanup', dispose: stop })
335
+ return f
336
+ },
337
+
338
+ fieldArray<I extends Field<any> | Form<any>>(
339
+ itemFactory: (initial?: ItemInitial<I>) => I,
340
+ options?: FieldArrayOptions<I>,
341
+ ): FieldArray<I> {
342
+ const fa = createFieldArray<I>(itemFactory, options)
343
+ self.entries.push({ kind: 'cleanup', dispose: () => fa.dispose() })
344
+ const stop = bindTreeToDevtools(
345
+ fa as unknown as FieldArray<Field<unknown> | Form<FormSchema>>,
346
+ '',
347
+ self.path,
348
+ self.rootShared.devtools,
349
+ )
350
+ self.entries.push({ kind: 'cleanup', dispose: stop })
351
+ return fa
352
+ },
353
+
354
+ provide<T>(scope: Scope<T>, value: T): void {
355
+ if (self.scopes === null) self.scopes = new Map()
356
+ self.scopes.set(scope.__id, value)
357
+ },
358
+
359
+ inject<T>(scope: Scope<T>): T {
360
+ let node: ControllerInstance | null = self
361
+ while (node !== null) {
362
+ const map = node.scopes
363
+ if (map?.has(scope.__id)) {
364
+ return map.get(scope.__id) as T
365
+ }
366
+ node = node.parent
367
+ }
368
+ if (scope.hasDefault) return scope.default as T
369
+ const label = scope.name ?? scope.__id.description ?? 'unnamed'
370
+ throw new Error(
371
+ `[olas] ctx.inject(): no provider for scope '${label}' and no default. Provide it on an ancestor via ctx.provide(${label}, ...) or pass a default to defineScope.`,
372
+ )
373
+ },
374
+
375
+ on<T>(emitter: Emitter<T>, handler: (value: T) => void): void {
376
+ const wrapped = (value: T) => {
377
+ try {
378
+ handler(value)
379
+ } catch (err) {
380
+ dispatchError(self.rootShared.onError, err, {
381
+ kind: 'emitter',
382
+ controllerPath: self.path,
383
+ })
384
+ }
385
+ }
386
+ const unsubscribe = emitter.on(wrapped)
387
+ self.entries.push({ kind: 'subscription', unsubscribe })
388
+ },
389
+
390
+ child<Props, Api>(
391
+ def: ControllerDef<Props, Api>,
392
+ props: Props,
393
+ options?: { deps?: Partial<Record<string, unknown>> },
394
+ ): Api {
395
+ const segment = self.makeChildSegment(getFactory(def), getName(def))
396
+ const override = options?.deps
397
+ const childDeps = override !== undefined ? { ...self.deps, ...override } : self.deps
398
+ const childInstance = new ControllerInstance(self, self.rootShared, segment, childDeps)
399
+ // child.construct() rolls back its own partial state on throw; we let
400
+ // the throw propagate so the parent's rollback handles cleanup.
401
+ const api = childInstance.construct(getFactory(def), props)
402
+ self.entries.push({ kind: 'child', instance: childInstance })
403
+ return api
404
+ },
405
+
406
+ attach<Props, Api>(
407
+ def: ControllerDef<Props, Api>,
408
+ props: Props,
409
+ options?: { deps?: Partial<Record<string, unknown>> },
410
+ ): { api: Api; dispose: () => void } {
411
+ const segment = self.makeChildSegment(getFactory(def), getName(def))
412
+ const override = options?.deps
413
+ const childDeps = override !== undefined ? { ...self.deps, ...override } : self.deps
414
+ const childInstance = new ControllerInstance(self, self.rootShared, segment, childDeps)
415
+ const api = childInstance.construct(getFactory(def), props)
416
+ const entry: LifecycleEntry = { kind: 'child', instance: childInstance }
417
+ self.entries.push(entry)
418
+ let disposed = false
419
+ return {
420
+ api,
421
+ dispose: () => {
422
+ if (disposed) return
423
+ disposed = true
424
+ const idx = self.entries.indexOf(entry)
425
+ if (idx >= 0) self.entries.splice(idx, 1)
426
+ try {
427
+ childInstance.dispose()
428
+ } catch (err) {
429
+ dispatchError(self.rootShared.onError, err, {
430
+ kind: 'effect',
431
+ controllerPath: self.path,
432
+ })
433
+ }
434
+ },
435
+ }
436
+ },
437
+
438
+ onDispose(fn) {
439
+ self.entries.push({
440
+ kind: 'onDispose',
441
+ fn: () => {
442
+ try {
443
+ fn()
444
+ } catch (err) {
445
+ dispatchError(self.rootShared.onError, err, {
446
+ kind: 'effect',
447
+ controllerPath: self.path,
448
+ })
449
+ }
450
+ },
451
+ })
452
+ },
453
+
454
+ onSuspend(fn) {
455
+ self.entries.push({
456
+ kind: 'onSuspend',
457
+ fn: () => {
458
+ try {
459
+ fn()
460
+ } catch (err) {
461
+ dispatchError(self.rootShared.onError, err, {
462
+ kind: 'effect',
463
+ controllerPath: self.path,
464
+ })
465
+ }
466
+ },
467
+ })
468
+ },
469
+
470
+ onResume(fn) {
471
+ self.entries.push({
472
+ kind: 'onResume',
473
+ fn: () => {
474
+ try {
475
+ fn()
476
+ } catch (err) {
477
+ dispatchError(self.rootShared.onError, err, {
478
+ kind: 'effect',
479
+ controllerPath: self.path,
480
+ })
481
+ }
482
+ },
483
+ })
484
+ },
485
+ }
486
+ return ctx
487
+ }
488
+
489
+ private isTerminal(): boolean {
490
+ return this.state === 'disposed'
491
+ }
492
+
493
+ // biome-ignore lint/complexity/noBannedTypes: Function is the precise type for "any function with a .name"
494
+ private makeChildSegment(factory: Function, explicitName: string | undefined): string {
495
+ const idx = this.childCounter++
496
+ const base = explicitName ?? factory.name ?? ''
497
+ return `${base !== '' ? base : 'anonymous'}[${idx}]`
498
+ }
499
+ }