From 5c047e82b6ea03f3c42dbbd0570e18b474fda462 Mon Sep 17 00:00:00 2001 From: Willie Ruemmele Date: Thu, 16 Oct 2025 10:06:28 -0600 Subject: [PATCH] fix: add completions to org flags --- package.json | 2 +- src/flags/orgFlags.ts | 40 +++++++++++++++++++++++++++++++++++++++- yarn.lock | 24 ++++++++++++++++++------ 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 848b3878..d510399f 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "dependencies": { "@inquirer/confirm": "^3.1.22", "@inquirer/password": "^2.2.0", - "@oclif/core": "^4.5.2", + "@oclif/core": "autocomplete", "@oclif/table": "^0.4.12", "@salesforce/core": "^8.18.7", "@salesforce/kit": "^3.2.3", diff --git a/src/flags/orgFlags.ts b/src/flags/orgFlags.ts index 4cdf67b3..b3f3b8a7 100644 --- a/src/flags/orgFlags.ts +++ b/src/flags/orgFlags.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Flags } from '@oclif/core'; -import { ConfigAggregator, Messages, Org, OrgConfigProperties } from '@salesforce/core'; +import { ConfigAggregator, Messages, Org, OrgConfigProperties, StateAggregator } from '@salesforce/core'; Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); const messages = Messages.loadMessages('@salesforce/sf-plugins-core', 'messages'); @@ -110,6 +110,14 @@ export const getHubOrThrow = async (aliasOrUsername?: string): Promise => { export const optionalOrgFlag = Flags.custom({ char: 'o', noCacheDefault: true, + completion: { + options: async () => { + const stateAggregator = await StateAggregator.getInstance(); + const orgs = (await stateAggregator.orgs.list()).map((o) => o.replace('.json', '')); + const aliases = Object.keys(stateAggregator.aliases.getAll()); + return [...orgs, ...aliases]; + }, + }, parse: async (input: string | undefined) => maybeGetOrg(input), summary: messages.getMessage('flags.optionalTargetOrg.summary'), default: async () => maybeGetOrg(), @@ -148,6 +156,14 @@ export const requiredOrgFlag = Flags.custom({ char: 'o', summary: messages.getMessage('flags.targetOrg.summary'), noCacheDefault: true, + completion: { + options: async () => { + const stateAggregator = await StateAggregator.getInstance(); + const orgs = (await stateAggregator.orgs.list()).map((o) => o.replace('.json', '')); + const aliases = Object.keys(stateAggregator.aliases.getAll()); + return [...orgs, ...aliases]; + }, + }, parse: async (input: string | undefined) => getOrgOrThrow(input), default: async () => getOrgOrThrow(), defaultHelp: async (context) => { @@ -188,6 +204,17 @@ export const requiredHubFlag = Flags.custom({ noCacheDefault: true, parse: async (input: string | undefined) => getHubOrThrow(input), default: async () => getHubOrThrow(), + completion: { + options: async () => { + const sa = await StateAggregator.getInstance(); + const devHubs = (await sa.orgs.readAll()).filter((o) => o.isDevHub).map((o) => o.username ?? ''); + const devHubAliases = Object.entries(sa.aliases.getAll()) + .filter(([, username]) => devHubs.includes(username ?? '')) + .map(([alias]) => alias); + + return [...devHubs, ...devHubAliases]; + }, + }, defaultHelp: async (context) => { if (context.options instanceof Org) { const org = context.options as Org; @@ -225,6 +252,17 @@ export const optionalHubFlag = Flags.custom({ noCacheDefault: true, parse: async (input: string | undefined) => maybeGetHub(input), default: async () => maybeGetHub(), + completion: { + options: async () => { + const sa = await StateAggregator.getInstance(); + const devHubs = (await sa.orgs.readAll()).filter((o) => o.isDevHub).map((o) => o.username ?? ''); + const devHubAliases = Object.entries(sa.aliases.getAll()) + .filter(([, username]) => devHubs.includes(username ?? '')) + .map(([alias]) => alias); + + return [...devHubs, ...devHubAliases]; + }, + }, defaultHelp: async (context) => { if (context.options instanceof Org) { const org = context.options as Org; diff --git a/yarn.lock b/yarn.lock index d5c68373..43b21ab4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -556,23 +556,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oclif/core@^4.5.2": - version "4.5.2" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.5.2.tgz#4db8a365fa7e9e33af272294f710a7f3f25538e2" - integrity sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA== +"@oclif/core@autocomplete": + version "4.5.6-autocomplete.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.5.6-autocomplete.0.tgz#749f8a5fbdfc62f57e32aef37b6affefb045cdb0" + integrity sha512-PTYvKFHMR/rECFvzAvZqfrq31I8BpIM15qz9+X4BMf3lx9gbYJqPpRi4bOR8ullb6ddUVjDGRENRZQlBznsEgw== dependencies: ansi-escapes "^4.3.2" ansis "^3.17.0" clean-stack "^3.0.1" cli-spinners "^2.9.2" - debug "^4.4.0" + debug "^4.4.3" ejs "^3.1.10" get-package-type "^0.1.0" indent-string "^4.0.0" is-wsl "^2.2.0" lilconfig "^3.1.3" minimatch "^9.0.5" - semver "^7.6.3" + semver "^7.7.3" string-width "^4.2.3" supports-color "^8" tinyglobby "^0.2.14" @@ -1816,6 +1816,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -4784,6 +4791,11 @@ semver@^7.3.4, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + sentence-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f"