diff --git a/packages/core/src/reflect.ts b/packages/core/src/reflect.ts index 8e884bc..67b8f91 100644 --- a/packages/core/src/reflect.ts +++ b/packages/core/src/reflect.ts @@ -43,14 +43,14 @@ class ReflectService { } static handler: ProxyHandler = { - get(target, prop, ctx: Context) { + get: (target, prop, ctx: Context) => { if (typeof prop !== 'string') return Reflect.get(target, prop, ctx) if (Reflect.has(target, prop)) { return getTraceable(ctx, Reflect.get(target, prop, ctx), true) } - const [name, internal] = ReflectService.resolveInject(ctx, prop) + const [name, internal] = ReflectService.resolveInject(target, prop) // trace caller const error = new Error(`property ${name} is not registered, declare it as \`inject\` to suppress this warning`) const lines = error.stack!.split('\n') @@ -67,10 +67,10 @@ class ReflectService { } }, - set(target, prop, value, ctx: Context) { + set: (target, prop, value, ctx: Context) => { if (typeof prop !== 'string') return Reflect.set(target, prop, value, ctx) - const [name, internal] = ReflectService.resolveInject(ctx, prop) + const [name, internal] = ReflectService.resolveInject(target, prop) if (!internal) { // TODO warning return Reflect.set(target, name, value, ctx) @@ -84,6 +84,13 @@ class ReflectService { return true } }, + + has: (target, prop) => { + if (typeof prop !== 'string') return Reflect.has(target, prop) + if (Reflect.has(target, prop)) return true + const [, internal] = ReflectService.resolveInject(target, prop) + return !!internal + }, } constructor(public ctx: Context) { @@ -136,7 +143,10 @@ class ReflectService { ctx.emit(self, 'internal/before-service', name, value) ctx.root[key] = value if (isObject(value)) { - defineProperty(value, symbols.source, ctx) + try { + // Frozen objects cannot be modified + defineProperty(value, symbols.source, ctx) + } catch {} } ctx.emit(self, 'internal/service', name, oldValue) return dispose diff --git a/packages/loader/src/loader.ts b/packages/loader/src/loader.ts index d6526a6..3f7f530 100644 --- a/packages/loader/src/loader.ts +++ b/packages/loader/src/loader.ts @@ -124,6 +124,7 @@ export abstract class Loader extends ImportTree async start() { await this.init(process.cwd(), this.config) + this.ctx.set('env', process.env) await super.start() }