dpdm
Version:
Analyze circular dependencies in your JavaScript/TypeScript projects.
105 lines • 4.68 kB
JavaScript
"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