Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,410 changes: 1,506 additions & 904 deletions package-lock.json

Large diffs are not rendered by default.

23 changes: 12 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "google-cloud-sql",
"version": "1.7.5",
"description": "Connect to private Google Cloud SQL instance through Cloud SQL Auth Proxy running in GKE cluster.",
"type": "module",
"license": "UNLICENSED",
"author": "Dinko Osrecki <dinko.osrecki@emarsys.com>",
"homepage": "https://github.com/edosrecki/google-cloud-sql-cli",
Expand All @@ -28,36 +29,36 @@
"prettify-package-json": "prettier-package-json --write"
},
"dependencies": {
"boxen": "5.1.2",
"chalk": "4.1.2",
"commander": "8.3.0",
"boxen": "7.0.0",
"chalk": "5.1.2",
"commander": "9.4.1",
"conf": "10.2.0",
"exit-hook": "2.2.1",
"exit-hook": "3.1.2",
"fuse.js": "6.6.2",
"inquirer": "8.2.5",
"inquirer-autocomplete-prompt": "1.4.0",
"inquirer": "9.1.4",
"inquirer-autocomplete-prompt": "3.0.0",
"lodash": "4.17.21",
"memoizee": "0.4.15",
"shelljs": "0.8.5",
"update-notifier": "5.1.0"
"update-notifier": "6.0.2"
},
"devDependencies": {
"@semantic-release/changelog": "6.0.1",
"@semantic-release/exec": "6.0.3",
"@semantic-release/git": "10.0.1",
"@tsconfig/node18": "1.0.1",
"@types/inquirer": "8.2.4",
"@types/inquirer-autocomplete-prompt": "1.3.5",
"@types/inquirer": "9.0.2",
"@types/inquirer-autocomplete-prompt": "3.0.0",
"@types/lodash": "4.14.187",
"@types/memoizee": "0.4.8",
"@types/node": "18.11.9",
"@types/shelljs": "0.8.11",
"@types/update-notifier": "5.1.0",
"@types/update-notifier": "6.0.1",
"@typescript-eslint/eslint-plugin": "5.42.0",
"@typescript-eslint/parser": "5.42.0",
"eslint": "8.26.0",
"eslint-config-prettier": "8.5.0",
"husky": "7.0.4",
"husky": "8.0.1",
"pkg": "5.8.0",
"prettier-package-json": "2.7.0",
"rimraf": "3.0.2",
Expand Down
26 changes: 13 additions & 13 deletions src/commands/configurations/create.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { bold, green, red } from 'chalk'
import chalk from 'chalk'
import inquirer from 'inquirer'
import autocomplete from 'inquirer-autocomplete-prompt'
import { saveConfiguration } from '../../lib/configurations'
import { ConfigurationCreateAnswers } from '../../lib/types'
import { configurationNamePrompt } from './prompts/configuration-name'
import { confirmationPrompt } from './prompts/confirmation'
import { googleCloudProjectPrompt } from './prompts/google-cloud-project'
import { googleCloudSqlInstancePrompt } from './prompts/google-cloud-sql-instance'
import { kubernetesContextPrompt } from './prompts/kubernetes-context'
import { kubernetesNamespacePrompt } from './prompts/kubernetes-namespace'
import { kubernetesServiceAccountPrompt } from './prompts/kubernetes-service-account'
import { localPortPrompt } from './prompts/local-port'
import { saveConfiguration } from '../../lib/configurations/index.js'
import { ConfigurationCreateAnswers } from '../../lib/types.js'
import { configurationNamePrompt } from './prompts/configuration-name.js'
import { confirmationPrompt } from './prompts/confirmation.js'
import { googleCloudProjectPrompt } from './prompts/google-cloud-project.js'
import { googleCloudSqlInstancePrompt } from './prompts/google-cloud-sql-instance.js'
import { kubernetesContextPrompt } from './prompts/kubernetes-context.js'
import { kubernetesNamespacePrompt } from './prompts/kubernetes-namespace.js'
import { kubernetesServiceAccountPrompt } from './prompts/kubernetes-service-account.js'
import { localPortPrompt } from './prompts/local-port.js'

export const createConfiguration = async () => {
inquirer.registerPrompt('autocomplete', autocomplete)
Expand All @@ -29,8 +29,8 @@ export const createConfiguration = async () => {
if (answers.confirmation) {
saveConfiguration(answers)

console.log(green(`Saved configuration '${bold(answers.configurationName)}'.`))
console.log(chalk.green(`Saved configuration '${chalk.bold(answers.configurationName)}'.`))
} else {
console.log(red('You are excused.'))
console.log(chalk.red('You are excused.'))
}
}
12 changes: 6 additions & 6 deletions src/commands/configurations/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Command } from 'commander'
import { logError } from '../../lib/util/error'
import { createConfiguration } from './create'
import { showConfigurationPath } from './path'
import { removeConfiguration } from './remove'
import { runConfiguration, runConfigurationByName } from './run'
import { showConfiguration } from './show'
import { logError } from '../../lib/util/error.js'
import { createConfiguration } from './create.js'
import { showConfigurationPath } from './path.js'
import { removeConfiguration } from './remove.js'
import { runConfiguration, runConfigurationByName } from './run.js'
import { showConfiguration } from './show.js'

export async function addConfigurationsCommands(program: Command) {
const configurations = new Command('configurations')
Expand Down
6 changes: 3 additions & 3 deletions src/commands/configurations/path.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { bold } from 'chalk'
import { configurationPath } from '../../lib/configurations'
import chalk from 'chalk'
import { configurationPath } from '../../lib/configurations/index.js'

export const showConfigurationPath = () => {
console.log(bold(configurationPath))
console.log(chalk.bold(configurationPath))
}
8 changes: 4 additions & 4 deletions src/commands/configurations/prompts/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { getConfigurations } from '../../../lib/configurations'
import { Configuration, ConfigurationChooseAnswers } from '../../../lib/types'
import { searchByKey } from '../../../lib/util/search'
import { tryCatch } from '../../../lib/util/error'
import { getConfigurations } from '../../../lib/configurations/index.js'
import { Configuration, ConfigurationChooseAnswers } from '../../../lib/types.js'
import { searchByKey } from '../../../lib/util/search.js'
import { tryCatch } from '../../../lib/util/error.js'

const formatConfiguration = (configuration: Configuration) => {
return {
Expand Down
8 changes: 4 additions & 4 deletions src/commands/configurations/prompts/google-cloud-project.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetchGoogleCloudProjects } from '../../../lib/gcloud/projects'
import { ConfigurationCreateAnswers } from '../../../lib/types'
import { tryCatch } from '../../../lib/util/error'
import { search } from '../../../lib/util/search'
import { fetchGoogleCloudProjects } from '../../../lib/gcloud/projects.js'
import { ConfigurationCreateAnswers } from '../../../lib/types.js'
import { tryCatch } from '../../../lib/util/error.js'
import { search } from '../../../lib/util/search.js'

const source = tryCatch((answers: ConfigurationCreateAnswers, input?: string) => {
const projects = fetchGoogleCloudProjects()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { pick } from 'lodash'
import _ from 'lodash'
import {
fetchGoogleCloudSqlInstances,
GoogleCloudSqlInstance,
} from '../../../lib/gcloud/sql-instances'
import { ConfigurationCreateAnswers } from '../../../lib/types'
import { searchByKey } from '../../../lib/util/search'
import { tryCatch } from '../../../lib/util/error'
} from '../../../lib/gcloud/sql-instances.js'
import { ConfigurationCreateAnswers } from '../../../lib/types.js'
import { searchByKey } from '../../../lib/util/search.js'
import { tryCatch } from '../../../lib/util/error.js'

const formatInstance = (instance: GoogleCloudSqlInstance) => {
const { name, region } = instance
return {
name: `${name} (${region})`,
short: name,
value: pick(instance, 'connectionName', 'port'),
value: _.pick(instance, 'connectionName', 'port'),
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/commands/configurations/prompts/kubernetes-context.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetchKubernetesContexts } from '../../../lib/kubectl/contexts'
import { ConfigurationCreateAnswers } from '../../../lib/types'
import { search } from '../../../lib/util/search'
import { tryCatch } from '../../../lib/util/error'
import { fetchKubernetesContexts } from '../../../lib/kubectl/contexts.js'
import { ConfigurationCreateAnswers } from '../../../lib/types.js'
import { search } from '../../../lib/util/search.js'
import { tryCatch } from '../../../lib/util/error.js'

const source = tryCatch((answers: ConfigurationCreateAnswers, input?: string) => {
const instances = fetchKubernetesContexts()
Expand Down
8 changes: 4 additions & 4 deletions src/commands/configurations/prompts/kubernetes-namespace.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetchKubernetesNamespaces } from '../../../lib/kubectl/namespaces'
import { ConfigurationCreateAnswers } from '../../../lib/types'
import { search } from '../../../lib/util/search'
import { tryCatch } from '../../../lib/util/error'
import { fetchKubernetesNamespaces } from '../../../lib/kubectl/namespaces.js'
import { ConfigurationCreateAnswers } from '../../../lib/types.js'
import { search } from '../../../lib/util/search.js'
import { tryCatch } from '../../../lib/util/error.js'

const source = tryCatch((answers: ConfigurationCreateAnswers, input?: string) => {
const instances = fetchKubernetesNamespaces(answers.kubernetesContext)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fetchKubernetesServiceAccounts } from '../../../lib/kubectl/service-accounts'
import { ConfigurationCreateAnswers } from '../../../lib/types'
import { search } from '../../../lib/util/search'
import { tryCatch } from '../../../lib/util/error'
import { fetchKubernetesServiceAccounts } from '../../../lib/kubectl/service-accounts.js'
import { ConfigurationCreateAnswers } from '../../../lib/types.js'
import { search } from '../../../lib/util/search.js'
import { tryCatch } from '../../../lib/util/error.js'

const source = tryCatch((answers: ConfigurationCreateAnswers, input?: string) => {
const instances = fetchKubernetesServiceAccounts(
Expand Down
14 changes: 7 additions & 7 deletions src/commands/configurations/remove.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { green, red, bold } from 'chalk'
import chalk from 'chalk'
import inquirer from 'inquirer'
import autocomplete from 'inquirer-autocomplete-prompt'
import { deleteConfiguration } from '../../lib/configurations'
import { ConfigurationChooseAnswers } from '../../lib/types'
import { configurationPrompt } from './prompts/configuration'
import { confirmationPrompt } from './prompts/confirmation'
import { deleteConfiguration } from '../../lib/configurations/index.js'
import { ConfigurationChooseAnswers } from '../../lib/types.js'
import { configurationPrompt } from './prompts/configuration.js'
import { confirmationPrompt } from './prompts/confirmation.js'

export const removeConfiguration = async () => {
inquirer.registerPrompt('autocomplete', autocomplete)
Expand All @@ -19,9 +19,9 @@ export const removeConfiguration = async () => {
deleteConfiguration(configuration.configurationName)

console.log(
green(`Deleted configuration '${bold(configuration.configurationName)}'.`)
chalk.green(`Deleted configuration '${chalk.bold(configuration.configurationName)}'.`)
)
} else {
console.log(red('You are excused.'))
console.log(chalk.red('You are excused.'))
}
}
12 changes: 6 additions & 6 deletions src/commands/configurations/run.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { red } from 'chalk'
import chalk from 'chalk'
import inquirer from 'inquirer'
import autocomplete from 'inquirer-autocomplete-prompt'
import { execConfiguration, getConfiguration } from '../../lib/configurations'
import { ConfigurationChooseAnswers } from '../../lib/types'
import { configurationPrompt } from './prompts/configuration'
import { confirmationPrompt } from './prompts/confirmation'
import { execConfiguration, getConfiguration } from '../../lib/configurations/index.js'
import { ConfigurationChooseAnswers } from '../../lib/types.js'
import { configurationPrompt } from './prompts/configuration.js'
import { confirmationPrompt } from './prompts/confirmation.js'

export const runConfiguration = async () => {
inquirer.registerPrompt('autocomplete', autocomplete)
Expand All @@ -18,7 +18,7 @@ export const runConfiguration = async () => {
if (confirmation) {
execConfiguration(configuration)
} else {
console.log(red('You are excused.'))
console.log(chalk.red('You are excused.'))
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/commands/configurations/show.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import inquirer from 'inquirer'
import autocomplete from 'inquirer-autocomplete-prompt'
import { ConfigurationChooseAnswers } from '../../lib/types'
import { configurationPrompt } from './prompts/configuration'
import { ConfigurationChooseAnswers } from '../../lib/types.js'
import { configurationPrompt } from './prompts/configuration.js'

export const showConfiguration = async () => {
inquirer.registerPrompt('autocomplete', autocomplete)
Expand Down
6 changes: 3 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#!/usr/bin/env node

import { Command } from 'commander'
import { addConfigurationsCommands } from './commands/configurations'
import { notifyForUpdates } from './lib/updates'
import { version } from './lib/version'
import { addConfigurationsCommands } from './commands/configurations/index.js'
import { notifyForUpdates } from './lib/updates.js'
import { version } from './lib/version.js'

async function main() {
notifyForUpdates()
Expand Down
14 changes: 7 additions & 7 deletions src/lib/configurations/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import exitHook from 'exit-hook'
import { omit } from 'lodash'
import _ from 'lodash'
import {
deletePod,
portForward,
runCloudSqlProxyPod,
waitForPodReady,
} from '../kubectl/pods'
import { Configuration, ConfigurationCreateAnswers } from '../types'
import { appendOrReplaceByKey, deleteByKey, findByKey } from '../util/array'
import { randomString } from '../util/string'
import { store } from './store'
} from '../kubectl/pods.js'
import { Configuration, ConfigurationCreateAnswers } from '../types.js'
import { appendOrReplaceByKey, deleteByKey, findByKey } from '../util/array.js'
import { randomString } from '../util/string.js'
import { store } from './store.js'

const storeKey = 'configurations' as const
const searchKey = 'configurationName' as const
Expand All @@ -25,7 +25,7 @@ export const getConfiguration = (name: string): Configuration | undefined => {
}

export const saveConfiguration = (answers: ConfigurationCreateAnswers): void => {
const configuration = omit(answers, excludeProperties)
const configuration = _.omit(answers, excludeProperties)

const configurations = store.get(storeKey)
appendOrReplaceByKey(configurations, configuration, searchKey)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/configurations/store.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Conf from 'conf'
import { Configuration } from '../types'
import { Configuration } from '../types.js'

type Schema = {
configurations: Configuration[]
Expand Down
2 changes: 1 addition & 1 deletion src/lib/gcloud/projects.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import memoize from 'memoizee'
import { execCommandMultiline } from '../util/exec'
import { execCommandMultiline } from '../util/exec.js'

export const fetchGoogleCloudProjects = memoize((): string[] => {
return execCommandMultiline(`
Expand Down
2 changes: 1 addition & 1 deletion src/lib/gcloud/sql-instances.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import memoize from 'memoizee'
import { execCommandMultiline } from '../util/exec'
import { execCommandMultiline } from '../util/exec.js'

export type GoogleCloudSqlInstance = {
name: string
Expand Down
2 changes: 1 addition & 1 deletion src/lib/kubectl/contexts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import memoize from 'memoizee'
import { execCommand, execCommandMultiline } from '../util/exec'
import { execCommand, execCommandMultiline } from '../util/exec.js'

export const fetchKubernetesCurrentContext = (): string => {
return execCommand(`kubectl config current-context`)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/kubectl/namespaces.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import memoize from 'memoizee'
import { execCommandMultiline } from '../util/exec'
import { execCommandMultiline } from '../util/exec.js'

export const fetchKubernetesNamespaces = memoize((context: string): string[] => {
return execCommandMultiline(`
Expand Down
14 changes: 7 additions & 7 deletions src/lib/kubectl/pods.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { bold, cyan } from 'chalk'
import { execCommand, execCommandAttached } from '../util/exec'
import chalk from 'chalk'
import { execCommand, execCommandAttached } from '../util/exec.js'

type CloudSqlProxyPod = {
name: string
Expand All @@ -26,28 +26,28 @@ export const runCloudSqlProxyPod = (pod: CloudSqlProxyPod): string => {
}

export const deletePod = (pod: CloudSqlProxyPod) => {
console.log(`Deleting pod '${bold(cyan(pod.name))}'.`)
console.log(`Deleting pod '${chalk.bold.cyan(pod.name)}'.`)
execCommand(`
kubectl delete pod ${pod.name} \
--context="${pod.context}" \
--namespace="${pod.namespace}"
`)
console.log(`Pod '${bold(cyan(pod.name))}' deleted.`)
console.log(`Pod '${chalk.cyan(pod.name)}' deleted.`)
}

export const waitForPodReady = (pod: CloudSqlProxyPod) => {
console.log(`Waiting for pod '${bold(cyan(pod.name))}'.`)
console.log(`Waiting for pod '${chalk.bold.cyan(pod.name)}'.`)
execCommand(`
kubectl wait pod ${pod.name} \
--for=condition=ready \
--context="${pod.context}" \
--namespace="${pod.namespace}"
`)
console.log(`Pod '${bold(cyan(pod.name))}' is ready.`)
console.log(`Pod '${chalk.bold.cyan(pod.name)}' is ready.`)
}

export const portForward = (pod: CloudSqlProxyPod) => {
console.log(`Starting port forwarding to pod '${bold(cyan(pod.name))}'.`)
console.log(`Starting port forwarding to pod '${chalk.bold.cyan(pod.name)}'.`)
execCommandAttached(`
kubectl port-forward ${pod.name} ${pod.localPort}:${pod.remotePort} \
--context="${pod.context}" \
Expand Down
2 changes: 1 addition & 1 deletion src/lib/kubectl/service-accounts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import memoize from 'memoizee'
import { execCommandMultiline } from '../util/exec'
import { execCommandMultiline } from '../util/exec.js'

export const fetchKubernetesServiceAccounts = memoize(
(context: string, namespace: string): string[] => {
Expand Down
Loading