UNPKG

dpdm

Version:

Analyze circular dependencies in your JavaScript/TypeScript projects.

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