diff --git a/integration-tests/lts/select.test.ts b/integration-tests/lts/select.test.ts index dda4f4163..ba98a8d00 100644 --- a/integration-tests/lts/select.test.ts +++ b/integration-tests/lts/select.test.ts @@ -9,6 +9,7 @@ declare module "./dbschema/edgeql-js/typesystem" { export interface SetTypesystemOptions { future: { polymorphismAsDiscriminatedUnions: true; + strictTypeNames: true; }; } } @@ -1038,6 +1039,7 @@ SELECT __scope_0_defaultVillain { nemesis: (nemesis) => { const nameLen = e.len(nemesis.name); return { + t: nemesis.__type__.name, name: true, nameLen, nameLen2: nameLen, @@ -1060,6 +1062,7 @@ SELECT __scope_0_defaultPerson { WITH __scope_1_defaultVillain := __scope_0_defaultPerson[IS default::Hero].villains SELECT __scope_1_defaultVillain { + t := .__type__.name, id, name, nemesis := ( @@ -1104,6 +1107,7 @@ SELECT __scope_0_defaultPerson { id: string; name: string; nemesis: { + t: "default::Hero"; name: string; nameLen: number; nameLen2: number; @@ -1417,6 +1421,7 @@ SELECT __scope_0_defaultPerson { title: true, rating: true, filter_single: e.op(movie.title, "=", "The Avengers"), + __typename: movie.__type__.name, })); const characterShape = e.shape(e.Person, () => ({ name: true, @@ -1439,6 +1444,7 @@ SELECT __scope_0_defaultPerson { { title: string; rating: number | null; + __typename: "default::Movie"; } | null > >(true); diff --git a/packages/generate/src/syntax/path.ts b/packages/generate/src/syntax/path.ts index 3e9a6153a..861858f6d 100644 --- a/packages/generate/src/syntax/path.ts +++ b/packages/generate/src/syntax/path.ts @@ -30,6 +30,7 @@ import type { PropertyShape, TypeSet, ScalarType, + TypesystemOptions, } from "./typesystem"; // import {typeutil} from "./typeutil"; // import {cardutil} from "./cardinality"; @@ -42,7 +43,13 @@ type getChildOfObjectTypeSet< > = TypeSet< ChildKey extends "name" ? Root extends { [typenameSymbol]: string } - ? ScalarType<"std::str", string, Root[typeof typenameSymbol]> + ? ScalarType< + "std::str", + TypesystemOptions["future"]["strictTypeNames"] extends true + ? Root[typeof typenameSymbol] + : string, + Root[typeof typenameSymbol] + > : Root["__element__"]["__pointers__"][ChildKey]["target"] : Root["__element__"]["__pointers__"][ChildKey]["target"], cardutil.multiplyCardinalities< diff --git a/packages/generate/src/syntax/typesystem.ts b/packages/generate/src/syntax/typesystem.ts index cbd12d7ab..5e4355fb6 100644 --- a/packages/generate/src/syntax/typesystem.ts +++ b/packages/generate/src/syntax/typesystem.ts @@ -28,6 +28,14 @@ export type TypesystemOptions = { } ? true : false; + /** + * Opt-in to strict __type__.name string literal unions. + */ + strictTypeNames: SetTypesystemOptions extends { + future: { strictTypeNames: true }; + } + ? true + : false; }; };