(
itemName: string,
params: { typeOverride?: ItemType; options: ShowExecuteOptions; root: ResolvedOpenSpecRoot }
)
| 102 | } |
| 103 | |
| 104 | private async showDirect( |
| 105 | itemName: string, |
| 106 | params: { typeOverride?: ItemType; options: ShowExecuteOptions; root: ResolvedOpenSpecRoot } |
| 107 | ): Promise<void> { |
| 108 | const root = params.root; |
| 109 | // Optimize lookups when type is pre-specified |
| 110 | let isChange = false; |
| 111 | let isSpec = false; |
| 112 | let changes: string[] = []; |
| 113 | let specs: string[] = []; |
| 114 | if (params.typeOverride === 'change') { |
| 115 | changes = await getActiveChangeIds(root.path); |
| 116 | isChange = changes.includes(itemName); |
| 117 | } else if (params.typeOverride === 'spec') { |
| 118 | specs = await getSpecIds(root.path); |
| 119 | isSpec = specs.includes(itemName); |
| 120 | } else { |
| 121 | [changes, specs] = await Promise.all([getActiveChangeIds(root.path), getSpecIds(root.path)]); |
| 122 | isChange = changes.includes(itemName); |
| 123 | isSpec = specs.includes(itemName); |
| 124 | } |
| 125 | |
| 126 | const resolvedType = params.typeOverride ?? (isChange ? 'change' : isSpec ? 'spec' : undefined); |
| 127 | |
| 128 | if (!resolvedType) { |
| 129 | const suggestions = nearestMatches(itemName, [...changes, ...specs]); |
| 130 | const message = suggestions.length |
| 131 | ? `Unknown item '${itemName}'. Did you mean: ${suggestions.join(', ')}?` |
| 132 | : `Unknown item '${itemName}'.`; |
| 133 | if (params.options.json) { |
| 134 | console.log( |
| 135 | JSON.stringify( |
| 136 | { status: [{ severity: 'error', code: 'unknown_item', message }] }, |
| 137 | null, |
| 138 | 2 |
| 139 | ) |
| 140 | ); |
| 141 | } else { |
| 142 | console.error(message); |
| 143 | } |
| 144 | process.exitCode = 1; |
| 145 | return; |
| 146 | } |
| 147 | |
| 148 | if (!params.typeOverride && isChange && isSpec) { |
| 149 | if (params.options.json) { |
| 150 | console.log( |
| 151 | JSON.stringify( |
| 152 | { |
| 153 | status: [ |
| 154 | { |
| 155 | severity: 'error', |
| 156 | code: 'ambiguous_item', |
| 157 | message: `Ambiguous item '${itemName}' matches both a change and a spec.`, |
| 158 | fix: 'Pass --type change|spec.', |
| 159 | }, |
| 160 | ], |
| 161 | }, |
no test coverage detected