Skip to content

Commit

Permalink
Remove adminMeta argument to getAdminMeta function in custom fiel…
Browse files Browse the repository at this point in the history
…d types and the associated types for it (#7913)
  • Loading branch information
emmatown committed Sep 13, 2022
1 parent 7778954 commit 267d8c1
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 82 deletions.
5 changes: 5 additions & 0 deletions .changeset/poor-dogs-exercise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@keystone-6/core': major
---

Removes the parameters for `getAdminMeta` when writing field types, and the respective types `AdminMetaRootVal`, `ListMetaRootVal` and `FieldMetaRootVal` therein.
11 changes: 2 additions & 9 deletions packages/core/src/admin-ui/system/adminMetaSchema.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
import { GraphQLResolveInfo } from 'graphql';
import { ScalarType, EnumType, EnumValue } from '@graphql-ts/schema';
import {
QueryMode,
KeystoneContext,
AdminMetaRootVal,
ListMetaRootVal,
FieldMetaRootVal,
BaseItem,
MaybePromise,
} from '../../types';
import { QueryMode, KeystoneContext, BaseItem, MaybePromise } from '../../types';
import { graphql as graphqlBoundToKeystoneContext } from '../..';
import { FieldMetaRootVal, ListMetaRootVal, AdminMetaRootVal } from './createAdminMeta';

type Context = KeystoneContext | { isAdminUIBuildProcess: true };

Expand Down
70 changes: 66 additions & 4 deletions packages/core/src/admin-ui/system/createAdminMeta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,65 @@ import path from 'path';
import { GraphQLString, isInputObjectType } from 'graphql';
import {
KeystoneConfig,
AdminMetaRootVal,
QueryMode,
MaybePromise,
MaybeSessionFunction,
BaseListTypeInfo,
ContextFunction,
KeystoneContext,
JSONValue,
MaybeItemFunction,
} from '../../types';
import { humanize } from '../../lib/utils';
import { InitialisedList } from '../../lib/core/types-for-lists';
import { FilterOrderArgs } from '../../types/config/fields';

type ContextFunction<Return> = (context: KeystoneContext) => MaybePromise<Return>;

export type FieldMetaRootVal = {
path: string;
label: string;
description: string | null;
fieldMeta: JSONValue | null;
viewsIndex: number;
customViewsIndex: number | null;
listKey: string;
search: 'default' | 'insensitive' | null;
isOrderable: ContextFunction<boolean>;
isFilterable: ContextFunction<boolean>;
createView: { fieldMode: ContextFunction<'edit' | 'hidden'> };
// itemView is intentionally special because static values are special cased
// and fetched when fetching the static admin ui
itemView: { fieldMode: MaybeItemFunction<'edit' | 'read' | 'hidden', BaseListTypeInfo> };
listView: { fieldMode: ContextFunction<'read' | 'hidden'> };
};

export type ListMetaRootVal = {
key: string;
path: string;
label: string;
singular: string;
plural: string;
initialColumns: string[];
pageSize: number;
labelField: string;
initialSort: { field: string; direction: 'ASC' | 'DESC' } | null;
fields: Array<FieldMetaRootVal>;
itemQueryName: string;
listQueryName: string;
description: string | null;
isHidden: ContextFunction<boolean>;
hideCreate: ContextFunction<boolean>;
hideDelete: ContextFunction<boolean>;
isSingleton: boolean;
};

export type AdminMetaRootVal = {
lists: Array<ListMetaRootVal>;
listsByKey: Record<string, ListMetaRootVal>;
views: string[];
isAccessAllowed: undefined | ((context: KeystoneContext) => MaybePromise<boolean>);
};

export function createAdminMeta(
config: KeystoneConfig,
initialisedLists: Record<string, InitialisedList>
Expand Down Expand Up @@ -195,14 +243,28 @@ export function createAdminMeta(
if (dbField.kind === 'relation' && omittedLists.includes(dbField.list)) {
continue;
}
fieldMetaRootVal.fieldMeta =
list.fields[fieldMetaRootVal.path].getAdminMeta?.(adminMetaRoot) ?? null;
currentAdminMeta = adminMetaRoot;
try {
fieldMetaRootVal.fieldMeta = list.fields[fieldMetaRootVal.path].getAdminMeta?.() ?? null;
} finally {
currentAdminMeta = undefined;
}
}
}

return adminMetaRoot;
}

let currentAdminMeta: undefined | AdminMetaRootVal;

export function getAdminMetaForRelationshipField() {
if (currentAdminMeta === undefined) {
throw new Error('unexpected call to getAdminMetaInRelationshipField');
}

return currentAdminMeta;
}

function assertValidView(view: string, location: string) {
if (view.includes('\\')) {
throw new Error(
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/admin-ui/system/generateAdminUI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import fs from 'fs-extra';
import resolve from 'resolve';
import { GraphQLSchema } from 'graphql';
import { Entry, walk as _walk } from '@nodelib/fs.walk';
import type { KeystoneConfig, AdminMetaRootVal, AdminFileToWrite } from '../../types';
import type { KeystoneConfig, AdminFileToWrite } from '../../types';
import { writeAdminFiles } from '../templates';
import { serializePathForImport } from '../utils/serializePathForImport';
import { AdminMetaRootVal } from './createAdminMeta';

const walk = promisify(_walk);

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/admin-ui/templates/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import {
ExecutionResult,
Kind,
} from 'graphql';
import { AdminMetaRootVal } from '../../types';
import { staticAdminMetaQuery, StaticAdminMetaQuery } from '../admin-meta-graphql';
import { AdminMetaRootVal } from '../system/createAdminMeta';

type AppTemplateOptions = { configFileExists: boolean };

Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/admin-ui/templates/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as Path from 'path';
import { GraphQLSchema } from 'graphql';
import type { AdminMetaRootVal, KeystoneConfig, AdminFileToWrite } from '../../types';
import type { KeystoneConfig, AdminFileToWrite } from '../../types';
import { AdminMetaRootVal } from '../system/createAdminMeta';
import { appTemplate } from './app';
import { homeTemplate } from './home';
import { listTemplate } from './list';
Expand Down
14 changes: 4 additions & 10 deletions packages/core/src/fields/types/relationship/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import {
BaseListTypeInfo,
FieldTypeFunc,
CommonFieldConfig,
fieldType,
AdminMetaRootVal,
} from '../../../types';
import { BaseListTypeInfo, FieldTypeFunc, CommonFieldConfig, fieldType } from '../../../types';
import { graphql } from '../../..';
import { getAdminMetaForRelationshipField } from '../../../admin-ui/system/createAdminMeta';

// This is the default display mode for Relationships
type SelectDisplayConfig = {
Expand Down Expand Up @@ -86,9 +81,8 @@ export const relationship =
const commonConfig = {
...config,
views: '@keystone-6/core/fields/types/relationship/views',
getAdminMeta: (
adminMetaRoot: AdminMetaRootVal
): Parameters<typeof import('./views').controller>[0]['fieldMeta'] => {
getAdminMeta: (): Parameters<typeof import('./views').controller>[0]['fieldMeta'] => {
const adminMetaRoot = getAdminMetaForRelationshipField();
if (!meta.lists[foreignListKey]) {
throw new Error(
`The ref [${ref}] on relationship [${meta.listKey}.${meta.fieldKey}] is invalid`
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/lib/createGraphQLSchema.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { KeystoneConfig, AdminMetaRootVal } from '../types';
import type { KeystoneConfig } from '../types';
import { KeystoneMeta } from '../admin-ui/system';
import { graphql } from '../types/schema';
import { AdminMetaRootVal } from '../admin-ui/system/createAdminMeta';
import { InitialisedList } from './core/types-for-lists';
import { getGraphQLSchema } from './core/graphql-schema';

Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/scripts/run/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ import {
requirePrismaClient,
} from '../../artifacts';
import { ExitError, getAdminPath, getBuiltConfigPath } from '../utils';
import { AdminMetaRootVal, CreateContext, KeystoneConfig } from '../../types';
import { CreateContext, KeystoneConfig } from '../../types';
import { initialiseLists } from '../../lib/core/types-for-lists';
import { printPrismaSchema } from '../../lib/core/prisma-schema';
import { createSessionContext } from '../../lib/context/session';
import { AdminMetaRootVal } from '../../admin-ui/system/createAdminMeta';

const devLoadingHTMLFilepath = path.join(
path.dirname(require.resolve('@keystone-6/core/package.json')),
Expand Down
53 changes: 1 addition & 52 deletions packages/core/src/types/admin-meta.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import { GraphQLError } from 'graphql';
import type { ReactElement } from 'react';
import { MaybeItemFunction } from './config';
import { KeystoneContext } from './context';
import { BaseListTypeInfo } from './type-info';
import { GqlNames, JSONValue, MaybePromise } from './utils';
import { GqlNames, JSONValue } from './utils';

export type NavigationProps = {
authenticatedItem: AuthenticatedItem;
Expand Down Expand Up @@ -158,51 +155,3 @@ export type CardValueComponent<
any
>
> = (props: { item: Record<string, any>; field: ReturnType<FieldControllerFn> }) => ReactElement;

export type ContextFunction<Return> = (context: KeystoneContext) => MaybePromise<Return>;

// Types used on the server by the Admin UI schema resolvers
export type FieldMetaRootVal = {
path: string;
label: string;
description: string | null;
fieldMeta: JSONValue | null;
viewsIndex: number;
customViewsIndex: number | null;
listKey: string;
search: 'default' | 'insensitive' | null;
isOrderable: ContextFunction<boolean>;
isFilterable: ContextFunction<boolean>;
createView: { fieldMode: ContextFunction<'edit' | 'hidden'> };
// itemView is intentionally special because static values are special cased
// and fetched when fetching the static admin ui
itemView: { fieldMode: MaybeItemFunction<'edit' | 'read' | 'hidden', BaseListTypeInfo> };
listView: { fieldMode: ContextFunction<'read' | 'hidden'> };
};

export type ListMetaRootVal = {
key: string;
path: string;
label: string;
singular: string;
plural: string;
initialColumns: string[];
pageSize: number;
labelField: string;
initialSort: { field: string; direction: 'ASC' | 'DESC' } | null;
fields: Array<FieldMetaRootVal>;
itemQueryName: string;
listQueryName: string;
description: string | null;
isHidden: ContextFunction<boolean>;
hideCreate: ContextFunction<boolean>;
hideDelete: ContextFunction<boolean>;
isSingleton: boolean;
};

export type AdminMetaRootVal = {
lists: Array<ListMetaRootVal>;
listsByKey: Record<string, ListMetaRootVal>;
views: string[];
isAccessAllowed: undefined | ((context: KeystoneContext) => MaybePromise<boolean>);
};
4 changes: 2 additions & 2 deletions packages/core/src/types/next-fields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { graphql } from '..';
import { BaseListTypeInfo } from './type-info';
import { CommonFieldConfig } from './config';
import { DatabaseProvider } from './core';
import { AdminMetaRootVal, JSONValue, KeystoneContext, MaybePromise, StorageConfig } from '.';
import { JSONValue, KeystoneContext, MaybePromise, StorageConfig } from '.';

export { Decimal };

Expand Down Expand Up @@ -387,7 +387,7 @@ export type FieldTypeWithoutDBField<
output: FieldTypeOutputField<TDBField>;
views: string;
extraOutputFields?: Record<string, FieldTypeOutputField<TDBField>>;
getAdminMeta?: (adminMeta: AdminMetaRootVal) => JSONValue;
getAdminMeta?: () => JSONValue;
unreferencedConcreteInterfaceImplementations?: readonly graphql.ObjectType<any>[];
} & CommonFieldConfig<ListTypeInfo>;

Expand Down

0 comments on commit 267d8c1

Please sign in to comment.