Ініт-декоратори та ініт-хуки
Ініт-декоратори застосовуються до класів модулів, щоб передавати метадані з розширеними типами даних. Ініт-декоратори можуть виступати в трьох ролях:
- Як декоратор для кореневого модуля (розширюючи тип даних, що передається в декоратор
rootModule). Наприклад,restRootModule- це ініт-декоратор, в який можна передавати метадані з розширеним типом даних. - Як декоратор для модуля фіч (розширюючи тип даних, що передається в декоратор
featureModule). Наприклад,restModule- це ініт-декоратор, в який можна передавати метадані з розширеним типом даних. - Як декоратор для розширення кореневого модуля, чи модуля фіч. В такому разі рекомендується давати ім'я декоратору з префіксом
init*, наприкладinitRest,initTrpc,initGraphqlі т.п. В цій ролі, зразу декілька ініт-декораторів можна застосовувати до одного класу модуля.
Оскільки ініт-декоратори приймають метадані модуля з розширеним типом, вони повинні мати можливість нормалізувати ці метадані, а також робити їхню валідацію. Це можна зробити через так звані ініт-хуки, які передаються у трансформерах під час створення декораторів класу. Кожен трансформер, що використовується для ініт-декоратора, повинен повертати інстанс класу, який розширює InitHooks:
import { InitHooks, InitDecorator, makeClassDecorator } from '@ditsmod/core';
// ...
// Методи цього класу будуть нормалізувати метадані модуля, а також робитимуть їхню валідацію
class SomeInitHooks extends InitHooks<SomeInitRawMeta> {
// ...
}
// Трансформер ініт-декоратора
function getInitHooks(data?: RawMetadata): InitHooks<RawMetadata> {
const metadata = Object.assign({}, data);
const initHooks = new SomeInitHooks(metadata);
initHooks.moduleRole = undefined;
// OR initHooks.moduleRole = 'root';
// OR initHooks.moduleRole = 'feature';
return initHooks;
}
// Створення ініт-декоратора
const initSome: InitDecorator<RawMetadata, InitParams, InitMeta> = makeClassDecorator(getInitHooks);
Готовий приклад створення ініт-декоратора можна знайти в тестах репозиторія Ditsmod. Окрім цього, можна проглянути на більш складний, але і більш повний приклад створення ініт-декораторів (restRootModule, restModule та initRest), які знаходяться у модулі @ditsmod/rest.
Якщо для передачі метаданих до модуля ви легко можете обійтись модулем з параметрами, в такому разі не рекомендується створювати ініт-декоратор. Тобто, кожен раз, коли ви хочете створити ініт-декоратор, спочатку оцініть можливість використання модуля з параметрами.