Skip to content

Commit 9c10784

Browse files
committed
refactor(utils): fix compiler errors from recursive schema types
1 parent 795f835 commit 9c10784

4 files changed

Lines changed: 30 additions & 8 deletions

File tree

packages/models/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ export {
132132
type CoverageTreeMissingLOC,
133133
type CoverageTreeNode,
134134
type Tree,
135+
type BasicTreeNodeValues,
136+
type CoverageTreeNodeValues,
135137
} from './lib/tree.js';
136138
export { uploadConfigSchema, type UploadConfig } from './lib/upload-config.js';
137139
export {

packages/models/src/lib/tree.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const basicTreeNodeValuesSchema = z.record(
55
z.string(),
66
z.union([z.number(), z.string()]),
77
);
8+
export type BasicTreeNodeValues = z.infer<typeof basicTreeNodeValuesSchema>;
9+
810
const basicTreeNodeDataSchema = z.object({
911
name: z.string().min(1).describe('Text label for node'),
1012
values: basicTreeNodeValuesSchema
@@ -41,6 +43,10 @@ const coverageTreeNodeValuesSchema = z.object({
4143
.optional()
4244
.describe('Uncovered lines of code'),
4345
});
46+
export type CoverageTreeNodeValues = z.infer<
47+
typeof coverageTreeNodeValuesSchema
48+
>;
49+
4450
const coverageTreeNodeDataSchema = z.object({
4551
name: z.string().min(1).describe('File or folder name'),
4652
values: coverageTreeNodeValuesSchema.describe(

packages/utils/src/lib/coverage-tree.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import type {
22
CoverageTree,
33
CoverageTreeMissingLOC,
4-
CoverageTreeNode,
4+
CoverageTreeNodeValues,
55
} from '@code-pushup/models';
66
import { splitFilePath } from './file-system.js';
77
import { formatGitPath } from './git/git.js';
88

9+
// recursive schemas cause compiler problems when using CoverageTreeNode
10+
type TreeNode = {
11+
name: string;
12+
values: CoverageTreeNodeValues;
13+
children?: TreeNode[];
14+
};
15+
916
export type FileCoverage = {
1017
path: string;
1118
total: number;
@@ -94,7 +101,7 @@ function addNode(
94101
};
95102
}
96103

97-
function calculateTreeCoverage(root: FileTree): CoverageTreeNode {
104+
function calculateTreeCoverage(root: FileTree): TreeNode {
98105
if ('children' in root) {
99106
const stats = aggregateChildCoverage(root.children);
100107
const coverage = calculateCoverage(stats);
@@ -153,7 +160,7 @@ function getNodeCoverageStats(
153160
return stats;
154161
}
155162

156-
function sortCoverageTree(root: CoverageTreeNode): CoverageTreeNode {
163+
function sortCoverageTree(root: TreeNode): TreeNode {
157164
if (!root.children?.length) {
158165
return root;
159166
}

packages/utils/src/lib/text-formats/ascii/tree.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
import type {
2-
BasicTreeNode,
3-
CoverageTreeNode,
2+
BasicTreeNodeValues,
3+
CoverageTreeNodeValues,
44
Tree,
55
} from '@code-pushup/models';
66

7-
type TreeNode = BasicTreeNode | CoverageTreeNode;
7+
// recursive schemas cause compiler problems when using BasicTreeNode | CoverageTreeNode
8+
type TreeNode = {
9+
name: string;
10+
values?: BasicTreeNodeValues | CoverageTreeNodeValues;
11+
children?: TreeNode[];
12+
};
813

914
const INDENT_CHARS = 4;
1015
const COL_GAP = 2;
1116

1217
export function formatAsciiTree(tree: Tree): string {
13-
const nodes = flatten(tree.root);
18+
const root = tree.root as TreeNode;
19+
20+
const nodes = flatten(root);
1421
const maxWidth = Math.max(
1522
...nodes.map(({ node, level }) => level * INDENT_CHARS + node.name.length),
1623
);
@@ -30,7 +37,7 @@ export function formatAsciiTree(tree: Tree): string {
3037
{},
3138
);
3239

33-
return formatTreeNode(tree.root, '', maxWidth, keysMaxWidths)
40+
return formatTreeNode(root, '', maxWidth, keysMaxWidths)
3441
.map(line => `${line}\n`)
3542
.join('');
3643
}

0 commit comments

Comments
 (0)