Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/some-beers-drop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@dataplan/pg": patch
---

Fixes an issue where `loadOneWithPgClient`/`loadManyWithPgClient` might result
in `Step<Promise<...>>` types. Steps will never represent promises.
21 changes: 17 additions & 4 deletions grafast/dataplan-pg/src/steps/withPgClient.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type {
ExecutionDetails,
GrafastResultsList,
LoadManyAwaitedData,
LoadManyInfo,
LoadManyLoader,
LoadManyStep,
Expand Down Expand Up @@ -156,7 +157,13 @@ export function loadOneWithPgClient<
TParams,
TShared
>,
): LoadOneStep<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared> {
): LoadOneStep<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
Awaited<TData>,
TParams,
TShared
> {
const newLoader = transformLoadOneLoader(executor, loader);
return loadOne(lookup, newLoader);
}
Expand All @@ -172,7 +179,7 @@ export type LoadOneWithPgClientCallback<
pgClient: PgClient,
lookups: ReadonlyArray<TSpec>,
info: LoadOneInfo<TItem, TParams, TUnarySpec>,
): PromiseOrDirect<ReadonlyArray<TData>>;
): PromiseOrDirect<ReadonlyArray<PromiseOrDirect<TData>>>;
displayName?: string;
};

Expand Down Expand Up @@ -328,7 +335,7 @@ export type LoadManyWithPgClientCallback<
pgClient: PgClient,
lookups: ReadonlyArray<TSpec>,
info: LoadManyInfo<TItem, TParams, TUnarySpec>,
): PromiseOrDirect<ReadonlyArray<TData>>;
): PromiseOrDirect<ReadonlyArray<PromiseOrDirect<TData>>>;
displayName?: string;
};

Expand Down Expand Up @@ -368,7 +375,13 @@ export function loadManyWithPgClient<
TParams,
TShared
>,
): LoadManyStep<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared> {
): LoadManyStep<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
LoadManyAwaitedData<TData>,
TParams,
TShared
> {
const newLoader = transformLoadManyLoader(executor, loader);
return loadMany(lookup, newLoader);
}
2 changes: 2 additions & 0 deletions grafast/grafast/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ import type {
ListTransformItemPlanCallback,
ListTransformOptions,
ListTransformReduce,
LoadManyAwaitedData,
LoadManyCallback,
LoadManyInfo,
LoadManyLoader,
Expand Down Expand Up @@ -375,6 +376,7 @@ export type {
ListTransformItemPlanCallback,
ListTransformOptions,
ListTransformReduce,
LoadManyAwaitedData,
LoadManyCallback,
LoadManyInfo,
LoadManyLoader,
Expand Down
1 change: 1 addition & 0 deletions grafast/grafast/src/steps/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export { condition, ConditionStep } from "./condition.ts";
export { graphqlResolver, GraphQLResolverStep } from "./graphqlResolver.ts";
export { LoadedRecordStep } from "./loadedRecord.ts";
export type {
LoadManyAwaitedData,
LoadManyCallback,
LoadManyInfo,
LoadManyLoader,
Expand Down
31 changes: 25 additions & 6 deletions grafast/grafast/src/steps/loadMany.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,13 @@ interface LoadManyBaseParams {
limit?: Maybe<number>;
}

export type LoadManyAwaitedData<TData> =
TData extends ReadonlyArray<infer TItem>
? ReadonlyArray<Awaited<TItem>>
: TData extends AsyncIterable<infer TItem>
? AsyncIterable<Awaited<TItem>>
: TData;

export class LoadManyStep<
const TLookup extends Multistep,
TItem,
Expand Down Expand Up @@ -419,12 +426,24 @@ export function loadMany<
>(
lookup: TLookup,
loader:
| LoadManyCallback<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared>
| LoadManyLoader<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared>,
| LoadManyCallback<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
LoadManyAwaitedData<TData>,
TParams,
TShared
>
| LoadManyLoader<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
LoadManyAwaitedData<TData>,
TParams,
TShared
>,
): LoadManyStep<
UnwrapMultistep<TLookup>,
TItem,
TData,
Awaited<TItem>,
LoadManyAwaitedData<TData>,
TParams,
UnwrapMultistep<TShared>
> {
Expand All @@ -438,8 +457,8 @@ export function loadMany<
typeof loader === "function"
? ({ load: loader } as LoadManyLoader<
UnwrapMultistep<TLookup>,
TItem,
TData,
Awaited<TItem>,
LoadManyAwaitedData<TData>,
TParams,
TShared
>)
Expand Down
24 changes: 18 additions & 6 deletions grafast/grafast/src/steps/loadOne.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,13 +309,25 @@ export function loadOne<
loader:
| LoadOneCallback<
UnwrapMultistep<TLookup>,
TItem,
TData,
Awaited<TItem>,
Awaited<TData>,
TParams,
never // If you want context, you must use the loader object
>
| LoadOneLoader<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared>,
): LoadOneStep<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared> {
| LoadOneLoader<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
Awaited<TData>,
TParams,
TShared
>,
): LoadOneStep<
UnwrapMultistep<TLookup>,
Awaited<TItem>,
Awaited<TData>,
TParams,
TShared
> {
if (arguments.length > 2) {
throw new Error(
"The signature of loadOne has changed, additional arguments should now be passed via a 'loader' object: `loadOne(lookup, loader)` where `loader` is either a `load` function or object containing it `{ load, shared?, ioEquivalence?, paginationSupport? }`",
Expand All @@ -326,8 +338,8 @@ export function loadOne<
typeof loader === "function"
? ({ load: loader } as LoadOneLoader<
UnwrapMultistep<TLookup>,
TItem,
TData,
Awaited<TItem>,
Awaited<TData>,
TParams,
TShared
>)
Expand Down
20 changes: 15 additions & 5 deletions postgraphile/postgraphile/__tests__/queries/plugins/Issue2212.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import "graphile-config";

import type { PgSelectSingleStep } from "@dataplan/pg";
import type { LoadOneStep } from "grafast";
import { EXPORTABLE, extendSchema } from "graphile-utils";

const plugin = extendSchema((build) => {
Expand Down Expand Up @@ -28,7 +29,6 @@ const plugin = extendSchema((build) => {
loadManyWithPgClient,
normalizePhone,
orders,
sql,
) =>
($user: PgSelectSingleStep) => {
const $id = $user.get("id");
Expand Down Expand Up @@ -70,7 +70,8 @@ const plugin = extendSchema((build) => {
);
const $orders = orders.find();
$orders.where(
sql`${$orders}.phone_e164 = any(${$orders.placeholder($phoneNumbers, listOfCodec(TYPES.text))})`,
(sql) =>
sql`${$orders}.phone_e164 = any(${$orders.placeholder($phoneNumbers, listOfCodec(TYPES.text))})`,
);
return connection($orders);
},
Expand All @@ -82,14 +83,13 @@ const plugin = extendSchema((build) => {
loadManyWithPgClient,
normalizePhone,
orders,
sql,
],
),
lifetimeOrderTotal: EXPORTABLE(
(executor, loadOneWithPgClient, normalizePhone) =>
($user: PgSelectSingleStep) => {
const $id = $user.get("id");
return loadOneWithPgClient(
const $loaded = loadOneWithPgClient(
executor,
$id,
async (pgClient, userIds) => {
Expand Down Expand Up @@ -131,7 +131,7 @@ const plugin = extendSchema((build) => {
});

// Finally - match the inputs to the outputs
return userIds.map((userId) => {
return userIds.map(async (userId) => {
const phoneNumbers =
phoneNumbersByUserId[userId] ?? new Set();
let total = 0;
Expand All @@ -147,6 +147,16 @@ const plugin = extendSchema((build) => {
});
},
);
// The type of `$loaded` should NOT involve `Promise<...>`
const $assertion: LoadOneStep<
any,
// TODO: we should be able to assert this is a `number` too... but that is going to need a type overhaul
any,
number,
any,
any
> = $loaded;
return $assertion;
},
[executor, loadOneWithPgClient, normalizePhone],
),
Expand Down
Loading