diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts deleted file mode 100644 index 42f65235a0..0000000000 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Context, Next } from 'koa'; -import { ControllerHandler } from '../../types/core/common'; - -interface Controller { - transformResponse(data: object, meta: object): object; - sanitizeOutput(data: object, ctx: Context): Promise; - sanitizeInput(data: object, ctx: Context): Promise; -} - -export interface SingleTypeController extends Controller { - find?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; -} - -export interface CollectionTypeController extends Controller { - find?: ControllerHandler; - findOne?: ControllerHandler; - create?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; -} - -export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context, next?: Next) => unknown; -}; diff --git a/packages/core/strapi/lib/factories.d.ts b/packages/core/strapi/lib/factories.d.ts new file mode 100644 index 0000000000..bd120a50f8 --- /dev/null +++ b/packages/core/strapi/lib/factories.d.ts @@ -0,0 +1,82 @@ +import type { Common, CoreApi, Strapi } from '@strapi/strapi'; + +type WithStrapiCallback = (params: S) => T; + +// type HandlerConfig = { +// auth?: false | { scope: string[] }; +// policies?: Array; +// middlewares?: Array; +// }; + +// type SingleTypeRouterConfig = { +// find?: HandlerConfig; +// update?: HandlerConfig; +// delete?: HandlerConfig; +// }; + +// type CollectionTypeRouterConfig = { +// find?: HandlerConfig; +// findOne?: HandlerConfig; +// create?: HandlerConfig; +// update?: HandlerConfig; +// delete?: HandlerConfig; +// }; + +// type RouterConfig = { +// prefix?: string; +// // TODO Refactor when we have a controller registry +// only?: string[]; +// except?: string[]; +// config: T; +// }; + +// interface Route { +// method: string; +// path: string; +// } +// interface Router { +// prefix: string; +// routes: Route[]; +// } + +// export declare function createCoreRouter( +// uid: T, +// cfg?: RouterConfig = {} +// ): () => Router; + +export declare function createCoreController< + T extends Common.UID.ContentType, + S extends Partial> +>( + uid: T, + config?: WithStrapiCallback | S +): () => Required>; + +// export declare function createCoreService< +// T extends Common.UID.ContentType, +// S extends Partial> +// >(uid: T, config?: WithStrapiCallback | 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; diff --git a/packages/core/strapi/lib/index.d.ts b/packages/core/strapi/lib/index.d.ts index 1f7f33cd14..9b0fecd589 100644 --- a/packages/core/strapi/lib/index.d.ts +++ b/packages/core/strapi/lib/index.d.ts @@ -1,5 +1,6 @@ import './global'; export * from './types'; +export * as factories from './factories'; -export default function (opts): Strapi; +export default function (opts): Strapi.Strapi; diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts new file mode 100644 index 0000000000..34775a28ba --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -0,0 +1,57 @@ +import type { Common, Schema, Shared } from '@strapi/strapi'; +import type { ExtendableContext } from 'koa'; + +/** + * Base Core-API controller type + * + * TODO: Make use of the T generic to type the other methods based on the given content type + */ +export interface Base { + // TODO: Use actual entities instead of regular object + transformResponse(data: U, meta: object): P; + sanitizeOutput(data: U, ctx: ExtendableContext): Promise; + sanitizeInput(data: U, ctx: ExtendableContext): Promise; + sanitizeQuery(data: U, ctx: ExtendableContext): Promise; +} + +/** + * Generic controller structure + */ +export type Generic = { + [name: string]: Common.ControllerHandler; +}; + +/** + * Core-API collection type controller + */ +export type CollectionType = Base & { + find?: Common.ControllerHandler; + findOne?: Common.ControllerHandler; + create?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; +}; + +/** + * Core-API single type controller + */ +export type SingleType = Base & { + find?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; +}; + +export type ContentType = + // Checks that the content type exists in the shared registry + Shared.ContentTypes[T] extends infer S extends Schema.Schema + ? S extends Schema.CollectionType + ? CollectionType + : S extends Schema.SingleType + ? SingleType + : // This should never happen. It would mean a schema (other than collection type + // or a single type has been registered to the shared content-type registry) + never + : // If it doesn't exist, return a base controller + Base; + +export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/core-api/index.d.ts b/packages/core/strapi/lib/types/core-api/index.d.ts new file mode 100644 index 0000000000..8213cb2aee --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/index.d.ts @@ -0,0 +1 @@ +export * as Controller from './controller'; diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 1fcdc96b2f..91f5678ea4 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,6 +1,6 @@ import type { ExtendableContext, Next } from 'koa'; -export type ControllerHandler = ( +export type ControllerHandler = ( context: ExtendableContext, next: Next ) => Promise | T | void; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index 5ef444cc1b..881659678f 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -16,12 +16,18 @@ export type Policy = Registry.Keys; export type Middleware = Registry.Keys; export type ContentType = Registry.Keys; -export type CollectionType = Extract< - Utils.Object.KeysBy, + +export type CollectionType = Utils.Guard.Never< + // extract uids only for collection types + Extract, ContentType>, + // if no collection type is found (never), fallback to a generic content type uid ContentType >; -export type SingleType = Extract< - Utils.Object.KeysBy, + +export type SingleType = Utils.Guard.Never< + // extract uids only for single types + Extract, ContentType>, + // if no single type is found (never), fallback to a generic content type uid ContentType >; 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 548c68145c..17ee55f174 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -1,8 +1,5 @@ -import { Database } from '@strapi/database'; - +import type { Database } from '@strapi/database'; import type { Shared, Common } from '@strapi/strapi'; -import type { GenericController } from '../../../core-api/controller'; -import type { GenericService } from '../../../core-api/service'; // TODO move custom fields types to a separate file interface CustomFieldServerOptions { @@ -73,7 +70,7 @@ export interface Strapi { /** * Find a service using its unique identifier */ - service(uid: string): T | undefined; + service(uid: string): T | undefined; /** * Getter for the Strapi controllers container diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts deleted file mode 100644 index 56652876c8..0000000000 --- a/packages/core/strapi/lib/types/factories.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -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'; -import { SchemaUID } from './utils'; -import { UID } from './core'; - -type HandlerConfig = { - auth?: false | { scope: string[] }; - policies?: Array; - middlewares?: Array; -}; - -type SingleTypeRouterConfig = { - find?: HandlerConfig; - update?: HandlerConfig; - delete?: HandlerConfig; -}; - -type CollectionTypeRouterConfig = { - find?: HandlerConfig; - findOne?: HandlerConfig; - create?: HandlerConfig; - update?: HandlerConfig; - delete?: HandlerConfig; -}; - -type RouterConfig = { - prefix?: string; - // TODO Refactor when we have a controller registry - only?: string[]; - except?: string[]; - config: T; -}; - -interface Route { - method: string; - path: string; -} -interface Router { - prefix: string; - routes: Route[]; -} - -type ControllerCallback = (params: { - strapi: Strapi; -}) => T; -type ServiceCallback = (params: { strapi: Strapi }) => 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; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 29b49fcbba..780786a88e 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -1,7 +1,6 @@ // Exports from core should already be modules export * from './core'; +export * as CoreApi from './core-api'; export * as Utils from './utils'; export * as Shared from './shared'; - -export * as factories from './factories';