Skip to content

Commit

Permalink
bugfix(core): Allow circular structures for dynamic module nestjs#678
Browse files Browse the repository at this point in the history
  • Loading branch information
BrunnerLivio committed Oct 2, 2018
1 parent 65bb7e7 commit bcab737
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { expect } from 'chai';
import { Test, TestingModuleBuilder } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import { CircularModule } from '../src/circular-structure-dynamic-module/circular.module';
import { InputService } from '../src/circular-structure-dynamic-module/input.service';
import { Input2Service } from '../src/circular-structure-dynamic-module/input2.service';

describe('Circular structure for dynamic modules', () => {
it('should resolve circular structure with dynamic modules', async () => {
const builder = Test.createTestingModule({
imports: [CircularModule.forRoot()],
});
const testingModule = await builder.compile();
const inputService = testingModule.get<InputService>(InputService);
const input2Service = testingModule.get<Input2Service>(Input2Service);

expect(inputService).to.be.instanceof(InputService);
expect(input2Service).to.be.instanceof(Input2Service);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Module, DynamicModule } from '@nestjs/common';
import { Circular2Module } from './circular2.module';
import { InputService } from './input.service';

export class CircularModule {
static forRoot(): DynamicModule {
return {
module: CircularModule,
imports: [
Circular2Module,
],
providers: [
InputService,
],
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Module } from '@nestjs/common';
import { CircularModule } from './circular.module';

@Module({
imports: [CircularModule],
})
export class Circular2Module {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Injectable } from '@nestjs/common';

@Injectable()
export class InputService {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Injectable } from '@nestjs/common';

@Injectable()
export class Input2Service {
}
5 changes: 4 additions & 1 deletion packages/core/injector/module-token-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { DynamicModule } from '@nestjs/common';
import { SHARED_MODULE_METADATA } from '@nestjs/common/constants';
import { Type } from '@nestjs/common/interfaces/type.interface';
import * as hash from 'object-hash';
import safeStringify from 'fast-safe-stringify';

export class ModuleTokenFactory {
public create(
Expand All @@ -22,7 +23,9 @@ export class ModuleTokenFactory {
public getDynamicMetadataToken(
dynamicModuleMetadata: Partial<DynamicModule> | undefined,
): string {
return dynamicModuleMetadata ? JSON.stringify(dynamicModuleMetadata) : '';
// Uses safeStringify instead of JSON.stringify
// to support circular dynamic modules
return dynamicModuleMetadata ? safeStringify(dynamicModuleMetadata) : '';
}

public getModuleName(metatype: Type<any>): string {
Expand Down
3 changes: 2 additions & 1 deletion packages/core/test/injector/module-token-factory.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { expect } from 'chai';
import * as hash from 'object-hash';
import { SingleScope } from '../../../common';
import { ModuleTokenFactory } from '../../injector/module-token-factory';
import safeStringify from 'fast-safe-stringify';

describe('ModuleTokenFactory', () => {
let factory: ModuleTokenFactory;
Expand Down Expand Up @@ -46,7 +47,7 @@ describe('ModuleTokenFactory', () => {
expect(token).to.be.deep.eq(
hash({
module: Module.name,
dynamic: JSON.stringify({
dynamic: safeStringify({
components: [{}],
}),
scope: [Module.name],
Expand Down

0 comments on commit bcab737

Please sign in to comment.