Best JavaScript code snippet using ng-mocks
collect-declarations.ts
Source:collect-declarations.ts  
1import { ɵReflectionCapabilities as ReflectionCapabilities } from '@angular/core';2import coreDefineProperty from '../common/core.define-property';3import { AnyDeclaration } from '../common/core.types';4interface Declaration {5  host: Record<string, string | undefined>;6  hostBindings: Array<[string, string?, ...any[]]>;7  hostListeners: Array<[string, string?, ...any[]]>;8  attributes: string[];9  inputs: string[];10  outputs: string[];11  propDecorators: Record<string, any[]>;12  queries: Record<string, any>;13  decorators: Array<'Injectable' | 'Pipe' | 'Directive' | 'Component' | 'NgModule'>;14  [key: string]: any;15}16const pushDecorator = (decorators: string[], decorator: string): void => {17  const deleteIndex = decorators.indexOf(decorator);18  if (deleteIndex !== -1) {19    decorators.splice(deleteIndex, 1);20  }21  if (22    decorator === 'Injectable' ||23    decorator === 'Pipe' ||24    decorator === 'Directive' ||25    decorator === 'Component' ||26    decorator === 'NgModule'27  ) {28    decorators.push(decorator);29  }30};31const getAllKeys = <T extends Record<keyof any, any>>(instance: T): Array<keyof T> => {32  const props: string[] = [];33  for (const key of Object.keys(instance)) {34    props.push(key);35  }36  return props as never;37};38const createDeclarations = (parent: Partial<Declaration>): Declaration => ({39  host: parent.host ? { ...parent.host } : {},40  hostBindings: parent.hostBindings ? [...parent.hostBindings] : [],41  hostListeners: parent.hostListeners ? [...parent.hostListeners] : [],42  attributes: parent.attributes ? [...parent.attributes] : [],43  inputs: parent.inputs ? [...parent.inputs] : [],44  outputs: parent.outputs ? [...parent.outputs] : [],45  propDecorators: parent.propDecorators ? { ...parent.propDecorators } : {},46  queries: parent.queries ? { ...parent.queries } : {},47  decorators: parent.decorators ? [...parent.decorators] : [],48});49const parseParameters = (50  def: {51    __parameters__?: Array<null | Array<52      | {53          attributeName: string;54          ngMetadataName: 'Attribute';55        }56      | {57          token: AnyDeclaration<any>;58          ngMetadataName: 'Inject';59        }60      | {61          ngMetadataName: 'Optional';62        }63    >>;64  },65  declaration: Declaration,66): void => {67  if (Object.prototype.hasOwnProperty.call(def, '__parameters__') && def.__parameters__) {68    for (const decorators of def.__parameters__) {69      for (const decorator of decorators || []) {70        if (71          decorator.ngMetadataName === 'Attribute' &&72          declaration.attributes.indexOf(decorator.attributeName) === -173        ) {74          declaration.attributes.push(decorator.attributeName);75        }76      }77    }78  }79};80const parseAnnotations = (81  def: {82    __annotations__?: Array<{83      ngMetadataName?: string;84    }>;85  },86  declaration: Declaration,87): void => {88  if (Object.prototype.hasOwnProperty.call(def, '__annotations__') && def.__annotations__) {89    for (const annotation of def.__annotations__) {90      const ngMetadataName = annotation?.ngMetadataName;91      if (!ngMetadataName) {92        continue;93      }94      declaration[ngMetadataName] = { ...annotation, attributes: declaration.attributes };95      pushDecorator(declaration.decorators, ngMetadataName);96    }97  }98};99const parseDecorators = (100  def: {101    decorators?: Array<{102      args?: [any];103      type?: {104        prototype?: {105          ngMetadataName?: string;106        };107      };108    }>;109  },110  declaration: Declaration,111): void => {112  if (Object.prototype.hasOwnProperty.call(def, 'decorators') && def.decorators) {113    for (const decorator of def.decorators) {114      const ngMetadataName = decorator?.type?.prototype?.ngMetadataName;115      if (!ngMetadataName) {116        continue;117      }118      declaration[ngMetadataName] = decorator.args ? { ...decorator.args[0] } : {};119      pushDecorator(declaration.decorators, ngMetadataName);120    }121  }122};123const parsePropDecoratorsParserFactoryProp =124  (key: 'inputs' | 'outputs') =>125  (126    _: string,127    prop: string,128    decorator: {129      args?: [string];130    },131    declaration: Declaration,132  ): void => {133    const value = prop + (decorator.args?.[0] ? `: ${decorator.args[0]}` : '');134    if (declaration[key].indexOf(value) === -1) {135      declaration[key].unshift(value);136    }137  };138const parsePropDecoratorsParserInput = parsePropDecoratorsParserFactoryProp('inputs');139const parsePropDecoratorsParserOutput = parsePropDecoratorsParserFactoryProp('outputs');140const parsePropDecoratorsParserFactoryQuery =141  (isViewQuery: boolean) =>142  (143    ngMetadataName: string,144    prop: string,145    decorator: {146      args: [string] | [string, any];147    },148    declaration: Declaration,149  ): void => {150    if (!declaration.queries[prop]) {151      declaration.queries[prop] = {152        isViewQuery,153        ngMetadataName,154        selector: decorator.args[0],155        ...decorator.args[1],156      };157    }158  };159const parsePropDecoratorsParserContent = parsePropDecoratorsParserFactoryQuery(false);160const parsePropDecoratorsParserView = parsePropDecoratorsParserFactoryQuery(true);161const parsePropDecoratorsParserHostBinding = (162  _: string,163  prop: string,164  decorator: {165    args?: [string] | [string, any[]];166  },167  declaration: Declaration,168): void => {169  const key = `[${decorator.args?.[0] || prop}]`;170  if (!declaration.host[key]) {171    declaration.host[key] = prop;172  }173  declaration.hostBindings.push([prop, ...(decorator.args || [])]);174};175const parsePropDecoratorsParserHostListener = (176  _: string,177  prop: string,178  decorator: {179    args?: any[];180  },181  declaration: Declaration,182): void => {183  const key = `(${decorator.args?.[0] || prop})`;184  if (!declaration.host[key]) {185    declaration.host[key] = `${prop}($event)`;186  }187  declaration.hostListeners.push([prop, ...(decorator.args || [])]);188};189const parsePropDecoratorsMap: any = {190  ContentChild: parsePropDecoratorsParserContent,191  ContentChildren: parsePropDecoratorsParserContent,192  HostBinding: parsePropDecoratorsParserHostBinding,193  HostListener: parsePropDecoratorsParserHostListener,194  Input: parsePropDecoratorsParserInput,195  Output: parsePropDecoratorsParserOutput,196  ViewChild: parsePropDecoratorsParserView,197  ViewChildren: parsePropDecoratorsParserView,198};199const parsePropDecorators = (200  def: {201    propDecorators?: Record<202      string,203      Array<{204        args: any;205        type?: {206          prototype?: {207            ngMetadataName?: string;208          };209        };210      }>211    >;212  },213  declaration: Declaration,214): void => {215  if (Object.prototype.hasOwnProperty.call(def, 'propDecorators') && def.propDecorators) {216    for (const prop of getAllKeys(def.propDecorators)) {217      declaration.propDecorators[prop] = [...(declaration.propDecorators[prop] || []), ...def.propDecorators[prop]];218      for (const decorator of def.propDecorators[prop]) {219        const ngMetadataName = decorator?.type?.prototype?.ngMetadataName;220        if (!ngMetadataName) {221          continue;222        }223        parsePropDecoratorsMap[ngMetadataName]?.(ngMetadataName, prop, decorator, declaration);224      }225    }226  }227};228const parsePropMetadataParserFactoryProp =229  (key: 'inputs' | 'outputs') =>230  (231    _: string,232    prop: string,233    decorator: {234      bindingPropertyName?: string;235    },236    declaration: Declaration,237  ): void => {238    const value = prop + (decorator.bindingPropertyName ? `: ${decorator.bindingPropertyName}` : '');239    if (declaration[key].indexOf(value) === -1) {240      declaration[key].unshift(value);241    }242  };243const parsePropMetadataParserInput = parsePropMetadataParserFactoryProp('inputs');244const parsePropMetadataParserOutput = parsePropMetadataParserFactoryProp('outputs');245const parsePropMetadataParserFactoryQueryChild =246  (isViewQuery: boolean) =>247  (248    ngMetadataName: string,249    prop: string,250    decorator: {251      read?: any;252      selector: string;253      static?: boolean;254    },255    declaration: Declaration,256  ): void => {257    if (!declaration.queries[prop]) {258      declaration.queries[prop] = {259        isViewQuery,260        ngMetadataName,261        selector: decorator.selector,262        ...(decorator.read !== undefined ? { read: decorator.read } : {}),263        ...(decorator.static !== undefined ? { static: decorator.static } : {}),264      };265    }266  };267const parsePropMetadataParserContentChild = parsePropMetadataParserFactoryQueryChild(false);268const parsePropMetadataParserViewChild = parsePropMetadataParserFactoryQueryChild(true);269const parsePropMetadataParserFactoryQueryChildren =270  (isViewQuery: boolean) =>271  (272    ngMetadataName: string,273    prop: string,274    decorator: {275      descendants?: any;276      emitDistinctChangesOnly?: boolean;277      read?: any;278      selector: string;279    },280    declaration: Declaration,281  ): void => {282    if (!declaration.queries[prop]) {283      declaration.queries[prop] = {284        isViewQuery,285        ngMetadataName,286        selector: decorator.selector,287        ...(decorator.descendants !== undefined ? { descendants: decorator.descendants } : {}),288        ...(decorator.emitDistinctChangesOnly !== undefined289          ? { emitDistinctChangesOnly: decorator.emitDistinctChangesOnly }290          : {}),291        ...(decorator.read !== undefined ? { read: decorator.read } : {}),292      };293    }294  };295const parsePropMetadataParserContentChildren = parsePropMetadataParserFactoryQueryChildren(false);296const parsePropMetadataParserViewChildren = parsePropMetadataParserFactoryQueryChildren(true);297const parsePropMetadataParserHostBinding = (298  _: string,299  prop: string,300  decorator: {301    args?: any;302    hostPropertyName?: string;303  },304  declaration: Declaration,305): void => {306  const key = `[${decorator.hostPropertyName || prop}]`;307  if (!declaration.host[key]) {308    declaration.host[key] = prop;309  }310  declaration.hostBindings.push([311    prop,312    decorator.hostPropertyName || prop,313    ...(decorator.args ? [decorator.args] : []),314  ]);315};316const parsePropMetadataParserHostListener = (317  _: string,318  prop: string,319  decorator: {320    args?: any;321    eventName?: string;322  },323  declaration: Declaration,324): void => {325  const key = `(${decorator.eventName || prop})`;326  if (!declaration.host[key]) {327    declaration.host[key] = `${prop}($event)`;328  }329  declaration.hostListeners.push([prop, decorator.eventName || prop, ...(decorator.args ? [decorator.args] : [])]);330};331const parsePropMetadataMap: any = {332  ContentChild: parsePropMetadataParserContentChild,333  ContentChildren: parsePropMetadataParserContentChildren,334  HostBinding: parsePropMetadataParserHostBinding,335  HostListener: parsePropMetadataParserHostListener,336  Input: parsePropMetadataParserInput,337  Output: parsePropMetadataParserOutput,338  ViewChild: parsePropMetadataParserViewChild,339  ViewChildren: parsePropMetadataParserViewChildren,340};341const parsePropMetadata = (342  def: {343    __prop__metadata__?: Record<keyof any, any[]>;344  },345  declaration: Declaration,346): void => {347  if (Object.prototype.hasOwnProperty.call(def, '__prop__metadata__') && def.__prop__metadata__) {348    for (const prop of getAllKeys(def.__prop__metadata__)) {349      const decorators: Array<{350        ngMetadataName?: string;351      }> = def.__prop__metadata__[prop];352      for (const decorator of decorators) {353        const ngMetadataName = decorator?.ngMetadataName;354        if (!ngMetadataName) {355          continue;356        }357        parsePropMetadataMap[ngMetadataName]?.(ngMetadataName, prop, decorator, declaration);358      }359    }360  }361};362const buildDeclaration = (def: any | undefined, declaration: Declaration): void => {363  if (def) {364    def.inputs = def.inputs || [];365    for (const input of declaration.inputs) {366      if (def.inputs.indexOf(input) === -1) {367        def.inputs.push(input);368      }369    }370    def.outputs = def.outputs || [];371    for (const output of declaration.outputs) {372      if (def.outputs.indexOf(output) === -1) {373        def.outputs.push(output);374      }375    }376    def.queries = {377      ...(def.queries || []),378      ...declaration.queries,379    };380    def.hostBindings = declaration.hostBindings;381    def.hostListeners = declaration.hostListeners;382  }383};384const reflectionCapabilities = new ReflectionCapabilities();385const parse = (def: any): any => {386  if (typeof def !== 'function' && typeof def !== 'object') {387    return {};388  }389  if (Object.prototype.hasOwnProperty.call(def, '__ngMocksParsed')) {390    return def.__ngMocksDeclarations;391  }392  const parent = Object.getPrototypeOf(def);393  const parentDeclarations = parent ? parse(parent) : {};394  const declaration = createDeclarations(parentDeclarations);395  coreDefineProperty(def, '__ngMocksParsed', true);396  parseParameters(def, declaration);397  parseAnnotations(def, declaration);398  parseDecorators(def, declaration);399  parsePropDecorators(def, declaration);400  parsePropMetadata(def, declaration);401  buildDeclaration(declaration.Directive, declaration);402  buildDeclaration(declaration.Component, declaration);403  coreDefineProperty(def, '__ngMocksDeclarations', {404    ...parentDeclarations,405    ...declaration,406    parameters: reflectionCapabilities.parameters(def),407  });408  return def.__ngMocksDeclarations;409};...Using AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2import { MyComponent } from './my-component';3import { MyOtherComponent } from './my-other-component';4const metadata = parsePropMetadataParserContentChild(MyComponent);5const { MyOtherComponent: child } = metadata;6console.log(child);7import { Component } from '@angular/core';8import { MyOtherComponent } from './my-other-component';9@Component({10})11export class MyComponent {12  @ContentChild(MyOtherComponent) child: MyOtherComponent;13}14import { Component } from '@angular/core';15@Component({16})17export class MyOtherComponent {18}19{ selector: 'my-other-component', exportAs: undefined, read: undefined }Using AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2import { ChildComponent } from './child.component';3import { ParentComponent } from './parent.component';4describe('ParentComponent', () => {5  it('should parse the content child', () => {6    const contentChild = parsePropMetadataParserContentChild(ParentComponent, 'child');7    expect(contentChild).toEqual(ChildComponent);8  });9});10import { parsePropMetadataParserContentChild } from 'ng-mocks';11import { ParentComponent } from './parent.component';12describe('ParentComponent', () => {13  it('should parse the content child', () => {14    const contentChild = parsePropMetadataParserContentChild(ParentComponent, 'child');15    expect(contentChild).toBeUndefined();16  });17});Using AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2import { MyComponent } from './my.component';3describe('MyComponent', () => {4  it('should have a child component', () => {5    const propMetadataParserContentChild = parsePropMetadataParserContentChild(MyComponent);6    expect(propMetadataParserContentChild).toBe(MyChildComponent);7  });8});9import { parsePropMetadataParserContentChild } from 'ng-mocks';10import { MyComponent } from './my.component';11describe('MyComponent', () => {12  it('should have a child component', () => {13    const propMetadataParserContentChild = parsePropMetadataParserContentChild(MyComponent, 'my-child');14    expect(propMetadataParserContentChild).toBe(MyChildComponent);15  });16});17import { parsePropMetadataParserContentChild } from 'ng-mocks';18import { MyComponent } from './my.component';19describe('MyComponent', () => {20  it('should have a child component', () => {21    const propMetadataParserContentChild = parsePropMetadataParserContentChild(MyComponent, 'my-child', MyOtherChildComponent);22    expect(propMetadataParserContentChild).toBe(MyOtherChildComponent);23  });24});25import { parsePropMetadataParserContentChild } from 'ng-mocks';26import { MyComponent } from './my.component';27describe('MyComponent', () => {28  it('should have a child component', () => {29    const propMetadataParserContentChild = parsePropMetadataParserContentChild(MyComponent, MyOtherChildComponent);30    expect(propMetadataParserContentChild).toBe(MyOtherChildComponent);31  });32});33import { parsePropMetadataParserContentChild } from 'ng-mocks';34import { MyComponent } from './my.component';35describe('MyComponent', () => {36  it('should have a child component', () => {Using AI Code Generation
1const metadata = parsePropMetadataParserContentChild({selector: 'app-child'});2const metadata = parsePropMetadataParserContentChildren({selector: 'app-child'});3const metadata = parsePropMetadataParserInput('inputName');4const metadata = parsePropMetadataParserInput({name: 'inputName'});5const metadata = parsePropMetadataParserInput({name: 'inputName', type: String});6const metadata = parsePropMetadataParserInput({name: 'inputName', type: String, bindingPropertyName: 'inputName'});7const metadata = parsePropMetadataParserOutput('outputName');8const metadata = parsePropMetadataParserOutput({name: 'outputName'});9const metadata = parsePropMetadataParserOutput({name: 'outputName', type: String});10const metadata = parsePropMetadataParserOutput({name: 'outputName', type: String, bindingPropertyName: 'outputName'});11const metadata = parsePropMetadataParserViewChild({selector: 'app-child'});12const metadata = parsePropMetadataParserViewChildren({selector: 'app-child'});13const metadata = parsePropMetadataParserHostBinding('hostName');14const metadata = parsePropMetadataParserHostBinding({hostPropertyName: 'hostName'});15const metadata = parsePropMetadataParserHostBinding({hostPropertyName: 'hostName', bindingPropertyNameUsing AI Code Generation
1import {parsePropMetadataParserContentChild} from 'ng-mocks';2parsePropMetadataParserContentChild(TestComponent, 'testComponent');3import {parsePropMetadataParserContentChildren} from 'ng-mocks';4parsePropMetadataParserContentChildren(TestComponent, 'testComponent');5import {parsePropMetadataParserInput} from 'ng-mocks';6parsePropMetadataParserInput(TestComponent, 'testComponent');7import {parsePropMetadataParserOutput} from 'ng-mocks';8parsePropMetadataParserOutput(TestComponent, 'testComponent');9import {parsePropMetadataParserHostBinding} from 'ng-mocks';10parsePropMetadataParserHostBinding(TestComponent, 'testComponent');11import {parsePropMetadataParserHostListener} from 'ng-mocks';12parsePropMetadataParserHostListener(TestComponent, 'testComponent');13import {parsePropMetadataParserViewChildren} from 'ng-mocks';14parsePropMetadataParserViewChildren(TestComponent, 'testComponent');15import {parsePropMetadataParserViewChild} from 'ng-mocks';16parsePropMetadataParserViewChild(TestComponent, 'testComponent');17import {parsePropMetadataParserTemplateRef} from 'ng-mocks';18parsePropMetadataParserTemplateRef(TestComponent, 'testComponent');19import {parsePropMetadataParserUsing AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2const component = parsePropMetadataParserContentChild(MyComponent);3expect(component).toEqual({4  props: {5    myProp: {6      props: {},7    },8  },9});10import { parsePropMetadataParserContentChildren } from 'ng-mocks';11const component = parsePropMetadataParserContentChildren(MyComponent);12expect(component).toEqual({13  props: {14    myProp: {15      props: {},16    },17  },18});19import { parsePropMetadataParserInput } from 'ng-mocks';20const component = parsePropMetadataParserInput(MyComponent);21expect(component).toEqual({22  props: {23    myProp: {24      props: {},25    },26  },27});28import { parsePropMetadataParserInputs } from 'ng-mocks';29const component = parsePropMetadataParserInputs(MyComponent);30expect(component).toEqual({31  props: {32    myProp: {33      props: {},34    },35  },36});37import { parsePropMetadataParserOutput } from 'ng-mocks';38const component = parsePropMetadataParserOutput(MyComponent);39expect(component).toEqual({40  props: {41    myProp: {42      props: {},43    },44  },45});Using AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2const component = parsePropMetadataParserContentChild(TestComponent);3expect(component).toEqual({4  interpolation: ['{{', '}}'],5  imports: [],6  aotSummaries: () => [],7});8{ selector: 'app-test',9  interpolation: ['{{', '}}'],10  imports: [],11  aotSummaries: [Function: aotSummaries] }12importsUsing AI Code Generation
1const parser = new MockRender('<ng-mocks></ng-mocks>');2const ngMocks = parser.find('ng-mocks')[0];3const result = ngMocks.parsePropMetadataParserContentChild({4});5console.log(result);6import { Component, ContentChild, ElementRef, Input, NgModule, ViewChild } from '@angular/core';7import { MockBuilder, MockRender } from 'ng-mocks';8import { ChildComponent } from './child.component';9import { ChildModule } from './child.module';10@Component({11})12export class NgMocksComponent {13  @Input() public showTitle: boolean = false;14  @ViewChild('child', { static: true }) public child: ElementRef;15  @ContentChild(ChildComponent, { static: true }) public contentChild: ChildComponent;16}17@NgModule({18  imports: [ChildModule],19})20export class NgMocksModule {}21describe('NgMocksComponent', () => {22  beforeEach(() => MockBuilder(NgMocksComponent, NgMocksModule));23  it('should create', () => {24    const parser = new MockRender('<ng-mocks></ng-mocks>');25    const ngMocks = parser.find('ng-mocks')[0];26    const result = ngMocks.parsePropMetadataParserContentChild({27    });28    expect(result).toBeDefined();29  });30});31import { Component, Input } from '@angular/core';32@Component({33    <p>{{ message }}</p>34})35export class ChildComponent {36  @Input() public message: string = '';37}38import { NgModule } from '@angular/core';39import { ChildComponent } from './child.component';40@NgModule({Using AI Code Generation
1import { parsePropMetadataParserContentChild } from 'ng-mocks';2@Component({3})4export class TestComponent {5  @ContentChild('test') test: any;6}7const metadata = parsePropMetadataParserContentChild(TestComponent);8console.log(metadata);9import { parsePropMetadataParserContentChild } from 'ng-mocks';10describe('TestComponent', () => {11  it('should create', () => {12    const metadata = parsePropMetadataParserContentChild(TestComponent);13    expect(metadata).toEqual({ selector: 'test', type: 'any' });14  });15});16Syntax: parsePropMetadataParserContentChildren(component: any): any;17import { parsePropMetadataParserContentChildren } from 'ng-mocks';18@Component({19})20export class TestComponent {21  @ContentChildren('test') test: any;22}23const metadata = parsePropMetadataParserContentChildren(TestComponent);24console.log(metadata);Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
