• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

atinc / ngx-tethys / 68ef226c-f83e-44c1-b8ed-e420a83c5d84

28 May 2025 10:31AM UTC coverage: 10.352% (-80.0%) from 90.316%
68ef226c-f83e-44c1-b8ed-e420a83c5d84

Pull #3460

circleci

pubuzhixing8
chore: xxx
Pull Request #3460: refactor(icon): migrate signal input #TINFR-1476

132 of 6823 branches covered (1.93%)

Branch coverage included in aggregate %.

10 of 14 new or added lines in 1 file covered. (71.43%)

11648 existing lines in 344 files now uncovered.

2078 of 14525 relevant lines covered (14.31%)

6.69 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/util/references.ts
1
import { keyBy, indexKeyBy } from './helpers';
2

UNCOV
3
// 抽取数据中的Item类型,不是数组直接返回对象的类型
×
UNCOV
4
export type ArrayInferExtract<T> = T extends Array<infer P> ? P : T;
×
5
export type ArrayAlwaysExtract<T> = T extends Array<infer P> ? P : never;
6
// 抽取 References 中 Object 类型, 如果是数组取数组 Item 类型
UNCOV
7
export type ReferenceObjectExtract<T> = {
×
8
    [key in keyof T]: ArrayInferExtract<T[key]> extends object ? ArrayInferExtract<T[key]> : never;
9
};
10
// 收取 References 中所有的属性 Names,如果ArrayInferExtract不是对象,返回 never
11
export type ReferenceExtractNames<T> = { [key in keyof T]: ArrayInferExtract<T[key]> extends object ? key : never };
12
export type ReferenceArrayExtractNames<T> = { [key in keyof T]: T[key] extends Array<object> ? key : never };
13
// 排除 ReferenceExtractNames 抽取 Names 中的 never,只保留是对象的 Names
14
export type ReferenceExtractAllowNames<T> = {
15
    [key in ReferenceExtractNames<T>[keyof T]]: ReferenceExtractNames<T>[key];
16
};
17
export type ReferenceArrayExtractAllowNames<T> = {
18
    [key in ReferenceArrayExtractNames<T>[keyof T]]: ReferenceExtractNames<T>[key];
19
};
20

21
/**
UNCOV
22
 * 根据 ReferenceExtractAllowKeys 抽取出的 Object Keys 组合新的对象
×
UNCOV
23
 * @example ReferenceExtractAllowKeys<{
×
UNCOV
24
    users: { uid: string; name: string }[];
×
UNCOV
25
    info: { id: number; name: string };
×
UNCOV
26
    departments: { dept: number }[];
×
UNCOV
27
    ids: string[];
×
UNCOV
28
    id: string;
×
29
  }> => {
UNCOV
30
      users: "uid" | "name",
×
31
      info: "id" | "name",
UNCOV
32
      departments: "dept"
×
33

UNCOV
34
  }
×
UNCOV
35
 */
×
UNCOV
36
export type ReferenceExtractAllowKeys<T> = {
×
UNCOV
37
    [key in keyof ReferenceExtractAllowNames<T>]?: keyof ReferenceObjectExtract<T>[key];
×
UNCOV
38
};
×
UNCOV
39
// 只允许 reference 是 Array 的 Keys
×
40
export type ReferenceArrayExtractAllowKeys<T> = {
41
    [key in keyof ReferenceArrayExtractAllowNames<T>]?: keyof ReferenceObjectExtract<T>[key];
UNCOV
42
};
×
43

44
function getReferenceIdKey<TReferences>(referenceKey: string, idKeys: ReferenceArrayExtractAllowKeys<TReferences>) {
45
    if (idKeys && idKeys[referenceKey]) {
46
        return idKeys[referenceKey];
47
    } else {
UNCOV
48
        return '_id';
×
UNCOV
49
    }
×
UNCOV
50
}
×
51

×
52
/**
53
 * Append references to original references
UNCOV
54
 * @example
×
55
 * mergeReferences({departments: [{ _id: '1', name: 'name-1'}]}, {departments: [{ _id: '3', name: 'name-3'}]})
56
 * mergeReferences({users: [{ uid: '1', name: 'name-1'}]}, {users: [{ uid: '3', name: 'name-3'}]}, { users: "uid" })
57
 * @param originalReferences original references
58
 * @param references append references
59
 * @param idKeys references 's id key, default is '_id'
×
60
 *
61
 * @returns TReferences
62
 */
UNCOV
63
export function mergeReferences<TReferences>(
×
64
    originalReferences: TReferences,
65
    references: Partial<TReferences>,
66
    idKeys?: ReferenceArrayExtractAllowKeys<TReferences>
67
): TReferences {
68
    for (const key in references) {
69
        if (references.hasOwnProperty(key)) {
70
            const reference = references[key];
UNCOV
71
            const referenceIdKey = getReferenceIdKey<TReferences>(key, idKeys);
×
UNCOV
72
            const originalReference = originalReferences[key];
×
UNCOV
73
            if ((typeof ngDevMode === 'undefined' || ngDevMode) && !originalReference) {
×
UNCOV
74
                throw new Error(`original reference must exist when append new reference: ${key}`);
×
UNCOV
75
            }
×
UNCOV
76
            if (originalReference instanceof Array) {
×
UNCOV
77
                // original reference id index map
×
UNCOV
78
                const originalReferenceIdIndexMap = indexKeyBy<ReferenceExtractAllowKeys<TReferences>>(
×
79
                    originalReferences[key] as any,
80
                    referenceIdKey
81
                );
UNCOV
82
                // append reference is array
×
83
                if (reference instanceof Array) {
84
                    reference.forEach((item: TReferences[Extract<keyof TReferences, string>]) => {
85
                        const itemId = item[referenceIdKey];
86
                        const index = originalReferenceIdIndexMap[itemId];
87
                        if (index >= 0) {
88
                            originalReference[index] = { ...originalReference[index], ...item };
89
                        } else {
90
                            (originalReferences as any)[key] = [...(originalReferences[key] as any), item];
91
                        }
92
                    });
93
                } else {
94
                    // append reference is not array, support append signal object to array reference
95
                    const itemId = reference[referenceIdKey];
96
                    const index = originalReferenceIdIndexMap[itemId];
97
                    if (itemId >= 0) {
98
                        originalReference[index] = { ...originalReference[index], ...reference };
99
                    } else {
100
                        (originalReferences as any)[key] = [...(originalReferences[key] as any), reference];
101
                    }
102
                }
103
            } else {
104
                originalReferences[key] = { ...originalReferences[key], ...reference };
105
            }
106
        }
107
    }
108

109
    return originalReferences;
110
}
111

112
/**
113
 * Build dictionary for references
114
 * @param references references
115
 * @param idKeys references 's id key, default is '_id'
116
 */
117
export function buildReferencesKeyBy<TReferences>(
118
    references: Partial<TReferences>,
119
    idKeys?: Partial<ReferenceArrayExtractAllowKeys<TReferences>>
120
) {
121
    const result: { [key in keyof TReferences]?: { [key: string]: ArrayInferExtract<TReferences[key]> } } = {};
122
    for (const key in references) {
123
        if (references.hasOwnProperty(key)) {
124
            const referenceIdKey = getReferenceIdKey<TReferences>(key, idKeys);
125
            const reference = references[key];
126
            if (reference instanceof Array) {
127
                const originalReferenceIdMap = keyBy<ArrayInferExtract<TReferences>>(reference, referenceIdKey);
128
                (result as any)[key] = originalReferenceIdMap;
129
            }
130
        }
131
    }
132
    return result;
133
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc