(members: WorksetMember[])
| 102 | * compose flow (wrapping as workset_member_invalid). |
| 103 | */ |
| 104 | export function memberListProblem(members: WorksetMember[]): string | null { |
| 105 | if (members.length === 0) { |
| 106 | return 'members must not be empty'; |
| 107 | } |
| 108 | |
| 109 | const seen = new Set<string>(); |
| 110 | for (const member of members) { |
| 111 | const labelProblem = memberLabelProblem(member.name); |
| 112 | if (labelProblem !== null) { |
| 113 | return labelProblem; |
| 114 | } |
| 115 | |
| 116 | if (seen.has(member.name)) { |
| 117 | return `duplicate member name '${member.name}' (use the name=path form to label members distinctly)`; |
| 118 | } |
| 119 | seen.add(member.name); |
| 120 | |
| 121 | if (!path.isAbsolute(member.path)) { |
| 122 | return `member path '${member.path}' must be absolute`; |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | return null; |
| 127 | } |
| 128 | |
| 129 | export function memberLabelProblem(label: string): string | null { |
| 130 | return folderStyleNameProblem(label, 'member name'); |
no test coverage detected