Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 95x 95x 95x 95x 95x 95x 95x 95x 95x 95x 95x 95x 95x 95x | import { Registration, Registry } from './registry'; /** * Unique symbol used as property key by the {@link Provide} type constraint. */ export const provide = Symbol('@sgrud/core/super/provide'); /** * Type helper enforcing the {@link provide} symbol property to contain a magic * string (typed as {@link Registration}) on base constructors decorated with * the corresponding {@link Provide} decorator. The **Provide** type helper is * also used by the {@link Provider} decorator. * * @typeParam K - The magic string {@link Registration} type. * @typeParam V - The registered class constructor type. * * @see {@link Provide} */ export type Provide< K extends Registration, V extends abstract new (...args: any[]) => InstanceType<V> > = (abstract new (...args: any[]) => InstanceType<V>) & { /** * Enforced contract. This **provide** symbol property must be typed as * {@link Registration} and assigned a magic string used by the * {@link Provider} to lookup the providing class. */ readonly [provide]: K extends Registration ? K : Registration; }; /** * Class decorator factory. **Provide**s the decorated class to extending * classes. Applying the **Provide** decorator enforces the {@link Provide} type * which entails the declaration of a static {@link provide} property typed as * {@link Registration}. The magic string assigned to this static property is * used by the {@link Provider} factory function to get base classes from the * {@link Registry}. * * @typeParam K - The magic string {@link Registration} type. * @typeParam V - The registered class constructor type. * @returns A class constructor decorator. * * @example * **Provide** a base class: * ```ts * import { Provide, provide } from '@sgrud/core'; * * @Provide() * export abstract class Base { * * public static readonly [provide] = 'sgrud.example.Base' as const; * * } * ``` * * @see {@link Provider} * @see {@link Registry} */ export function Provide< V extends Provide<K, V>, K extends Registration = V[typeof provide] >() { /** * @param constructor - The class `constructor` to be decorated. */ return function(constructor: V): void { new Registry([ [constructor[provide], constructor] ]); }; } |