@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.
- package/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/index.cjs +363 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +178 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +178 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +339 -0
- package/dist/index.mjs.map +1 -0
- package/dist/root-BImHnGj1.mjs +3270 -0
- package/dist/root-BImHnGj1.mjs.map +1 -0
- package/dist/root-Bazp5_Ik.cjs +3347 -0
- package/dist/root-Bazp5_Ik.cjs.map +1 -0
- package/dist/testing.cjs +81 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +56 -0
- package/dist/testing.d.cts.map +1 -0
- package/dist/testing.d.mts +56 -0
- package/dist/testing.d.mts.map +1 -0
- package/dist/testing.mjs +78 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/types-CAMgqCMz.d.mts +816 -0
- package/dist/types-CAMgqCMz.d.mts.map +1 -0
- package/dist/types-emq_lZd7.d.cts +816 -0
- package/dist/types-emq_lZd7.d.cts.map +1 -0
- package/package.json +47 -0
- package/src/__dev__.d.ts +8 -0
- package/src/controller/define.ts +50 -0
- package/src/controller/index.ts +12 -0
- package/src/controller/instance.ts +499 -0
- package/src/controller/root.ts +160 -0
- package/src/controller/types.ts +195 -0
- package/src/devtools.ts +0 -0
- package/src/emitter.ts +79 -0
- package/src/errors.ts +49 -0
- package/src/forms/field.ts +303 -0
- package/src/forms/form-types.ts +130 -0
- package/src/forms/form.ts +640 -0
- package/src/forms/index.ts +2 -0
- package/src/forms/types.ts +1 -0
- package/src/forms/validators.ts +70 -0
- package/src/index.ts +89 -0
- package/src/query/client.ts +934 -0
- package/src/query/define.ts +154 -0
- package/src/query/entry.ts +322 -0
- package/src/query/focus-online.ts +73 -0
- package/src/query/index.ts +3 -0
- package/src/query/infinite.ts +462 -0
- package/src/query/keys.ts +33 -0
- package/src/query/local.ts +113 -0
- package/src/query/mutation.ts +384 -0
- package/src/query/plugin.ts +135 -0
- package/src/query/types.ts +168 -0
- package/src/query/use.ts +321 -0
- package/src/scope.ts +42 -0
- package/src/selection.ts +146 -0
- package/src/signals/index.ts +3 -0
- package/src/signals/readonly.ts +22 -0
- package/src/signals/runtime.ts +115 -0
- package/src/signals/types.ts +31 -0
- package/src/testing.ts +142 -0
- package/src/timing/debounced.ts +32 -0
- package/src/timing/index.ts +2 -0
- package/src/timing/throttled.ts +46 -0
- 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
|
+
}
|
package/src/__dev__.d.ts
ADDED
|
@@ -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,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
|
+
}
|