UNPKG

dpdm

Version:

Analyze circular dependencies in your JavaScript/TypeScript projects.

103 lines 4.37 kB
/*! * Copyright 2019 acrazing <joking.young@gmail.com>. All rights reserved. * @since 2026-05-09 14:35:00 */ import { __awaiter } from "tslib"; import path from 'path'; import { DependencyKind } from './consts'; import { parseDependencyTree } from './parser'; import { groupDependencyTreeByPackage, groupEntriesByPackage, parseCircular, } from './utils'; describe('parser', () => { const fixture = path.join(__dirname, '../fixtures/parser/monorepo'); it('should parse relative entries from a custom cwd', () => __awaiter(void 0, void 0, void 0, function* () { const tree = yield parseDependencyTree('packages/shared/src/index.ts', { cwd: fixture, }); expect(tree).toEqual({ 'packages/shared/src/index.ts': [ { issuer: 'packages/shared/src/index.ts', request: './dep', kind: DependencyKind.StaticExport, id: 'packages/shared/src/dep.ts', }, ], 'packages/shared/src/dep.ts': [], }); })); it('should parse an absolute entry file path', () => __awaiter(void 0, void 0, void 0, function* () { const tree = yield parseDependencyTree(path.join(fixture, 'packages/shared/src/index.ts'), { context: fixture, }); expect(tree).toEqual({ 'packages/shared/src/index.ts': [ { issuer: 'packages/shared/src/index.ts', request: './dep', kind: DependencyKind.StaticExport, id: 'packages/shared/src/dep.ts', }, ], 'packages/shared/src/dep.ts': [], }); })); it('should resolve aliases from an absolute tsconfig path', () => __awaiter(void 0, void 0, void 0, function* () { const tree = yield parseDependencyTree(path.join(fixture, 'packages/alias-user/src/index.ts'), { context: fixture, tsconfig: path.join(fixture, 'tsconfig.json'), }); expect(tree['packages/alias-user/src/index.ts']).toEqual([ { issuer: 'packages/alias-user/src/index.ts', request: '~/dep', kind: DependencyKind.StaticImport, id: 'packages/shared/src/dep.ts', }, ]); })); it('should group dependencies and circulars by package', () => __awaiter(void 0, void 0, void 0, function* () { const tree = yield parseDependencyTree(['packages/app/src/index.ts', 'packages/ui/src/index.ts'], { cwd: fixture }); const packageTree = groupDependencyTreeByPackage(tree, fixture); expect(groupEntriesByPackage([ 'packages/app/src/index.ts', 'packages/ui/src/index.ts', 'packages/app/src/local.ts', ], fixture)).toEqual(['@repo/app', '@repo/ui']); expect(packageTree).toEqual({ '@repo/app': [ { issuer: '@repo/app', request: '../../shared/src', kind: DependencyKind.StaticImport, id: '@repo/shared', }, { issuer: '@repo/app', request: '../../ui/src', kind: DependencyKind.StaticImport, id: '@repo/ui', }, ], '@repo/ui': [ { issuer: '@repo/ui', request: '../../shared/src', kind: DependencyKind.StaticImport, id: '@repo/shared', }, ], '@repo/shared': [], }); expect(parseCircular(packageTree)).toEqual([]); })); it('should detect package-level circular dependencies', () => __awaiter(void 0, void 0, void 0, function* () { const tree = yield parseDependencyTree(['packages/cycle-a/src/index.ts', 'packages/cycle-b/src/index.ts'], { cwd: fixture, }); const packageTree = groupDependencyTreeByPackage(tree, fixture); const circulars = parseCircular(packageTree); expect(circulars).toHaveLength(1); expect(circulars[0].sort()).toEqual(['@repo/cycle-a', '@repo/cycle-b']); })); }); //# sourceMappingURL=parser.spec.js.map