diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts index 62ece69d2d..4bfc4cfe6b 100644 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ b/packages/core/strapi/lib/core-api/controller/index.d.ts @@ -1,6 +1,5 @@ import { Context, Next } from 'koa'; - -type ControllerResponse = T | Promise | undefined; +import { ControllerHandler } from '../../types/core/common'; interface Controller { transformResponse(data: object, meta: object): object; @@ -9,19 +8,19 @@ interface Controller { } export interface SingleTypeController extends Controller { - find?(ctx: Context, next: Next): ControllerResponse; - update?(ctx: Context, next: Next): ControllerResponse; - delete?(ctx: Context, next: Next): ControllerResponse; + find?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export interface CollectionTypeController extends Controller { - find?(ctx: Context, next: Next): ControllerResponse; - findOne?(ctx: Context, next: Next): ControllerResponse; - create?(ctx: Context, next: Next): ControllerResponse; - update?(ctx: Context, next: Next): ControllerResponse; - delete?(ctx: Context, next: Next): ControllerResponse; + find?: ControllerHandler; + findOne?: ControllerHandler; + create?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context) => unknown; + [method: string | number | symbol]: ControllerHandler; }; diff --git a/packages/core/strapi/lib/core-api/service/index.d.ts b/packages/core/strapi/lib/core-api/service/index.d.ts index a507857b71..0dcd982ca8 100644 --- a/packages/core/strapi/lib/core-api/service/index.d.ts +++ b/packages/core/strapi/lib/core-api/service/index.d.ts @@ -18,8 +18,6 @@ export interface CollectionTypeService extends BaseService { delete?(entityId: string, params: object): Promise | Entity; } -export type Service = SingleTypeService | CollectionTypeService; - -export type GenericService = Partial & { +export type GenericService = { [method: string | number | symbol]: (...args: any) => any; }; diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 2fc6e04aa8..41db777ed2 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -21,7 +21,7 @@ interface CustomFieldServerOptions { * The existing Strapi data type the custom field uses */ type: string; - + /** * Settings for the input size in the Admin UI */ @@ -81,12 +81,12 @@ export interface Strapi { * * It returns all the registered controllers */ - readonly controllers: StringMap; + readonly controllers: StringMap; // TODO type this better (?) /** * Find a controller using its unique identifier */ - controller(uid: string): GenericController | undefined; + controller(uid: string): GenericController | undefined; // TODO type this better (?) /** * Getter for the Strapi content types container diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 64156bbb36..56652876c8 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -1,12 +1,15 @@ -import { Service, GenericService } from '../core-api/service'; -import { Controller, GenericController } from '../core-api/controller'; +import { GenericService, CollectionTypeService, SingleTypeService } from '../core-api/service'; +import { + CollectionTypeController, + SingleTypeController, + Controller, + GenericController, +} from '../core-api/controller'; import { Middleware } from '../middlewares'; import { Policy } from '../core/registries/policies'; import { Strapi } from './core/strapi'; - -type ControllerConfig = T; - -type ServiceConfig = Service; +import { SchemaUID } from './utils'; +import { UID } from './core'; type HandlerConfig = { auth?: false | { scope: string[] }; @@ -28,11 +31,12 @@ type CollectionTypeRouterConfig = { delete?: HandlerConfig; }; -type RouterConfig = { +type RouterConfig = { prefix?: string; + // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; - config: SingleTypeRouterConfig | CollectionTypeRouterConfig; + config: T; }; interface Route { @@ -49,12 +53,41 @@ type ControllerCallback = (para }) => T; type ServiceCallback = (params: { strapi: Strapi }) => T; -export function createCoreRouter(uid: string, cfg?: RouterConfig = {}): () => Router; -export function createCoreController( - uid: string, - cfg?: ControllerCallback | T = {} -): () => T & Controller; -export function createCoreService( - uid: string, - cfg?: ServiceCallback | T = {} -): () => T; +export declare function createCoreRouter( + uid: T, + cfg?: RouterConfig = {} +): () => Router; + +export declare function createCoreController< + T extends UID.ContentType, + S extends Partial> +>(uid: T, cfg?: ControllerCallback | S): () => Required>; + +export declare function createCoreService< + T extends UID.ContentType, + S extends Partial> +>(uid: T, cfg?: ServiceCallback | S): () => Required>; + +type GetBaseSchemaController = IsCollectionType< + T, + CollectionTypeController, + SingleTypeController +> & + GenericController; + +type GetBaseSchemaService = IsCollectionType< + T, + CollectionTypeService, + SingleTypeService +> & + GenericService; + +type GetBaseConfig = IsCollectionType< + T, + CollectionTypeRouterConfig, + SingleTypeRouterConfig +>; + +type IsCollectionType = T extends Strapi.CollectionTypeUIDs + ? Y + : N;