diff --git a/src/gql/gql-util.ts b/src/gql/gql-util.ts index 838f5e5..dae4114 100644 --- a/src/gql/gql-util.ts +++ b/src/gql/gql-util.ts @@ -589,6 +589,12 @@ export function organizeImports(sourceFile: ts.SourceFile): ts.SourceFile { return statement }) + const sortedFileNames = Object.keys(importStatements) + .filter(fromFile => !!importStatements[fromFile].size) + .map(from => ({ from, firstImport: Array.from(importStatements[from]).sort()[0] })) + .sort((a, b) => a.firstImport.localeCompare(b.firstImport)) + .map(item => item.from) + return { ...sourceFile, statements: [ @@ -596,10 +602,9 @@ export function organizeImports(sourceFile: ts.SourceFile): ts.SourceFile { .filter(fromFile => !importStatements[fromFile].size) .sort() .map(fromFile => createImport(fromFile, ...Array.from(importStatements[fromFile]).sort())), - ...Object.keys(importStatements) - .filter(fromFile => !!importStatements[fromFile].size) - .sort() - .map(fromFile => createImport(fromFile, ...Array.from(importStatements[fromFile]).sort())), + ...sortedFileNames.map(fromFile => + createImport(fromFile, ...Array.from(importStatements[fromFile]).sort()), + ), ...sourceFile.statements.filter(statement => !ts.isImportDeclaration(statement)), ] as any, } diff --git a/src/gql/organize-import.test.ts b/src/gql/organize-import.test.ts new file mode 100644 index 0000000..bceba5b --- /dev/null +++ b/src/gql/organize-import.test.ts @@ -0,0 +1,27 @@ +import { toParsedOutput } from '../util/test-util' +import { parseTS, printTS, prettify } from '../util/ts-util' +import { organizeImports } from './gql-util' + +describe('organizeImport', () => { + test('to organize imports', async () => { + const sourceFile = parseTS(` + import { FieldResolver } from '../../common/field-resolver-type' + import { GQLContext } from '../../context' + import { ReturnService } from '../return/return.service' + import { Shipment } from './shipment.model' + import { ShipmentType, TransactionStatus } from './shipment.type' + import { Context, Parent, ResolveField, Resolver } from '@nestjs/graphql' + `) + const code = await prettify(printTS(organizeImports(sourceFile))) + expect(toParsedOutput(code)).toEqual( + toParsedOutput(` + import { Context, Parent, ResolveField, Resolver } from '@nestjs/graphql' + import { FieldResolver } from '../../common/field-resolver-type' + import { GQLContext } from '../../context' + import { ReturnService } from '../return/return.service' + import { Shipment } from './shipment.model' + import { ShipmentType, TransactionStatus } from './shipment.type' + `), + ) + }) +})