Skip to content

Commit a1e334e

Browse files
authored
Merge pull request #205 from PRO-Robotech/feature/dev
plural by kind
2 parents aacfe82 + 929746e commit a1e334e

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@prorobotech/openapi-k8s-toolkit",
3-
"version": "0.0.1-alpha.150",
3+
"version": "0.0.1-alpha.151",
44
"description": "ProRobotech OpenAPI k8s tools",
55
"main": "dist/openapi-k8s-toolkit.cjs.js",
66
"module": "dist/openapi-k8s-toolkit.es.js",

src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ export * from './getSortedKindsAll'
1616
export * from './hslFromString'
1717
export * from './getUppercase'
1818
export * from './kindByGvr'
19+
export * from './pluralByKind'
1920
export * from './namespacedByGvr'
2021
export * from './tableLocations'

src/utils/pluralByKind/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './pluralByKind'
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { TKindWithVersion } from 'localTypes/search'
2+
3+
type ApiVersion = string // "group/version" or "v1" for core
4+
5+
// Parse "apps/v1" -> { group: "apps", version: "v1" }
6+
// Parse "v1" -> { group: "", version: "v1" } (core)
7+
const parseApiVersion = (apiVersion: ApiVersion) => {
8+
const parts = apiVersion.trim().split('/')
9+
return parts.length === 1 ? { group: '', version: parts[0] } : { group: parts[0], version: parts[1] }
10+
}
11+
12+
/**
13+
* Build a lookup function: given (kind, apiVersion?) return the plural resource.
14+
* - apiVersion can be "group/version" or just "v1" for core.
15+
* - If apiVersion is omitted, we return the plural for the preferred version of that kind.
16+
* - Returns undefined if not uniquely determined.
17+
*/
18+
export const pluralByKind =
19+
(entries: readonly TKindWithVersion[]) =>
20+
(kind: string, apiVersion?: ApiVersion): string | undefined => {
21+
const norm = (s: string) => s.trim()
22+
const kindNorm = norm(kind)
23+
24+
// If apiVersion is provided, use it; otherwise we’ll consider all versions and prefer `preferred:true`.
25+
const gv = apiVersion ? parseApiVersion(apiVersion) : undefined
26+
27+
const candidates = entries.filter(e => norm(e.kind) === kindNorm)
28+
29+
if (candidates.length === 0) return undefined
30+
31+
const filtered = gv
32+
? candidates.filter(e => norm(e.group) === norm(gv.group) && e.version.version === gv.version)
33+
: candidates
34+
35+
if (filtered.length === 0) return undefined
36+
37+
// If version wasn’t specified, prefer entries where the version is marked preferred.
38+
const preferredFirst = gv
39+
? filtered
40+
: [...filtered.filter(e => e.version.preferred), ...filtered.filter(e => !e.version.preferred)]
41+
42+
// Collect plural resource names
43+
const resources = preferredFirst.map(e => e.version.resource).filter(Boolean)
44+
const uniq = Array.from(new Set(resources))
45+
46+
// If we didn’t specify a version and multiple distinct resources remain,
47+
// try to collapse by taking the first (preferred) only.
48+
if (!gv && uniq.length > 1) {
49+
const first = preferredFirst[0]?.version.resource
50+
return first ?? undefined
51+
}
52+
53+
return uniq.length === 1 ? uniq[0] : undefined
54+
}

0 commit comments

Comments
 (0)