From 7206e7ef9c3728e2b60d9a6cd7ecdb167fca78d0 Mon Sep 17 00:00:00 2001 From: "Marc J. Schmidt" Date: Thu, 16 Nov 2023 18:31:58 +0100 Subject: [PATCH] fix(type): make sure `typeof x` expression doesn't return the original type --- packages/framework/src/module.ts | 2 +- packages/sqlite/tests/integration-types.spec.ts | 4 ++-- packages/type/src/reflection/processor.ts | 4 ++-- packages/type/tests/compiler.spec.ts | 2 +- packages/type/tests/type.spec.ts | 15 +++++++++++++++ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/framework/src/module.ts b/packages/framework/src/module.ts index 393de100f..746701a3f 100644 --- a/packages/framework/src/module.ts +++ b/packages/framework/src/module.ts @@ -199,7 +199,6 @@ export class FrameworkModule extends createModule({ //only register the RPC controller this.addImport(new ApiConsoleModule({ listen: false, markdown: '' }).rename('internalApi')); - this.addProvider(DebugBroker); this.addListener(onAppShutdown.listen(async ( event, broker: DebugBroker, store: StopwatchStore) => { await store.close(); @@ -209,6 +208,7 @@ export class FrameworkModule extends createModule({ // this.setupProvider(LiveDatabase).enableChangeFeed(DebugRequest); } + this.addProvider(DebugBroker); this.addProvider(FileStopwatchStore); this.addProvider({ provide: StopwatchStore, useExisting: FileStopwatchStore }); this.addProvider({ diff --git a/packages/sqlite/tests/integration-types.spec.ts b/packages/sqlite/tests/integration-types.spec.ts index 35cc04d34..bd1c14080 100644 --- a/packages/sqlite/tests/integration-types.spec.ts +++ b/packages/sqlite/tests/integration-types.spec.ts @@ -9,6 +9,8 @@ test('check type structure', () => { const group = ReflectionClass.from(Group); const userGroup = ReflectionClass.from(UserGroup); + expect(userGroup.type.parent).toBeUndefined(); + expect(userGroup.getProperty('id').isPrimaryKey()).toBe(true); expect(userGroup.getProperty('user').isReference()).toBe(true); @@ -17,8 +19,6 @@ test('check type structure', () => { expect(userGroup.getProperty('group').isReference()).toBe(true); expect(userGroup.getProperty('group').getResolvedReflectionClass().getPrimary()).toBeInstanceOf(ReflectionProperty); - expect(userGroup.type.parent).toBeUndefined(); - const groupsType = user.getProperty('groups').type; const userGroupsElementType = user.getProperty('groups').getSubType(); //due to a change in copyAndSetParent being shallow copy only this is no longer true diff --git a/packages/type/src/reflection/processor.ts b/packages/type/src/reflection/processor.ts index 87953d355..4e82d0365 100644 --- a/packages/type/src/reflection/processor.ts +++ b/packages/type/src/reflection/processor.ts @@ -1745,7 +1745,7 @@ export function typeInfer(value: any): Type { //with emitted types: function or class //don't use resolveRuntimeType since we don't allow cache here // console.log('typeInfer of', value.name); - return Processor.get().reflect(value) as Type; + return Processor.get().reflect(value, undefined, {inline: true}) as Type; } if (isClass(value)) { @@ -1761,7 +1761,7 @@ export function typeInfer(value: any): Type { if ('function' === typeof constructor && constructor !== Object && isArray(constructor.__type)) { //with emitted types //don't use resolveRuntimeType since we don't allow cache here - return Processor.get().reflect(constructor) as Type; + return Processor.get().reflect(constructor, undefined, {inline: true}) as Type; } if (constructor === RegExp) return { kind: ReflectionKind.regexp }; diff --git a/packages/type/tests/compiler.spec.ts b/packages/type/tests/compiler.spec.ts index dde7eef27..d8346d7de 100644 --- a/packages/type/tests/compiler.spec.ts +++ b/packages/type/tests/compiler.spec.ts @@ -948,7 +948,7 @@ test('correct T resolver', () => { console.log('js', js); const type = transpileAndReturn(code) as (v: any) => ClassType; const classType = type('abc'); - expectEqualType(typeInfer(classType), { + expectEqualType(reflect(classType), { kind: ReflectionKind.class, classType: classType, types: [ diff --git a/packages/type/tests/type.spec.ts b/packages/type/tests/type.spec.ts index 0e033f1ce..2ce972fc3 100644 --- a/packages/type/tests/type.spec.ts +++ b/packages/type/tests/type.spec.ts @@ -1652,3 +1652,18 @@ test('issue-495: extend Promise in union', () => { expect(type.literal).toBe(false); } }); + +test('used type does not leak parent to original', () => { + class User { + groups!: {via: typeof UserGroup}; + } + + class UserGroup { + public user!: User; + } + + const user = typeOf(); + const userGroup = typeOf(); + + expect(userGroup.parent).toBe(undefined); +});