tfv 5.0.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.github/workflows/publish.yml +27 -3
  2. package/README.md +190 -132
  3. package/demo.gif +0 -0
  4. package/demo.tape +230 -0
  5. package/index.js +0 -4
  6. package/lib/commands/apply.js +8 -3
  7. package/lib/commands/current.js +25 -0
  8. package/lib/commands/destroy.js +8 -3
  9. package/lib/commands/fmt.js +26 -0
  10. package/lib/commands/init.js +26 -0
  11. package/lib/commands/install.js +22 -13
  12. package/lib/commands/list.js +20 -11
  13. package/lib/commands/pin.js +26 -0
  14. package/lib/commands/plan.js +8 -3
  15. package/lib/commands/remove.js +17 -12
  16. package/lib/commands/shell-init.js +25 -0
  17. package/lib/commands/switch.js +28 -7
  18. package/lib/commands/upgrade.js +26 -0
  19. package/lib/commands/use.js +17 -13
  20. package/lib/commands/validate.js +21 -0
  21. package/lib/modules/current.js +52 -0
  22. package/lib/modules/install.js +155 -89
  23. package/lib/modules/list.js +66 -105
  24. package/lib/modules/pin.js +35 -0
  25. package/lib/modules/ps1.js +37 -29
  26. package/lib/modules/remote.js +68 -15
  27. package/lib/modules/remove.js +35 -21
  28. package/lib/modules/shell-init.js +113 -0
  29. package/lib/modules/switch.js +125 -41
  30. package/lib/modules/terraform-command.js +49 -67
  31. package/lib/modules/upgrade.js +93 -0
  32. package/lib/modules/use.js +58 -54
  33. package/lib/utils/formatVersions.js +57 -5
  34. package/lib/utils/paths.js +156 -0
  35. package/lib/utils/postInstall.js +37 -13
  36. package/lib/utils/store.js +17 -6
  37. package/package.json +11 -9
  38. package/test/extractTargets.test.js +75 -0
  39. package/test/formatVersions.test.js +126 -0
  40. package/test/moduleImports.test.js +45 -0
  41. package/test/paths.test.js +69 -0
  42. package/test/versionResolution.test.js +92 -0
package/demo.tape ADDED
@@ -0,0 +1,230 @@
1
+ # tfv — demo tape
2
+ # Run with: vhs demo.tape
3
+
4
+ Output demo.gif
5
+
6
+ # ── Terminal settings ──────────────────────────────────────────────────────────
7
+ Set FontSize 14
8
+ Set Width 1000
9
+ Set Height 580
10
+ Set Theme "Catppuccin Mocha"
11
+ Set Shell "zsh"
12
+ Set Padding 24
13
+ Set TypingSpeed 40ms
14
+ Set PlaybackSpeed 1
15
+
16
+ # ══════════════════════════════════════════════════════════════════════════════
17
+ # 1. HELP
18
+ # ══════════════════════════════════════════════════════════════════════════════
19
+ Sleep 500ms
20
+ Type "tfv --help"
21
+ Enter
22
+ Sleep 3s
23
+
24
+ # ══════════════════════════════════════════════════════════════════════════════
25
+ # 2. INSTALL MULTIPLE VERSIONS
26
+ # ══════════════════════════════════════════════════════════════════════════════
27
+
28
+ # Install latest stable
29
+ Type "tfv install latest"
30
+ Enter
31
+ Sleep 5s
32
+
33
+ # Install a specific version
34
+ Type "tfv install 1.8.5"
35
+ Enter
36
+ Sleep 5s
37
+
38
+ # Install an older version using ^ (latest patch in series)
39
+ Type "tfv install 1.7.^"
40
+ Enter
41
+ Sleep 5s
42
+
43
+ # Install 1.6.x series
44
+ Type "tfv install 1.6.^"
45
+ Enter
46
+ Sleep 5s
47
+
48
+ # ══════════════════════════════════════════════════════════════════════════════
49
+ # 3. LIST INSTALLED VERSIONS
50
+ # ══════════════════════════════════════════════════════════════════════════════
51
+ Type "tfv list"
52
+ Enter
53
+ Sleep 2s
54
+
55
+ # ══════════════════════════════════════════════════════════════════════════════
56
+ # 4. SWITCH BETWEEN VERSIONS — show terraform version changes
57
+ # ══════════════════════════════════════════════════════════════════════════════
58
+
59
+ Type "tfv use 1.6.7"
60
+ Enter
61
+ Sleep 1500ms
62
+ Type "terraform version"
63
+ Enter
64
+ Sleep 1500ms
65
+
66
+ Type "tfv use 1.7.5"
67
+ Enter
68
+ Sleep 1500ms
69
+ Type "terraform version"
70
+ Enter
71
+ Sleep 1500ms
72
+
73
+ Type "tfv use 1.8.5"
74
+ Enter
75
+ Sleep 1500ms
76
+ Type "terraform version"
77
+ Enter
78
+ Sleep 1500ms
79
+
80
+ Type "tfv use latest"
81
+ Enter
82
+ Sleep 1500ms
83
+ Type "terraform version"
84
+ Enter
85
+ Sleep 2s
86
+
87
+ # ══════════════════════════════════════════════════════════════════════════════
88
+ # 5. CURRENT — active version + PATH status
89
+ # ══════════════════════════════════════════════════════════════════════════════
90
+ Type "tfv current"
91
+ Enter
92
+ Sleep 2s
93
+
94
+ # ══════════════════════════════════════════════════════════════════════════════
95
+ # 6. AUTO-SWITCH — reads required_version from .tf file
96
+ # ══════════════════════════════════════════════════════════════════════════════
97
+ Hide
98
+ Type "mkdir -p /tmp/tfv-demo-tf && printf 'terraform { required_version = \\042~> 1.7\\042 }\\n' > /tmp/tfv-demo-tf/versions.tf && cd /tmp/tfv-demo-tf"
99
+ Enter
100
+ Sleep 500ms
101
+ Type "clear"
102
+ Enter
103
+ Sleep 200ms
104
+ Show
105
+
106
+ Type "tfv auto-switch"
107
+ Enter
108
+ Sleep 2s
109
+
110
+ Type "terraform version"
111
+ Enter
112
+ Sleep 1500ms
113
+
114
+ Hide
115
+ Type "cd -"
116
+ Enter
117
+ Sleep 300ms
118
+ Type "clear"
119
+ Enter
120
+ Sleep 200ms
121
+ Show
122
+
123
+ # AUTO-SWITCH from .terraform-version file
124
+ Hide
125
+ Type "mkdir -p /tmp/tfv-demo-pin && echo '1.6.7' > /tmp/tfv-demo-pin/.terraform-version && cd /tmp/tfv-demo-pin"
126
+ Enter
127
+ Sleep 500ms
128
+ Type "clear"
129
+ Enter
130
+ Sleep 200ms
131
+ Show
132
+
133
+ Type "tfv auto-switch"
134
+ Enter
135
+ Sleep 2s
136
+
137
+ Type "terraform version"
138
+ Enter
139
+ Sleep 1500ms
140
+
141
+ Hide
142
+ Type "cd -"
143
+ Enter
144
+ Sleep 300ms
145
+ Type "clear"
146
+ Enter
147
+ Sleep 200ms
148
+ Show
149
+
150
+ # ══════════════════════════════════════════════════════════════════════════════
151
+ # 7. PIN — lock version for teammates
152
+ # ══════════════════════════════════════════════════════════════════════════════
153
+ Hide
154
+ Type "tfv use latest"
155
+ Enter
156
+ Sleep 500ms
157
+ Type "clear"
158
+ Enter
159
+ Sleep 200ms
160
+ Show
161
+
162
+ Type "tfv pin"
163
+ Enter
164
+ Sleep 500ms
165
+
166
+ Type "cat .terraform-version"
167
+ Enter
168
+ Sleep 1500ms
169
+
170
+ # ══════════════════════════════════════════════════════════════════════════════
171
+ # 8. UPGRADE — latest patch in current series
172
+ # ══════════════════════════════════════════════════════════════════════════════
173
+ Type "tfv use 1.8.5"
174
+ Enter
175
+ Sleep 1000ms
176
+
177
+ Type "tfv upgrade"
178
+ Enter
179
+ Sleep 5s
180
+
181
+ Type "terraform version"
182
+ Enter
183
+ Sleep 2s
184
+
185
+ # ══════════════════════════════════════════════════════════════════════════════
186
+ # 9. REMOVE versions
187
+ # ══════════════════════════════════════════════════════════════════════════════
188
+ Type "tfv remove 1.6.7"
189
+ Enter
190
+ Sleep 1s
191
+
192
+ Type "tfv list"
193
+ Enter
194
+ Sleep 2s
195
+
196
+ # ══════════════════════════════════════════════════════════════════════════════
197
+ # 10. OPENTOFU — --provider tofu switches to OpenTofu; omit for terraform default
198
+ # ══════════════════════════════════════════════════════════════════════════════
199
+
200
+ # No --provider needed for terraform (it's the default)
201
+ Type "tfv list"
202
+ Enter
203
+ Sleep 1500ms
204
+
205
+ # Add --provider tofu to target OpenTofu instead
206
+ Type "tfv install latest --provider tofu"
207
+ Enter
208
+ Sleep 5s
209
+
210
+ Type "tfv use latest --provider tofu"
211
+ Enter
212
+ Sleep 1500ms
213
+
214
+ Type "tfv current --provider tofu"
215
+ Enter
216
+ Sleep 1500ms
217
+
218
+ Type "tofu version"
219
+ Enter
220
+ Sleep 2s
221
+
222
+ # List available remote OpenTofu versions
223
+ Type "tfv list --remote --provider tofu"
224
+ Enter
225
+ Sleep 4s
226
+
227
+ # ══════════════════════════════════════════════════════════════════════════════
228
+ # END
229
+ # ══════════════════════════════════════════════════════════════════════════════
230
+ Sleep 2s
package/index.js CHANGED
@@ -6,10 +6,6 @@ const {join} = require('path')
6
6
  yargs
7
7
  .commandDir(join(__dirname, 'lib', 'commands'))
8
8
  .alias('help', 'h')
9
- .alias('version', 'v')
10
9
  .scriptName('tfv')
11
- .demandCommand(1, 'You need at least one command before moving on')
12
- .strictOptions()
13
- // .strictCommands()
14
10
  .showHelpOnFail()
15
11
  .argv
@@ -11,12 +11,17 @@ exports.builder = (yargs) => {
11
11
  describe: 'Terraform file(s) to extract targets from',
12
12
  type: 'array',
13
13
  })
14
+ .option('provider', {
15
+ alias: 'p',
16
+ describe: 'Provider: terraform (default) or tofu/opentofu',
17
+ type: 'string',
18
+ default: 'terraform',
19
+ })
14
20
  .epilog('Accepts all terraform flags after --\nExample:\n tfv apply --file main.tf --file network.tf -- -auto-approve -target=<TARGET> -var="env=prod"')
15
21
  }
16
22
 
17
23
  exports.handler = async (argv) => {
18
- const {file, _} = argv;
19
- // Extra args come after -- in the command line
24
+ const {file, _, provider} = argv;
20
25
  const extraArgs = _.slice(1);
21
- await runTerraformCommand('apply', file, extraArgs);
26
+ await runTerraformCommand('apply', file, extraArgs, provider);
22
27
  }
@@ -0,0 +1,25 @@
1
+ 'use strict'
2
+
3
+ const { current } = require('../modules/current');
4
+
5
+ exports.command = 'current'
6
+ exports.aliases = ['which']
7
+ exports.desc = 'Show the currently active terraform or opentofu version'
8
+ exports.builder = (yargs) => {
9
+ return yargs
10
+ .option('provider', {
11
+ alias: 'p',
12
+ describe: 'Provider: terraform (default) or tofu/opentofu',
13
+ type: 'string',
14
+ default: 'terraform',
15
+ })
16
+ .epilog([
17
+ 'Examples:',
18
+ ' tfv current',
19
+ ' tfv which --provider tofu',
20
+ ].join('\n'))
21
+ }
22
+
23
+ exports.handler = async (argv) => {
24
+ await current(argv.provider);
25
+ }
@@ -11,12 +11,17 @@ exports.builder = (yargs) => {
11
11
  describe: 'Terraform file(s) to extract targets from',
12
12
  type: 'array',
13
13
  })
14
+ .option('provider', {
15
+ alias: 'p',
16
+ describe: 'Provider: terraform (default) or tofu/opentofu',
17
+ type: 'string',
18
+ default: 'terraform',
19
+ })
14
20
  .epilog('Accepts all terraform flags after --\nExample:\n tfv destroy --file main.tf --file network.tf -- -auto-approve -target=<TARGET> -var="env=prod"')
15
21
  }
16
22
 
17
23
  exports.handler = async (argv) => {
18
- const {file, _} = argv;
19
- // Extra args come after -- in the command line
24
+ const {file, _, provider} = argv;
20
25
  const extraArgs = _.slice(1);
21
- await runTerraformCommand('destroy', file, extraArgs);
26
+ await runTerraformCommand('destroy', file, extraArgs, provider);
22
27
  }
@@ -0,0 +1,26 @@
1
+ 'use strict'
2
+
3
+ const { runTerraformCommand } = require('../modules/terraform-command');
4
+
5
+ exports.command = 'fmt'
6
+ exports.desc = 'Run terraform fmt. Accepts all terraform flags after --'
7
+ exports.builder = (yargs) => {
8
+ return yargs
9
+ .option('provider', {
10
+ alias: 'p',
11
+ describe: 'Provider: terraform (default) or tofu/opentofu',
12
+ type: 'string',
13
+ default: 'terraform',
14
+ })
15
+ .epilog([
16
+ 'Examples:',
17
+ ' tfv fmt',
18
+ ' tfv fmt -- -recursive',
19
+ ' tfv fmt -- -check',
20
+ ].join('\n'))
21
+ }
22
+
23
+ exports.handler = async (argv) => {
24
+ const extraArgs = argv._.slice(1);
25
+ await runTerraformCommand('fmt', null, extraArgs, argv.provider);
26
+ }
@@ -0,0 +1,26 @@
1
+ 'use strict'
2
+
3
+ const { runTerraformCommand } = require('../modules/terraform-command');
4
+
5
+ exports.command = 'init'
6
+ exports.desc = 'Run terraform init. Accepts all terraform flags after --'
7
+ exports.builder = (yargs) => {
8
+ return yargs
9
+ .option('provider', {
10
+ alias: 'p',
11
+ describe: 'Provider: terraform (default) or tofu/opentofu',
12
+ type: 'string',
13
+ default: 'terraform',
14
+ })
15
+ .epilog([
16
+ 'Examples:',
17
+ ' tfv init',
18
+ ' tfv init -- -upgrade',
19
+ ' tfv init -- -backend-config=backend.hcl',
20
+ ].join('\n'))
21
+ }
22
+
23
+ exports.handler = async (argv) => {
24
+ const extraArgs = argv._.slice(1);
25
+ await runTerraformCommand('init', null, extraArgs, argv.provider);
26
+ }
@@ -1,26 +1,35 @@
1
1
  'use strict'
2
2
 
3
- const yargs = require('yargs');
4
- const {install} = require('../modules/install');
3
+ const { install } = require('../modules/install');
5
4
 
6
- exports.command = 'install <version> [option]'
5
+ exports.command = 'install <ver>'
7
6
  exports.aliases = ['i']
8
- exports.desc = 'Install a terraform version'
7
+ exports.desc = 'Install a terraform or opentofu version'
9
8
  exports.builder = (yargs) => {
10
9
  return yargs
11
10
  .option('arch', {
12
11
  alias: 'a',
13
- describe: 'Specify system architecture. Defaults is the user system architecture',
12
+ describe: 'Specify system architecture (arm64, amd64, etc). Defaults to your system arch.',
14
13
  type: 'string',
15
- default: ''
14
+ default: '',
16
15
  })
17
- .epilog('Version formats: latest, x.x.x (exact), x^ (latest major), x.x.^ (latest minor)\nExample: tfv install 1.5.7 --arch amd64')
16
+ .option('provider', {
17
+ alias: 'p',
18
+ describe: 'Provider to install: terraform (default) or tofu/opentofu',
19
+ type: 'string',
20
+ default: 'terraform',
21
+ })
22
+ .epilog([
23
+ 'Version formats: latest, x.x.x (exact), x^ (latest major), x.x.^ (latest minor)',
24
+ 'Examples:',
25
+ ' tfv install latest',
26
+ ' tfv install 1.7.3',
27
+ ' tfv install 1.7.^',
28
+ ' tfv install latest --provider tofu',
29
+ ].join('\n'))
18
30
  }
19
31
 
20
- exports.handler = async () => {
21
- const [,version] = yargs.argv._;
22
- const {arch} = yargs.argv;
23
-
24
- await install(version, arch);
32
+ exports.handler = async (argv) => {
33
+ const { ver, arch, provider } = argv;
34
+ await install(ver, arch, provider);
25
35
  }
26
-
@@ -1,29 +1,38 @@
1
1
  'use strict'
2
2
 
3
- const yargs = require('yargs');
4
- const {list} = require('../modules/list');
3
+ const { list } = require('../modules/list');
5
4
 
6
- exports.command = 'list [option]'
5
+ exports.command = 'list'
7
6
  exports.aliases = ['ls']
8
- exports.desc = 'List installed or available terraform versions'
7
+ exports.desc = 'List installed or available terraform/opentofu versions'
9
8
  exports.builder = (yargs) => {
10
9
  return yargs
11
10
  .option('local', {
12
11
  alias: 'l',
13
- describe: 'List terraform versions you have installed using tfv',
12
+ describe: 'List versions installed locally (default)',
14
13
  type: 'boolean',
15
14
  default: true,
16
15
  })
17
16
  .option('remote', {
18
17
  alias: 'r',
19
- describe: 'List all available terraform versions',
18
+ describe: 'List all available remote versions',
20
19
  type: 'boolean',
21
20
  })
22
- .epilog('Examples:\n tfv ls List locally installed versions\n tfv ls --remote List all available remote versions')
21
+ .option('provider', {
22
+ alias: 'p',
23
+ describe: 'Provider: terraform (default) or tofu/opentofu',
24
+ type: 'string',
25
+ default: 'terraform',
26
+ })
27
+ .epilog([
28
+ 'Examples:',
29
+ ' tfv ls List locally installed terraform versions',
30
+ ' tfv ls --remote List all available terraform versions',
31
+ ' tfv ls --remote --provider tofu List all available opentofu versions',
32
+ ].join('\n'))
23
33
  }
24
34
 
25
- exports.handler = async () => {
26
- const {local, remote} = yargs.argv;
27
- await list(local, remote);
35
+ exports.handler = async (argv) => {
36
+ const { local, remote, provider } = argv;
37
+ await list(local, remote, provider);
28
38
  }
29
-
@@ -0,0 +1,26 @@
1
+ 'use strict'
2
+
3
+ const { pin } = require('../modules/pin');
4
+
5
+ exports.command = 'pin [ver]'
6
+ exports.desc = 'Pin the active (or specified) version to a .terraform-version file'
7
+ exports.builder = (yargs) => {
8
+ return yargs
9
+ .option('provider', {
10
+ alias: 'p',
11
+ describe: 'Provider: terraform (default) or tofu/opentofu',
12
+ type: 'string',
13
+ default: 'terraform',
14
+ })
15
+ .epilog([
16
+ 'Creates a .terraform-version file in the current directory.',
17
+ 'Examples:',
18
+ ' tfv pin Pin currently active version',
19
+ ' tfv pin 1.7.3 Pin a specific version',
20
+ ' tfv pin --provider tofu',
21
+ ].join('\n'))
22
+ }
23
+
24
+ exports.handler = async (argv) => {
25
+ await pin(argv.ver, argv.provider);
26
+ }
@@ -11,12 +11,17 @@ exports.builder = (yargs) => {
11
11
  describe: 'Terraform file(s) to extract targets from',
12
12
  type: 'array',
13
13
  })
14
+ .option('provider', {
15
+ alias: 'p',
16
+ describe: 'Provider: terraform (default) or tofu/opentofu',
17
+ type: 'string',
18
+ default: 'terraform',
19
+ })
14
20
  .epilog('Accepts all terraform flags after --\nExample:\n tfv plan --file main.tf --file network.tf -- -auto-approve -target=<TARGET> -var="env=prod"')
15
21
  }
16
22
 
17
23
  exports.handler = async (argv) => {
18
- const {file, _} = argv;
19
- // Extra args come after -- in the command line
24
+ const {file, _, provider} = argv;
20
25
  const extraArgs = _.slice(1);
21
- await runTerraformCommand('plan', file, extraArgs);
26
+ await runTerraformCommand('plan', file, extraArgs, provider);
22
27
  }
@@ -1,22 +1,27 @@
1
1
  'use strict'
2
2
 
3
- const yargs = require('yargs');
4
- const {remove} = require('../modules/remove');
3
+ const { remove } = require('../modules/remove');
5
4
 
6
- exports.command = 'remove <version>'
5
+ exports.command = 'remove <ver>'
7
6
  exports.aliases = ['rm']
8
- exports.desc = 'Remove terraform versions from tfv store'
7
+ exports.desc = 'Remove terraform/opentofu versions from tfv store'
9
8
  exports.builder = (yargs) => {
10
9
  return yargs
11
- .option('verbose', {
12
- describe: 'Produce detailed output',
13
- type: 'boolean',
10
+ .option('provider', {
11
+ alias: 'p',
12
+ describe: 'Provider: terraform (default) or tofu/opentofu',
13
+ type: 'string',
14
+ default: 'terraform',
14
15
  })
15
- .epilog('Example: tfv rm 1.5.7 1.4.6')
16
+ .epilog([
17
+ 'Examples:',
18
+ ' tfv rm 1.5.7 1.4.6',
19
+ ' tfv rm 1.7.3 --provider tofu',
20
+ ].join('\n'))
16
21
  }
17
22
 
18
- exports.handler = async () => {
19
- const [,...version] = yargs.argv._;
20
-
21
- await remove(version);
23
+ exports.handler = async (argv) => {
24
+ const versions = argv._.slice(1);
25
+ const { provider } = argv;
26
+ await remove(versions, provider);
22
27
  }
@@ -0,0 +1,25 @@
1
+ 'use strict'
2
+
3
+ const { shellInit } = require('../modules/shell-init');
4
+
5
+ exports.command = 'shell-init <shell>'
6
+ exports.desc = 'Generate shell hook for automatic version switching on cd'
7
+ exports.builder = (yargs) => {
8
+ return yargs
9
+ .positional('shell', {
10
+ describe: 'Shell to generate hook for',
11
+ choices: ['bash', 'zsh', 'fish', 'powershell', 'pwsh'],
12
+ })
13
+ .epilog([
14
+ 'Outputs a shell script to stdout intended to be eval\'d.',
15
+ 'Setup instructions are printed to stderr.',
16
+ '',
17
+ 'Bash/Zsh: eval "$(tfv shell-init zsh)" # add to ~/.zshrc',
18
+ 'Fish: tfv shell-init fish | source # add to config.fish',
19
+ 'PowerShell: Invoke-Expression (tfv shell-init powershell | Out-String)',
20
+ ].join('\n'))
21
+ }
22
+
23
+ exports.handler = (argv) => {
24
+ shellInit(argv.shell);
25
+ }
@@ -1,19 +1,40 @@
1
1
  'use strict'
2
2
 
3
- const {autoSwitch} = require('../modules/switch');
3
+ const { autoSwitch } = require('../modules/switch');
4
4
 
5
5
  exports.command = 'auto-switch'
6
6
  exports.aliases = ['as']
7
7
  exports.desc = 'Auto-detect and switch to your project terraform version'
8
8
  exports.builder = (yargs) => {
9
9
  return yargs
10
- .option('verbose', {
11
- describe: 'Produce detailed output',
12
- type: 'boolean'
10
+ .option('provider', {
11
+ alias: 'p',
12
+ describe: 'Provider: terraform (default) or tofu/opentofu',
13
+ type: 'string',
14
+ default: 'terraform',
13
15
  })
14
- .epilog('Reads version from .terraform-version or required_version in .tf files\nExample: tfv auto-switch')
16
+ .option('silent', {
17
+ alias: 's',
18
+ describe: 'Suppress output (used by shell hooks)',
19
+ type: 'boolean',
20
+ default: false,
21
+ })
22
+ .epilog([
23
+ 'Reads version from (in priority order):',
24
+ ' 1. .terraform-version file',
25
+ ' 2. terraform.tfstate',
26
+ ' 3. required_version in .tf files',
27
+ 'Examples:',
28
+ ' tfv auto-switch',
29
+ ' tfv as --provider tofu',
30
+ ].join('\n'))
15
31
  }
16
32
 
17
- exports.handler = async () => {
18
- await autoSwitch();
33
+ exports.handler = async (argv) => {
34
+ const { silent, provider } = argv;
35
+ if (silent) {
36
+ console.log = () => {};
37
+ console.warn = () => {};
38
+ }
39
+ await autoSwitch({ silent }, provider);
19
40
  }
@@ -0,0 +1,26 @@
1
+ 'use strict'
2
+
3
+ const { upgrade } = require('../modules/upgrade');
4
+
5
+ exports.command = 'upgrade [ver]'
6
+ exports.desc = 'Upgrade to the latest patch version in the active (or given) series'
7
+ exports.builder = (yargs) => {
8
+ return yargs
9
+ .option('provider', {
10
+ alias: 'p',
11
+ describe: 'Provider: terraform (default) or tofu/opentofu',
12
+ type: 'string',
13
+ default: 'terraform',
14
+ })
15
+ .epilog([
16
+ 'Examples:',
17
+ ' tfv upgrade Upgrade active 1.6.x → latest 1.6.x patch',
18
+ ' tfv upgrade 1.8 Install + use latest 1.8.x',
19
+ ' tfv upgrade latest Install + use absolute latest version',
20
+ ' tfv upgrade --provider tofu',
21
+ ].join('\n'))
22
+ }
23
+
24
+ exports.handler = async (argv) => {
25
+ await upgrade(argv.ver, argv.provider);
26
+ }