refactor(loader): resolve config after injected services
This commit is contained in:
23
vendor/loader/src/index.ts
vendored
23
vendor/loader/src/index.ts
vendored
@@ -1,9 +1,16 @@
|
||||
import { Context, Inject, Service } from '@deepseek-ai/cordis'
|
||||
import { Context, FiberState, Inject, Service, type Fiber } from '@deepseek-ai/cordis'
|
||||
import { defineProperty, isNullable, type Dict } from '@deepseek-ai/cosmokit'
|
||||
import { ModuleLoader } from './internal.ts'
|
||||
import { Entry, type EntryOptions } from './config/entry.ts'
|
||||
import {
|
||||
Entry,
|
||||
EntryConfigResolver,
|
||||
type EntryConfigResolver as ConfigResolver,
|
||||
type EntryOptions,
|
||||
} from './config/entry.ts'
|
||||
import { EntryGroup } from './config/group.ts'
|
||||
import isolate from './config/isolate.ts'
|
||||
import { EntryTree } from './config/tree.ts'
|
||||
import { interpolate } from './config/utils.ts'
|
||||
|
||||
/** Re-export entry node APIs. */
|
||||
export * from './config/entry.ts'
|
||||
@@ -87,6 +94,15 @@ export class Loader extends EntryTree {
|
||||
|
||||
ctx.reflect.provide('loader', this, this[Service.check])
|
||||
|
||||
ctx.on('internal/config', function (this: Fiber, _config, next) {
|
||||
const config = next()
|
||||
if (!this.entry || this.parent.fiber?.entry === this.entry) return config
|
||||
const plugin = this.runtime?.callback as Record<PropertyKey, unknown> | undefined
|
||||
if (plugin?.[EntryGroup.key]) return config
|
||||
const resolve = plugin?.[EntryConfigResolver] as ConfigResolver | undefined
|
||||
return resolve ? resolve(this.ctx, config) : interpolate(this.ctx, config)
|
||||
}, { global: true })
|
||||
|
||||
ctx.on('internal/update', async function (config, noSave, next) {
|
||||
if (!this.entry || noSave || this.parent.fiber?.entry === this.entry) return next()
|
||||
await next()
|
||||
@@ -127,7 +143,8 @@ export class Loader extends EntryTree {
|
||||
if (!ctx.registry.has(fiber.runtime!.callback)) return
|
||||
|
||||
// case 5: the entry's tree is being disposed
|
||||
if (!fiber.entry.parent.tree.ctx.fiber.uid) return
|
||||
const treeOwner = fiber.entry.parent.tree.ctx.fiber
|
||||
if (!treeOwner.uid || treeOwner.state === FiberState.UNLOADING) return
|
||||
|
||||
// case 6: Loader is replacing or removing this exact fiber
|
||||
if (fiber.entry._disposing) return
|
||||
|
||||
Reference in New Issue
Block a user