Skip to content

Commit

Permalink
Made type displays more readable (#3153)
Browse files Browse the repository at this point in the history
  • Loading branch information
Andarist committed Mar 15, 2022
1 parent 2ac0f68 commit b36ef9d
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 46 deletions.
5 changes: 5 additions & 0 deletions .changeset/red-steaks-tickle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'xstate': patch
---

Made type displays (like in the IDE tooltips etc) more readable by using a type interface for the internal `ResolveTypegenMeta` type.
4 changes: 2 additions & 2 deletions packages/core/src/State.ts
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ export class State<
*/
public matches<
TSV extends TResolvedTypesMeta extends TypegenEnabled
? Prop<TResolvedTypesMeta, 'matchesStates'>
? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'matchesStates'>
: never
>(parentStateValue: TSV): boolean;
public matches<
Expand Down Expand Up @@ -348,7 +348,7 @@ export class State<
*/
public hasTag(
tag: TResolvedTypesMeta extends TypegenEnabled
? Prop<TResolvedTypesMeta, 'tags'>
? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'tags'>
: string
): boolean {
return this.tags.has(tag as string);
Expand Down
74 changes: 43 additions & 31 deletions packages/core/src/typegenTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,21 @@ export interface TypegenMeta extends TypegenEnabled {
}

export interface ResolvedTypegenMeta extends TypegenMeta {
indexedActions: Record<string, BaseActionObject>;
indexedEvents: Record<string, EventObject>;
resolved: TypegenMeta & {
indexedActions: Record<string, BaseActionObject>;
indexedEvents: Record<string, EventObject>;
};
}

export type TypegenConstraint = TypegenEnabled | TypegenDisabled;

// if combined union of all missing implementation types is never then everything has been provided
export type AreAllImplementationsAssumedToBeProvided<
TResolvedTypesMeta,
TMissingImplementations = Prop<TResolvedTypesMeta, 'missingImplementations'>
TMissingImplementations = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'missingImplementations'
>
> = IsAny<TResolvedTypesMeta> extends true
? true
: TResolvedTypesMeta extends TypegenEnabled
Expand All @@ -113,16 +118,19 @@ export type AreAllImplementationsAssumedToBeProvided<
: false
: true;

export type MarkAllImplementationsAsProvided<
TResolvedTypesMeta
> = TResolvedTypesMeta & {
interface AllImplementationsProvided {
missingImplementations: {
actions: never;
delays: never;
guards: never;
services: never;
};
};
}

export interface MarkAllImplementationsAsProvided<TResolvedTypesMeta> {
'@@xstate/typegen': Prop<TResolvedTypesMeta, '@@xstate/typegen'>;
resolved: Prop<TResolvedTypesMeta, 'resolved'> & AllImplementationsProvided;
}

type GenerateServiceEvent<
TServiceName,
Expand Down Expand Up @@ -164,33 +172,37 @@ type AllowAllEvents = {
eventsCausingServices: Record<string, string>;
};

export type ResolveTypegenMeta<
export interface ResolveTypegenMeta<
TTypesMeta extends TypegenConstraint,
TEvent extends EventObject,
TAction extends BaseActionObject,
TServiceMap extends ServiceMap
> = TTypesMeta extends TypegenEnabled
? TTypesMeta & {
indexedActions: IndexByType<TAction>;
indexedEvents: MergeWithInternalEvents<
IndexByType<
| (string extends TEvent['type'] ? never : TEvent)
| GenerateServiceEvents<
TServiceMap,
Prop<TTypesMeta, 'invokeSrcNameMap'>
>
>,
Prop<TTypesMeta, 'internalEvents'>
>;
}
: MarkAllImplementationsAsProvided<TypegenDisabled> &
AllowAllEvents & {
> {
'@@xstate/typegen': TTypesMeta['@@xstate/typegen'];
resolved: TTypesMeta extends TypegenEnabled
? TTypesMeta & {
indexedActions: IndexByType<TAction>;
indexedEvents: Record<string, TEvent> & {
__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: { data: any };
};
invokeSrcNameMap: Record<
string,
'__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'
indexedEvents: MergeWithInternalEvents<
IndexByType<
| (string extends TEvent['type'] ? never : TEvent)
| GenerateServiceEvents<
TServiceMap,
Prop<TTypesMeta, 'invokeSrcNameMap'>
>
>,
Prop<TTypesMeta, 'internalEvents'>
>;
};
}
: TypegenDisabled &
AllImplementationsProvided &
AllowAllEvents & {
indexedActions: IndexByType<TAction>;
indexedEvents: Record<string, TEvent> & {
__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: { data: any };
};
invokeSrcNameMap: Record<
string,
'__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'
>;
};
}
48 changes: 35 additions & 13 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -767,9 +767,12 @@ export type DelayConfig<TContext, TEvent extends EventObject> =
type MachineOptionsActions<
TContext,
TResolvedTypesMeta,
TEventsCausingActions = Prop<TResolvedTypesMeta, 'eventsCausingActions'>,
TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>,
TIndexedActions = Prop<TResolvedTypesMeta, 'indexedActions'>
TEventsCausingActions = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'eventsCausingActions'
>,
TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>,
TIndexedActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActions'>
> = {
[K in keyof TEventsCausingActions]?:
| ActionObject<
Expand All @@ -786,8 +789,11 @@ type MachineOptionsActions<
type MachineOptionsDelays<
TContext,
TResolvedTypesMeta,
TEventsCausingDelays = Prop<TResolvedTypesMeta, 'eventsCausingDelays'>,
TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>
TEventsCausingDelays = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'eventsCausingDelays'
>,
TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>
> = {
[K in keyof TEventsCausingDelays]?: DelayConfig<
TContext,
Expand All @@ -798,8 +804,11 @@ type MachineOptionsDelays<
type MachineOptionsGuards<
TContext,
TResolvedTypesMeta,
TEventsCausingGuards = Prop<TResolvedTypesMeta, 'eventsCausingGuards'>,
TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>
TEventsCausingGuards = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'eventsCausingGuards'
>,
TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>
> = {
[K in keyof TEventsCausingGuards]?: ConditionPredicate<
TContext,
Expand All @@ -810,9 +819,15 @@ type MachineOptionsGuards<
type MachineOptionsServices<
TContext,
TResolvedTypesMeta,
TEventsCausingServices = Prop<TResolvedTypesMeta, 'eventsCausingServices'>,
TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>,
TInvokeSrcNameMap = Prop<TResolvedTypesMeta, 'invokeSrcNameMap'>
TEventsCausingServices = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'eventsCausingServices'
>,
TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>,
TInvokeSrcNameMap = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'invokeSrcNameMap'
>
> = {
[K in keyof TEventsCausingServices]?:
| AnyStateMachine
Expand Down Expand Up @@ -898,7 +913,10 @@ export type InternalMachineOptions<
TEvent extends EventObject,
TResolvedTypesMeta,
TRequireMissingImplementations extends boolean = false,
TMissingImplementations = Prop<TResolvedTypesMeta, 'missingImplementations'>
TMissingImplementations = Prop<
Prop<TResolvedTypesMeta, 'resolved'>,
'missingImplementations'
>
> = GenerateActionsConfigPart<
TContext,
TResolvedTypesMeta,
Expand Down Expand Up @@ -1690,7 +1708,9 @@ export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R
TContext,
TEvent,
TTypestate,
MarkAllImplementationsAsProvided<TResolvedTypesMeta>
AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false
? MarkAllImplementationsAsProvided<TResolvedTypesMeta>
: TResolvedTypesMeta
>
: R extends Promise<infer U>
? ActorRef<never, U>
Expand All @@ -1717,7 +1737,9 @@ export type InterpreterFrom<
TStateSchema,
TEvent,
TTypestate,
MarkAllImplementationsAsProvided<TResolvedTypesMeta>
AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false
? MarkAllImplementationsAsProvided<TResolvedTypesMeta>
: TResolvedTypesMeta
>
: never;

Expand Down

0 comments on commit b36ef9d

Please sign in to comment.