# All files / core metadata-scanner.ts

100% Statements 11/11
100% Branches 8/8
100% Functions 4/4
100% Lines 11/11

    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
    391x

    1x

    1x

    67x

    18x

    67x
    68x

    98x
    98x
    8x

    90x

     import iterate from 'iterare';
    import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
    import {
      isConstructor,
      isFunction,
      isNil,
    } from '@nestjs/common/utils/shared.utils';

    export class MetadataScanner {
      public scanFromPrototype<T extends Injectable, R>(
        instance: T,
        prototype,
        callback: (name: string) => R,
      ): R[] {
        return iterate([...this.getAllFilteredMethodNames(prototype)])
          .map(callback)
          .filter(metadata => !isNil(metadata))
          .toArray();
      }

      *getAllFilteredMethodNames(prototype): IterableIterator<string> {
        do {
          yield* iterate(Object.getOwnPropertyNames(prototype))
            .filter(prop => {
              const descriptor = Object.getOwnPropertyDescriptor(prototype, prop);
              if (descriptor.set || descriptor.get) {
                return false;
              }
              return !isConstructor(prop) && isFunction(prototype[prop]);
            })
            .toArray();
        } while (
          // tslint:disable-next-line:no-conditional-assignment
          (prototype = Reflect.getPrototypeOf(prototype)) &&
          prototype !== Object.prototype
        );
      }
    }