import type { EndpointInterface, EndpointToFunction, } from '@data-client/endpoint'; import { OptionsToFunction } from './OptionsToFunction.js'; import type { ResourcePath } from './pathTypes.js'; import { Extendable } from './resourceExtendable.js'; import { ResourceGenerics, ResourceInterface } from './resourceTypes.js'; import type { PartialRestGenerics, RestExtendedEndpoint, RestInstanceBase, RestEndpointOptions, } from './RestEndpoint.js'; export type ResourceExtension< R extends { [K in ExtendKey]: RestInstanceBase }, ExtendKey extends Exclude, 'extend'>, O extends PartialRestGenerics | {}, > = { [K in keyof R]: K extends ExtendKey ? RestExtendedEndpoint : R[K]; }; /** Resource with individual endpoints customized * */ export interface CustomResource< R extends ResourceInterface, O extends ResourceGenerics = { path: ResourcePath; schema: any }, Get extends PartialRestGenerics | {} = any, GetList extends PartialRestGenerics | {} = any, Update extends PartialRestGenerics | {} = any, PartialUpdate extends PartialRestGenerics | {} = any, Delete extends PartialRestGenerics | {} = any, > extends Extendable { // unknown only extends any. this allows us to match exclusively on members not set get: unknown extends Get ? R['get'] : PartialRestGenerics extends Get ? R['get'] : RestExtendedEndpoint; getList: unknown extends GetList ? R['getList'] : PartialRestGenerics extends GetList ? R['getList'] : RestExtendedEndpoint; update: unknown extends Update ? R['update'] : PartialRestGenerics extends Update ? R['update'] : RestExtendedEndpoint; partialUpdate: unknown extends PartialUpdate ? R['partialUpdate'] : PartialRestGenerics extends PartialUpdate ? R['partialUpdate'] : RestExtendedEndpoint; delete: unknown extends Delete ? R['delete'] : PartialRestGenerics extends Delete ? R['delete'] : RestExtendedEndpoint; } export type ExtendedResource< R extends ResourceInterface, T extends Record, > = Omit & T; export interface ResourceEndpointExtensions< R extends ResourceInterface, Get extends PartialRestGenerics = {}, GetList extends PartialRestGenerics = {}, Update extends PartialRestGenerics = {}, PartialUpdate extends PartialRestGenerics = {}, Delete extends PartialRestGenerics = {}, > { readonly get?: RestEndpointOptions< unknown extends Get ? EndpointToFunction : OptionsToFunction>, R['get']['schema'] > & Readonly; readonly getList?: RestEndpointOptions< unknown extends GetList ? EndpointToFunction : OptionsToFunction< GetList, R['getList'], EndpointToFunction >, R['getList']['schema'] > & Readonly; readonly update?: RestEndpointOptions< unknown extends Update ? EndpointToFunction : OptionsToFunction>, R['update']['schema'] > & Readonly; readonly partialUpdate?: RestEndpointOptions< unknown extends PartialUpdate ? EndpointToFunction : OptionsToFunction< PartialUpdate, R['partialUpdate'], EndpointToFunction >, R['partialUpdate']['schema'] > & Readonly; readonly delete?: RestEndpointOptions< unknown extends Delete ? EndpointToFunction : OptionsToFunction>, R['delete']['schema'] > & Readonly; }