Before Transformer Transformation

main
Jackson Morgan 9 months ago
parent 665511f2f0
commit 2a0c2b0629
  1. 186
      packages/type-traverser/example/example.ts
  2. 2
      packages/type-traverser/src/ReverseRelationshipTypes.ts
  3. 12
      packages/type-traverser/src/index.ts
  4. 4
      packages/type-traverser/src/instanceGraph/InstanceGraph.ts
  5. 4
      packages/type-traverser/src/instanceGraph/nodes/InstanceNode.ts
  6. 5
      packages/type-traverser/src/instanceGraph/nodes/InterfaceInstanceNode.ts
  7. 5
      packages/type-traverser/src/instanceGraph/nodes/PrimitiveInstanceNode.ts
  8. 2
      packages/type-traverser/src/instanceGraph/nodes/UnionInstanceNode.ts
  9. 2
      packages/type-traverser/src/instanceGraph/nodes/createInstanceNodeFor.ts
  10. 10
      packages/type-traverser/src/transformer/Transformer.ts
  11. 2
      packages/type-traverser/src/transformer/TransformerReturnTypes.ts
  12. 2
      packages/type-traverser/src/transformer/TransformerReturnTypesDefaults.ts
  13. 4
      packages/type-traverser/src/transformer/Transformers.ts
  14. 4
      packages/type-traverser/src/transformerSubTraversers/TransformerInterfaceSubTraverser.ts
  15. 2
      packages/type-traverser/src/transformerSubTraversers/TransformerPrimitiveSubTraverser.ts
  16. 4
      packages/type-traverser/src/transformerSubTraversers/TransformerUnionSubTraverser.ts
  17. 6
      packages/type-traverser/src/traverser/Traverser.ts
  18. 2
      packages/type-traverser/src/traverser/TraverserDefinition.ts
  19. 2
      packages/type-traverser/src/traverser/TraverserTypes.ts
  20. 0
      packages/type-traverser/src/traverser/traverserGraph/TraverserGraph.ts
  21. 4
      packages/type-traverser/src/visitorSubTraversers/VisitorInterfaceSubTraverser.ts
  22. 2
      packages/type-traverser/src/visitorSubTraversers/VisitorPrimitiveSubTraverser.ts
  23. 4
      packages/type-traverser/src/visitorSubTraversers/VisitorUnionSubTraverser.ts
  24. 11
      packages/type-traverser/test/integration/avatar/avatar.test.ts

@ -110,28 +110,12 @@ async function run() {
}, },
}; };
console.log(avatarTraverserDefinition); /**
* Instantiate the Traverser
const graph = new InstanceGraph(avatarTraverserDefinition); */
const aangNode = graph.getNodeFor(aang, "Bender"); const avatarTraverser = new Traverser<AvatarTraverserTypes>(
const aangeChild = aangNode.child("friends"); avatarTraverserDefinition,
);
const parent = aangNode.parent("Person");
const aangChildren = aangNode.allChildren();
aangChildren.forEach((child) => {
child.typeName === "Element";
});
const aangParents = aangNode.allParents();
// /**
// * Instantiate the Traverser
// */
// const avatarTraverser = new Traverser<AvatarTraverserTypes>(
// avatarTraverserDefinition,
// );
// /** // /**
// * Create a visitor // * Create a visitor
@ -193,85 +177,85 @@ async function run() {
// await avatarCountingVisitor.visit(aang, "Bender", countContext); // await avatarCountingVisitor.visit(aang, "Bender", countContext);
// console.log(countContext.numberOfBenders); // console.log(countContext.numberOfBenders);
// /** /**
// * Set up a transformer * Set up a transformer
// */ */
// interface ActionablePerson { interface ActionablePerson {
// doAction(): void; doAction(): void;
// friends: ActionablePerson[]; friends: ActionablePerson[];
// } }
// const avatarTransformer = avatarTraverser.createTransformer< const avatarTransformer = avatarTraverser.createTransformer<
// { {
// Element: { Element: {
// return: string; return: string;
// }; };
// Bender: { Bender: {
// return: ActionablePerson; return: ActionablePerson;
// properties: { properties: {
// element: string; element: string;
// }; };
// }; };
// NonBender: { NonBender: {
// return: ActionablePerson; return: ActionablePerson;
// }; };
// }, },
// undefined undefined
// >({ >({
// Element: async (item) => { Element: async (item) => {
// return item.toUpperCase(); return item.toUpperCase();
// }, },
// Bender: { Bender: {
// transformer: async (item, getTransformedChildren) => { transformer: async (item, getTransformedChildren) => {
// const transformedChildren = await getTransformedChildren(); const transformedChildren = await getTransformedChildren();
// return { return {
// doAction: () => { doAction: () => {
// console.log(`I can bend ${transformedChildren.element}`); console.log(`I can bend ${transformedChildren.element}`);
// }, },
// friends: transformedChildren.friends, friends: transformedChildren.friends,
// }; };
// }, },
// properties: { properties: {
// element: async (item, getTransformedChildren) => { element: async (item, getTransformedChildren) => {
// const transformedChildren = await getTransformedChildren(); const transformedChildren = await getTransformedChildren();
// return `the element of ${transformedChildren}`; return `the element of ${transformedChildren}`;
// }, },
// }, },
// }, },
// NonBender: { NonBender: {
// transformer: async (item, getTransformedChildren) => { transformer: async (item, getTransformedChildren) => {
// const transformedChildren = await getTransformedChildren(); const transformedChildren = await getTransformedChildren();
// return { return {
// doAction: () => { doAction: () => {
// console.log(`I can't bend.`); console.log(`I can't bend.`);
// }, },
// friends: transformedChildren.friends, friends: transformedChildren.friends,
// }; };
// }, },
// }, },
// Person: async ( Person: async (
// item, item,
// getTransformedChildren, getTransformedChildren,
// setReturnPointer, setReturnPointer,
// _context, _context,
// ) => { ) => {
// const personToReturn: ActionablePerson = {} as ActionablePerson; const personToReturn: ActionablePerson = {} as ActionablePerson;
// setReturnPointer(personToReturn); setReturnPointer(personToReturn);
// const transformedChildren = await getTransformedChildren(); const transformedChildren = await getTransformedChildren();
// personToReturn.doAction = transformedChildren.doAction; personToReturn.doAction = transformedChildren.doAction;
// personToReturn.friends = transformedChildren.friends; personToReturn.friends = transformedChildren.friends;
// return personToReturn; return personToReturn;
// }, },
// }); });
// /** /**
// * Run the Transformer * Run the Transformer
// */ */
// console.log( console.log(
// "############################## AvatarTraverser DoAction ##############################", "############################## AvatarTraverser DoAction ##############################",
// ); );
// const result = await avatarTransformer.transform(aang, "Bender", undefined); const result = await avatarTransformer.transform(aang, "Bender", undefined);
// result.doAction(); result.doAction();
// result.friends[0].doAction(); result.friends[0].doAction();
// result.friends[1].doAction(); result.friends[1].doAction();
} }
run(); run();

@ -4,7 +4,7 @@ import type {
PrimitiveType, PrimitiveType,
TraverserTypes, TraverserTypes,
UnionType, UnionType,
} from "./TraverserTypes"; } from "./traverser/TraverserTypes";
export type InterfaceReverseRelationshipIndentifier< export type InterfaceReverseRelationshipIndentifier<
Types extends TraverserTypes<any>, Types extends TraverserTypes<any>,

@ -1,9 +1,9 @@
export * from "./TraverserTypes"; export * from "./traverser/TraverserTypes";
export * from "./UtilTypes"; export * from "./UtilTypes";
export * from "./TraverserDefinition"; export * from "./traverser/TraverserDefinition";
export * from "./TransformerReturnTypes"; export * from "./transformer/TransformerReturnTypes";
export * from "./TransformerReturnTypesDefaults"; export * from "./transformer/TransformerReturnTypesDefaults";
export * from "./Traverser"; export * from "./traverser/Traverser";
export * from "./Transformer"; export * from "./transformer/Transformer";
export * from "./Visitor"; export * from "./Visitor";
export * from "./Visitors"; export * from "./Visitors";

@ -1,11 +1,11 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { MultiMap } from "../transformerSubTraversers/util/MultiMap"; import { MultiMap } from "../transformerSubTraversers/util/MultiMap";
import type { TraverserTypes } from "../TraverserTypes"; import type { TraverserTypes } from "../traverser/TraverserTypes";
import { import {
createInstanceNodeFor, createInstanceNodeFor,
type InstanceNodeFor, type InstanceNodeFor,
} from "./nodes/createInstanceNodeFor"; } from "./nodes/createInstanceNodeFor";
import type { TraverserDefinitions } from "../TraverserDefinition"; import type { TraverserDefinitions } from "../traverser/TraverserDefinition";
export class InstanceGraph<Types extends TraverserTypes<any>> { export class InstanceGraph<Types extends TraverserTypes<any>> {
protected objectMap: MultiMap< protected objectMap: MultiMap<

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { TraverserDefinition } from "../.."; import type { TraverserDefinition } from "../..";
import type { ParentIdentifiers } from "../../reverseRelationshipTypes"; import type { ParentIdentifiers } from "../../reverseRelationshipTypes";
import type { TraverserTypes } from "../../TraverserTypes"; import type { TraverserTypes } from "../../traverser/TraverserTypes";
import type { InstanceGraph } from "../instanceGraph"; import type { InstanceGraph } from "../instanceGraph";
import type { InstanceNodeFor } from "./createInstanceNodeFor"; import type { InstanceNodeFor } from "./createInstanceNodeFor";
@ -11,7 +11,7 @@ export abstract class InstanceNode<
Type extends Types[TypeName], Type extends Types[TypeName],
> { > {
readonly graph: InstanceGraph<Types>; readonly graph: InstanceGraph<Types>;
readonly instance: Types[TypeName]["type"]; readonly instance: Type["type"];
readonly typeName: TypeName; readonly typeName: TypeName;
protected readonly parents: Record< protected readonly parents: Record<
string, string,

@ -1,5 +1,8 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { InterfaceType, TraverserTypes } from "../../TraverserTypes"; import type {
InterfaceType,
TraverserTypes,
} from "../../traverser/TraverserTypes";
import type { InstanceGraph } from "../instanceGraph"; import type { InstanceGraph } from "../instanceGraph";
import type { InstanceNodeFor } from "./createInstanceNodeFor"; import type { InstanceNodeFor } from "./createInstanceNodeFor";
import { InstanceNode } from "./InstanceNode"; import { InstanceNode } from "./InstanceNode";

@ -1,5 +1,8 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { PrimitiveType, TraverserTypes } from "../../TraverserTypes"; import type {
PrimitiveType,
TraverserTypes,
} from "../../traverser/TraverserTypes";
import { InstanceNode } from "./InstanceNode"; import { InstanceNode } from "./InstanceNode";
export class PrimitiveInstanceNode< export class PrimitiveInstanceNode<

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { TraverserTypes, UnionType } from "../../TraverserTypes"; import type { TraverserTypes, UnionType } from "../../traverser/TraverserTypes";
import type { InstanceNodeFor } from "./createInstanceNodeFor"; import type { InstanceNodeFor } from "./createInstanceNodeFor";
import { InstanceNode } from "./InstanceNode"; import { InstanceNode } from "./InstanceNode";

@ -4,7 +4,7 @@ import type {
PrimitiveType, PrimitiveType,
TraverserTypes, TraverserTypes,
UnionType, UnionType,
} from "../../TraverserTypes"; } from "../../traverser/TraverserTypes";
import type { InstanceGraph } from "../instanceGraph"; import type { InstanceGraph } from "../instanceGraph";
import { InterfaceInstanceNode } from "./InterfaceInstanceNode"; import { InterfaceInstanceNode } from "./InterfaceInstanceNode";
import { PrimitiveInstanceNode } from "./PrimitiveInstanceNode"; import { PrimitiveInstanceNode } from "./PrimitiveInstanceNode";

@ -12,11 +12,11 @@ import type {
TraverserTypes, TraverserTypes,
UnionReturnType, UnionReturnType,
UnionType, UnionType,
} from "."; } from "..";
import { transformerParentSubTraverser } from "./transformerSubTraversers/TransformerParentSubTraverser"; import { transformerParentSubTraverser } from "../transformerSubTraversers/TransformerParentSubTraverser";
import { CircularDepenedencyAwaiter } from "./transformerSubTraversers/util/CircularDependencyAwaiter"; import { CircularDepenedencyAwaiter } from "../transformerSubTraversers/util/CircularDependencyAwaiter";
import { MultiMap } from "./transformerSubTraversers/util/MultiMap"; import { MultiMap } from "../transformerSubTraversers/util/MultiMap";
import { SuperPromise } from "./transformerSubTraversers/util/SuperPromise"; import { SuperPromise } from "../transformerSubTraversers/util/SuperPromise";
import type { import type {
GetTransformedChildrenFunction, GetTransformedChildrenFunction,
InterfaceTransformerDefinition, InterfaceTransformerDefinition,

@ -3,7 +3,7 @@ import type {
PrimitiveType, PrimitiveType,
TraverserTypes, TraverserTypes,
UnionType, UnionType,
} from "."; } from "..";
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
export type InterfaceReturnType<Type extends InterfaceType<any>> = { export type InterfaceReturnType<Type extends InterfaceType<any>> = {

@ -10,7 +10,7 @@ import type {
TraverserTypes, TraverserTypes,
UnionInputReturnType, UnionInputReturnType,
UnionType, UnionType,
} from "."; } from "..";
export type RecursivelyFindReturnType< export type RecursivelyFindReturnType<
Types extends TraverserTypes<any>, Types extends TraverserTypes<any>,

@ -10,7 +10,8 @@ import type {
TraverserTypes, TraverserTypes,
UnionReturnType, UnionReturnType,
UnionType, UnionType,
} from "."; } from "..";
import type { InterfaceInstanceNode } from "../instanceGraph/nodes/InterfaceInstanceNode";
export type GetTransformedChildrenFunction<TransformedChildrenType> = export type GetTransformedChildrenFunction<TransformedChildrenType> =
() => Promise<TransformedChildrenType>; () => Promise<TransformedChildrenType>;
@ -30,6 +31,7 @@ export type InterfaceTransformerFunction<
[PropertyName in keyof ReturnType["properties"]]: ReturnType["properties"][PropertyName]; [PropertyName in keyof ReturnType["properties"]]: ReturnType["properties"][PropertyName];
}>, }>,
setReturnPointer: SetReturnPointerFunction<ReturnType["return"]>, setReturnPointer: SetReturnPointerFunction<ReturnType["return"]>,
node: InterfaceInstanceNode<Types, Type>,
context: Context, context: Context,
) => Promise<ReturnType["return"]>; ) => Promise<ReturnType["return"]>;

@ -5,8 +5,8 @@ import type {
TransformerReturnTypes, TransformerReturnTypes,
} from "../TransformerReturnTypes"; } from "../TransformerReturnTypes";
import type { InterfaceTransformerDefinition } from "../Transformers"; import type { InterfaceTransformerDefinition } from "../Transformers";
import type { InterfaceTraverserDefinition } from "../TraverserDefinition"; import type { InterfaceTraverserDefinition } from "../traverser/TraverserDefinition";
import type { InterfaceType } from "../TraverserTypes"; import type { InterfaceType } from "../traverser/TraverserTypes";
import { transformerParentSubTraverser } from "./TransformerParentSubTraverser"; import { transformerParentSubTraverser } from "./TransformerParentSubTraverser";
import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes"; import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes";

@ -5,7 +5,7 @@ import type {
TransformerReturnTypes, TransformerReturnTypes,
} from "../TransformerReturnTypes"; } from "../TransformerReturnTypes";
import type { PrimitiveTransformerDefinition } from "../Transformers"; import type { PrimitiveTransformerDefinition } from "../Transformers";
import type { PrimitiveType } from "../TraverserTypes"; import type { PrimitiveType } from "../traverser/TraverserTypes";
import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes"; import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes";
export async function transformerPrimitiveSubTraverser< export async function transformerPrimitiveSubTraverser<

@ -5,8 +5,8 @@ import type {
UnionReturnType, UnionReturnType,
} from "../TransformerReturnTypes"; } from "../TransformerReturnTypes";
import type { UnionTransformerDefinition } from "../Transformers"; import type { UnionTransformerDefinition } from "../Transformers";
import type { UnionTraverserDefinition } from "../TraverserDefinition"; import type { UnionTraverserDefinition } from "../traverser/TraverserDefinition";
import type { UnionType } from "../TraverserTypes"; import type { UnionType } from "../traverser/TraverserTypes";
import { transformerParentSubTraverser } from "./TransformerParentSubTraverser"; import { transformerParentSubTraverser } from "./TransformerParentSubTraverser";
import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes"; import type { TransformerSubTraverserGlobals } from "./util/transformerSubTraverserTypes";

@ -4,9 +4,9 @@ import type {
TraverserDefinitions, TraverserDefinitions,
TraverserTypes, TraverserTypes,
VisitorsInput, VisitorsInput,
} from "."; } from "..";
import { Transformer, Visitor } from "."; import { Transformer, Visitor } from "..";
import type { TransformersInput } from "./Transformers"; import type { TransformersInput } from "../transformer/Transformers";
export class Traverser< export class Traverser<
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any

@ -4,7 +4,7 @@ import type {
TraverserTypes, TraverserTypes,
UnionType, UnionType,
PrimitiveType, PrimitiveType,
} from "."; } from "..";
export type InterfaceTraverserDefinition<Type extends InterfaceType<any>> = { export type InterfaceTraverserDefinition<Type extends InterfaceType<any>> = {
kind: "interface"; kind: "interface";

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { AssertExtends, KeyTypes } from "./UtilTypes"; import type { AssertExtends, KeyTypes } from "../UtilTypes";
export interface InterfaceType<TypeNames extends KeyTypes> { export interface InterfaceType<TypeNames extends KeyTypes> {
kind: "interface"; kind: "interface";

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { InterfaceVisitorDefinition, TraverserTypes } from ".."; import type { InterfaceVisitorDefinition, TraverserTypes } from "..";
import type { InterfaceTraverserDefinition } from "../TraverserDefinition"; import type { InterfaceTraverserDefinition } from "../traverser/TraverserDefinition";
import type { InterfaceType } from "../TraverserTypes"; import type { InterfaceType } from "../traverser/TraverserTypes";
import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes"; import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes";
import { visitorParentSubTraverser } from "./VisitorParentSubTraverser"; import { visitorParentSubTraverser } from "./VisitorParentSubTraverser";

@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { PrimitiveVisitorDefinition, TraverserTypes } from ".."; import type { PrimitiveVisitorDefinition, TraverserTypes } from "..";
import type { PrimitiveType } from "../TraverserTypes"; import type { PrimitiveType } from "../traverser/TraverserTypes";
import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes"; import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes";
export async function visitorPrimitiveSubTraverser< export async function visitorPrimitiveSubTraverser<

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import type { TraverserTypes, UnionVisitorDefinition } from ".."; import type { TraverserTypes, UnionVisitorDefinition } from "..";
import type { UnionTraverserDefinition } from "../TraverserDefinition"; import type { UnionTraverserDefinition } from "../traverser/TraverserDefinition";
import type { UnionType } from "../TraverserTypes"; import type { UnionType } from "../traverser/TraverserTypes";
import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes"; import type { VisitorSubTraverserGlobals } from "./util/visitorSubTraverserTypes";
import { visitorParentSubTraverser } from "./VisitorParentSubTraverser"; import { visitorParentSubTraverser } from "./VisitorParentSubTraverser";

@ -100,6 +100,7 @@ describe("AvatarExample", () => {
}, },
}; };
describe("Build Instance Graph", () => {
it("returns child nodes when child methods are called.", () => { it("returns child nodes when child methods are called.", () => {
const graph = new InstanceGraph(avatarTraverserDefinition); const graph = new InstanceGraph(avatarTraverserDefinition);
const aangBender = graph.getNodeFor(aang, "Bender"); const aangBender = graph.getNodeFor(aang, "Bender");
@ -126,7 +127,8 @@ describe("AvatarExample", () => {
expect(aangBender2).toBe(aangBender); expect(aangBender2).toBe(aangBender);
} }
// allChildren // allChildren
const [childElemement, childSokka, childKatara] = aangBender.allChildren(); const [childElemement, childSokka, childKatara] =
aangBender.allChildren();
expect(childElemement.instance).toBe("Air"); expect(childElemement.instance).toBe("Air");
expect((childSokka.instance as NonBender).name).toBe("Sokka"); expect((childSokka.instance as NonBender).name).toBe("Sokka");
expect((childKatara.instance as Bender).name).toBe("Katara"); expect((childKatara.instance as Bender).name).toBe("Katara");
@ -150,3 +152,10 @@ describe("AvatarExample", () => {
expect(kataraBender.instance.name).toBe("Katara"); expect(kataraBender.instance.name).toBe("Katara");
}); });
}); });
describe("Transformer", () => {
it("transforms", () => {
})
});
});

Loading…
Cancel
Save