@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
125 lines (122 loc) • 7.41 kB
JavaScript
import '../../../../enum/decorator/api/action.enum.js';
import '../../../../enum/decorator/api/authentication-type.enum.js';
import '../../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js';
import '../../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js';
import '../../../../enum/decorator/api/controller/relation-reference-shape.enum.js';
import '../../../../enum/decorator/api/controller/request/target.enum.js';
import '../../../../enum/decorator/api/controller/request/transformer-type.enum.js';
import '../../../../enum/decorator/api/controller/response-target.enum.js';
import { EApiDtoType } from '../../../../enum/decorator/api/dto-type.enum.js';
import '../../../../enum/decorator/api/function/context-storage-kind.enum.js';
import '../../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js';
import '../../../../enum/decorator/api/function/transaction/event-status.enum.js';
import '../../../../enum/decorator/api/function/transaction/failure-stage.enum.js';
import '../../../../enum/decorator/api/function/transaction/mode.enum.js';
import '../../../../enum/decorator/api/function/transaction/outcome.enum.js';
import '../../../../enum/decorator/api/function/transaction/owner-kind.enum.js';
import '../../../../enum/decorator/api/function/transaction/trace-type.enum.js';
import '../../../../enum/decorator/api/function/type.enum.js';
import '../../../../enum/decorator/api/on-type.enum.js';
import '../../../../enum/decorator/api/property/data-type.enum.js';
import '../../../../enum/decorator/api/property/date/identifier.enum.js';
import '../../../../enum/decorator/api/property/date/type.enum.js';
import '../../../../enum/decorator/api/property/desribe-type.enum.js';
import '../../../../enum/decorator/api/property/number-type.enum.js';
import '../../../../enum/decorator/api/property/string-type.enum.js';
import '../../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js';
import { EApiRouteType } from '../../../../enum/decorator/api/route/type.enum.js';
import { CamelCaseString } from '../../../camel-case-string.utility.js';
import '../../../../constant/utility/dto/constant.js';
import { DtoGenerate } from '../../../dto/generate/core.utility.js';
import '@nestjs/swagger';
import '../../../../external/tslib/tslib.es6.js';
import '../../../../class/utility/dto/exception/details/foreign-key-violation.class.js';
import '../../../../class/utility/dto/exception/details/unique-violation.class.js';
import '../../../../enum/utility/manual-dto-property-metadata-decorator.enum.js';
import '@nestjs/common';
import 'class-transformer';
import 'class-validator';
import 'lodash/random.js';
import '@nestjs/swagger/dist/constants.js';
import '../../../../validator/must-match-one-of-schemas.validator.js';
import '../../../../constant/interface/api/property/default-string-format.constant.js';
import '../../../../validator/is-regular-expression.validator.js';
import 'node:crypto';
import '../../../../enum/utility/exception-details-type.enum.js';
import '../../../../enum/filter/operand.enum.js';
import '../../../../enum/filter/operation.enum.js';
import '../../../../enum/filter/order-direction.enum.js';
import { DtoGenerateGetListResponse } from '../../../dto/generate/get-list-response.utility.js';
import '../../../../constant/decorator/api/function.constant.js';
import 'typeorm';
import 'reflect-metadata';
import '../../../../validator/all-or-none-of-listed-properties.validator.js';
const getListItemResponseDtoCache = new Map();
/**
* Resolves a DTO class for a generated controller route.
* Prefers an explicitly configured DTO and falls back to auto-generation.
* @param {IApiControllerProperties<E>} properties - Controller configuration
* @param {IApiEntity<E>} entity - Entity metadata
* @param {R} method - Route type
* @param {EApiDtoType} dtoType - DTO kind to resolve
* @param {TApiControllerPropertiesRoute<E, R>} routeConfig - Route-specific configuration
* @param {IApiControllerGetListQueryPlan} [queryPlan] - Route-scoped plan for dynamic GET_LIST QUERY DTO generation.
* @returns {Type<unknown> | undefined} -The resolved DTO class or undefined if no DTO is configured
* @template E - Entity type
* @template R - Route type
*/
function ApiControllerGetDto(properties, entity, method, dtoType, routeConfig, queryPlan) {
const configuredDto = routeConfig.dto?.[dtoType];
if (configuredDto) {
if (method === EApiRouteType.GET_LIST && dtoType === EApiDtoType.RESPONSE && isGetListResponseDtoConfig(configuredDto)) {
return getGetListItemResponseDto(properties.entity, entity, configuredDto, method, dtoType);
}
return configuredDto;
}
const effectiveQueryPlan = method === EApiRouteType.GET_LIST && dtoType === EApiDtoType.QUERY ? queryPlan : undefined;
return DtoGenerate(properties.entity, entity, method, dtoType, routeConfig.autoDto?.[dtoType], routeConfig.security?.authentication?.guard, effectiveQueryPlan);
}
/**
* Builds a stable generated wrapper class name for GET_LIST custom item response DTOs.
* @param {IApiEntity<E>} entity - Entity metadata used for the resource name.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config.
* @param {EApiRouteType} method - Current route type.
* @param {EApiDtoType} dtoType - Current DTO type.
* @returns {string} Generated wrapper DTO class name.
* @template E - Entity type.
*/
function buildGetListItemResponseDtoName(entity, config, method, dtoType) {
return config.name ?? `${entity.name ?? "UnknownResource"}${CamelCaseString(method)}${CamelCaseString(dtoType)}${config.itemType.name}`;
}
/**
* Generates or returns a cached list wrapper around a configured custom item response DTO.
* @param {ObjectLiteral} resourceClass - Entity class used for wrapper metadata.
* @param {IApiEntity<E>} entity - Entity metadata used for naming.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config.
* @param {EApiRouteType} method - Current route type.
* @param {EApiDtoType} dtoType - Current DTO type.
* @returns {Type<unknown>} Generated list wrapper DTO class.
* @template E - Entity type.
*/
function getGetListItemResponseDto(resourceClass, entity, config, method, dtoType) {
const name = buildGetListItemResponseDtoName(entity, config, method, dtoType);
const cacheKey = `${entity.name ?? "UnknownResource"}_${config.itemType.name}_${name}`;
const cached = getListItemResponseDtoCache.get(cacheKey);
if (cached) {
return cached;
}
// @ts-ignore The existing list wrapper generator accepts the entity constructor at runtime.
const dto = DtoGenerateGetListResponse(resourceClass, config.itemType, name);
getListItemResponseDtoCache.set(cacheKey, dto);
return dto;
}
/**
* Returns whether a route response DTO config describes a custom GET_LIST item DTO.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig | Type<unknown>} value - Configured response DTO value.
* @returns {boolean} Whether the value is the item DTO config shape.
*/
function isGetListResponseDtoConfig(value) {
return typeof value === "object" && "itemType" in value && typeof value.itemType === "function";
}
export { ApiControllerGetDto };
//# sourceMappingURL=dto.utility.js.map