dc-ops-cli 1.6.0 → 1.8.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.
- package/README.md +52 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +22 -4
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/interactive.d.ts +32 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +217 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/run.d.ts +5 -4
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +39 -23
- package/dist/commands/run.js.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +5 -2
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/config.d.ts +25 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +101 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/env-mapping.d.ts +9 -0
- package/dist/utils/env-mapping.d.ts.map +1 -0
- package/dist/utils/env-mapping.js +57 -0
- package/dist/utils/env-mapping.js.map +1 -0
- package/dist/utils/session-cache.d.ts +24 -0
- package/dist/utils/session-cache.d.ts.map +1 -0
- package/dist/utils/session-cache.js +101 -0
- package/dist/utils/session-cache.js.map +1 -0
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -9,9 +9,13 @@ Easy secret retrieval from 1Password with smart fallbacks and interactive prompt
|
|
|
9
9
|
- 🔐 **Smart retrieval** - Get secrets with automatic fallback prompts
|
|
10
10
|
- 🧠 **Smart field detection** - Auto-detects the right field based on item type (API keys use `credential`, logins use `password`)
|
|
11
11
|
- 📝 **Interactive prompts** - Create secrets on-the-fly if not found
|
|
12
|
+
- 🧭 **Interactive mode** - Fuzzy browse vaults and items
|
|
12
13
|
- 📋 **List & search** - Browse your vault items
|
|
13
14
|
- ⭐ **Favorites** - Quick access to your most-used secrets
|
|
14
15
|
- 📤 **Export** - Generate .env files from your vault
|
|
16
|
+
- ⚙️ **Config file** - Defaults via `.opsrc` (vault, field, envFile, parallel)
|
|
17
|
+
- 🔁 **Session caching** - Cache OP_SESSION tokens to reduce prompts
|
|
18
|
+
- ✅ **Validated env mappings** - Schema checks for `.env.ops` / `.env.ops.json`
|
|
15
19
|
- 🔍 **Inspect** - Discover available fields for any secret
|
|
16
20
|
- 🏦 **Vaults** - List and browse available vaults
|
|
17
21
|
- 💡 **Smart suggestions** - Get hints when secrets or fields aren't found
|
|
@@ -172,6 +176,9 @@ Then run:
|
|
|
172
176
|
```bash
|
|
173
177
|
ops run -- node app.js
|
|
174
178
|
|
|
179
|
+
# Resolve secrets in parallel (default: 5)
|
|
180
|
+
ops run --parallel 10 -- node app.js
|
|
181
|
+
|
|
175
182
|
# Or inline mappings
|
|
176
183
|
ops run --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
177
184
|
|
|
@@ -179,6 +186,50 @@ ops run --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
|
179
186
|
ops run --verbose --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
180
187
|
```
|
|
181
188
|
|
|
189
|
+
You can also use JSON mapping files with schema validation:
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"API_KEY": "MY_API_KEY_SECRET",
|
|
194
|
+
"DB_PASSWORD": "MY_DB_PASSWORD"
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Save as `.env.ops.json` and run `ops run -- node app.js` to load it.
|
|
199
|
+
|
|
200
|
+
### Interactive mode
|
|
201
|
+
|
|
202
|
+
Browse vaults and items with a fuzzy finder:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
ops interactive
|
|
206
|
+
# or
|
|
207
|
+
ops i
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Choose an item, then copy/get/inspect it from the action menu.
|
|
211
|
+
|
|
212
|
+
### Config file (.opsrc)
|
|
213
|
+
|
|
214
|
+
Set defaults in `~/.opsrc` or `.opsrc` in your project (JSON or YAML):
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
vault: Work
|
|
218
|
+
field: password
|
|
219
|
+
envFile: .env.ops
|
|
220
|
+
parallel: 8
|
|
221
|
+
sessionCache:
|
|
222
|
+
enabled: true
|
|
223
|
+
path: ~/.config/ops-cli/session.json
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Use a custom path with `OPS_CONFIG=/path/to/.opsrc`.
|
|
227
|
+
|
|
228
|
+
### Session caching
|
|
229
|
+
|
|
230
|
+
By default ops stores OP_SESSION tokens in `~/.config/ops-cli/session.json`.
|
|
231
|
+
Disable with `OPS_NO_SESSION_CACHE=1` or `OPS_SESSION_CACHE=0`.
|
|
232
|
+
|
|
182
233
|
### Resolve a share link
|
|
183
234
|
|
|
184
235
|
```bash
|
|
@@ -401,4 +452,4 @@ npm run build
|
|
|
401
452
|
|
|
402
453
|
## License
|
|
403
454
|
|
|
404
|
-
MIT
|
|
455
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoaH,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -14,7 +14,7 @@ _ops_completion() {
|
|
|
14
14
|
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
15
15
|
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
16
16
|
|
|
17
|
-
commands="get set copy list search favorites vaults inspect export import resolve run completion"
|
|
17
|
+
commands="get set copy list search favorites vaults inspect export import resolve run interactive completion"
|
|
18
18
|
|
|
19
19
|
case "\${COMP_CWORD}" in
|
|
20
20
|
1)
|
|
@@ -91,7 +91,10 @@ _ops_completion() {
|
|
|
91
91
|
opts="-j --json -q --quiet --no-color"
|
|
92
92
|
;;
|
|
93
93
|
run)
|
|
94
|
-
opts="-v --vault -f --field -e --env --env-file --verbose --no-color"
|
|
94
|
+
opts="-v --vault -f --field -e --env --env-file --parallel --verbose --no-color"
|
|
95
|
+
;;
|
|
96
|
+
interactive)
|
|
97
|
+
opts="-v --vault -f --field --no-color"
|
|
95
98
|
;;
|
|
96
99
|
completion)
|
|
97
100
|
opts="bash zsh fish"
|
|
@@ -129,6 +132,7 @@ _ops() {
|
|
|
129
132
|
'import:Import secrets from .env file'
|
|
130
133
|
'resolve:Resolve 1Password share link'
|
|
131
134
|
'run:Run command with secrets injected'
|
|
135
|
+
'interactive:Interactive browsing mode'
|
|
132
136
|
'completion:Generate shell completion script'
|
|
133
137
|
)
|
|
134
138
|
|
|
@@ -284,9 +288,18 @@ _ops() {
|
|
|
284
288
|
'*-e[Map env to secret]:mapping:' \\
|
|
285
289
|
'*--env[Map env to secret]:mapping:' \\
|
|
286
290
|
'--env-file[Env mapping file]:file:_files' \\
|
|
291
|
+
'--parallel[Max concurrent secret lookups]:count:' \\
|
|
287
292
|
'--verbose[Show injected secrets]' \\
|
|
288
293
|
'--no-color[Disable colors]'
|
|
289
294
|
;;
|
|
295
|
+
interactive)
|
|
296
|
+
_arguments \\
|
|
297
|
+
'-v[Vault name]:vault:_ops_vaults' \\
|
|
298
|
+
'--vault[Vault name]:vault:_ops_vaults' \\
|
|
299
|
+
'-f[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
300
|
+
'--field[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
301
|
+
'--no-color[Disable colors]'
|
|
302
|
+
;;
|
|
290
303
|
completion)
|
|
291
304
|
_arguments '1:shell:(bash zsh fish)'
|
|
292
305
|
;;
|
|
@@ -335,6 +348,7 @@ complete -c ops -n __fish_use_subcommand -a export -d 'Export secrets as .env or
|
|
|
335
348
|
complete -c ops -n __fish_use_subcommand -a import -d 'Import secrets from .env file'
|
|
336
349
|
complete -c ops -n __fish_use_subcommand -a resolve -d 'Resolve 1Password share link'
|
|
337
350
|
complete -c ops -n __fish_use_subcommand -a run -d 'Run command with secrets injected'
|
|
351
|
+
complete -c ops -n __fish_use_subcommand -a interactive -d 'Interactive browsing mode'
|
|
338
352
|
complete -c ops -n __fish_use_subcommand -a completion -d 'Generate shell completion script'
|
|
339
353
|
|
|
340
354
|
# Common options
|
|
@@ -377,8 +391,12 @@ complete -c ops -n '__fish_seen_subcommand_from import' -l dry-run -d 'Preview w
|
|
|
377
391
|
# run command options
|
|
378
392
|
complete -c ops -n '__fish_seen_subcommand_from run' -l env -s e -d 'Map env to secret'
|
|
379
393
|
complete -c ops -n '__fish_seen_subcommand_from run' -l env-file -r -d 'Env mapping file'
|
|
394
|
+
complete -c ops -n '__fish_seen_subcommand_from run' -l parallel -d 'Max concurrent secret lookups'
|
|
380
395
|
complete -c ops -n '__fish_seen_subcommand_from run' -l verbose -d 'Show injected secrets'
|
|
381
396
|
|
|
397
|
+
# interactive command options
|
|
398
|
+
complete -c ops -n '__fish_seen_subcommand_from interactive' -l field -s f -d 'Field name'
|
|
399
|
+
|
|
382
400
|
# completion command - shell argument
|
|
383
401
|
complete -c ops -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish' -d 'Shell type'
|
|
384
402
|
|
|
@@ -387,7 +405,7 @@ function __fish_ops_vaults
|
|
|
387
405
|
command -v op &>/dev/null; and op vault list --format=json 2>/dev/null | jq -r '.[].name' 2>/dev/null
|
|
388
406
|
end
|
|
389
407
|
|
|
390
|
-
complete -c ops -n '__fish_seen_subcommand_from get set copy list search favorites inspect export import run' -l vault -s v -xa '(__fish_ops_vaults)'
|
|
408
|
+
complete -c ops -n '__fish_seen_subcommand_from get set copy list search favorites inspect export import run interactive' -l vault -s v -xa '(__fish_ops_vaults)'
|
|
391
409
|
|
|
392
410
|
# Dynamic item completion (if op CLI available)
|
|
393
411
|
function __fish_ops_items
|
|
@@ -397,7 +415,7 @@ end
|
|
|
397
415
|
complete -c ops -n '__fish_seen_subcommand_from get copy inspect' -xa '(__fish_ops_items)'
|
|
398
416
|
|
|
399
417
|
# Field completion
|
|
400
|
-
complete -c ops -n '__fish_seen_subcommand_from get set copy' -l field -s f -xa 'password credential username notesPlain api-key token'
|
|
418
|
+
complete -c ops -n '__fish_seen_subcommand_from get set copy interactive' -l field -s f -xa 'password credential username notesPlain api-key token'
|
|
401
419
|
`;
|
|
402
420
|
export async function completionCommand(shell, options) {
|
|
403
421
|
const targetShell = shell || detectShell();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0GtB,CAAC;AAEF,wBAAwB;AACxB,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuNrB,CAAC;AAEF,yBAAyB;AACzB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFtB,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAyB,EACzB,OAA0B;IAE1B,MAAM,WAAW,GAAG,KAAK,IAAI,WAAW,EAAE,CAAC;IAE3C,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,MAAM;QACR,KAAK,KAAK;YACR,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO,MAAM,CAAC,CAAC,kBAAkB;AACnC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import autocompletePrompt from 'inquirer-autocomplete-prompt';
|
|
3
|
+
import { checkOpCli, listItems, listVaults, getItem } from '../utils/op.js';
|
|
4
|
+
import { applyColorConfig, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault } from '../utils/cli.js';
|
|
5
|
+
import { copyCommand } from './copy.js';
|
|
6
|
+
import { getCommand } from './get.js';
|
|
7
|
+
import { inspectCommand } from './inspect.js';
|
|
8
|
+
export interface InteractiveOptions {
|
|
9
|
+
vault?: string;
|
|
10
|
+
field?: string;
|
|
11
|
+
color?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface InteractiveDependencies {
|
|
14
|
+
checkOpCli: typeof checkOpCli;
|
|
15
|
+
listVaults: typeof listVaults;
|
|
16
|
+
listItems: typeof listItems;
|
|
17
|
+
getItem: typeof getItem;
|
|
18
|
+
prompt: typeof inquirer.prompt;
|
|
19
|
+
registerPrompt: typeof inquirer.registerPrompt;
|
|
20
|
+
autocompletePrompt: typeof autocompletePrompt;
|
|
21
|
+
applyColorConfig: typeof applyColorConfig;
|
|
22
|
+
isInteractiveInput: typeof isInteractiveInput;
|
|
23
|
+
resolveBooleanOption: typeof resolveBooleanOption;
|
|
24
|
+
resolveVault: typeof resolveVault;
|
|
25
|
+
resolveField: typeof resolveField;
|
|
26
|
+
copyCommand: typeof copyCommand;
|
|
27
|
+
getCommand: typeof getCommand;
|
|
28
|
+
inspectCommand: typeof inspectCommand;
|
|
29
|
+
}
|
|
30
|
+
export declare function createInteractiveCommand(overrides?: Partial<InteractiveDependencies>): (options: InteractiveOptions) => Promise<void>;
|
|
31
|
+
export declare const interactiveCommand: (options: InteractiveOptions) => Promise<void>;
|
|
32
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC/B,cAAc,EAAE,OAAO,QAAQ,CAAC,cAAc,CAAC;IAC/C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,OAAO,cAAc,CAAC;CACvC;AA2KD,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAiFhD;AAED,eAAO,MAAM,kBAAkB,YAnFlB,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAmFY,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import autocompletePrompt from 'inquirer-autocomplete-prompt';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { checkOpCli, listItems, listVaults, getItem } from '../utils/op.js';
|
|
5
|
+
import { applyColorConfig, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault, } from '../utils/cli.js';
|
|
6
|
+
import { OpError } from '../utils/types.js';
|
|
7
|
+
import { copyCommand } from './copy.js';
|
|
8
|
+
import { getCommand } from './get.js';
|
|
9
|
+
import { inspectCommand } from './inspect.js';
|
|
10
|
+
const defaultDependencies = {
|
|
11
|
+
checkOpCli,
|
|
12
|
+
listVaults,
|
|
13
|
+
listItems,
|
|
14
|
+
getItem,
|
|
15
|
+
prompt: inquirer.prompt,
|
|
16
|
+
registerPrompt: inquirer.registerPrompt,
|
|
17
|
+
autocompletePrompt,
|
|
18
|
+
applyColorConfig,
|
|
19
|
+
isInteractiveInput,
|
|
20
|
+
resolveBooleanOption,
|
|
21
|
+
resolveVault,
|
|
22
|
+
resolveField,
|
|
23
|
+
copyCommand,
|
|
24
|
+
getCommand,
|
|
25
|
+
inspectCommand,
|
|
26
|
+
};
|
|
27
|
+
const BACK_TO_VAULTS = '__back_to_vaults__';
|
|
28
|
+
const BACK_TO_ITEMS = '__back_to_items__';
|
|
29
|
+
function normalize(value) {
|
|
30
|
+
return value.toLowerCase();
|
|
31
|
+
}
|
|
32
|
+
function fuzzyScore(candidate, query) {
|
|
33
|
+
if (!query)
|
|
34
|
+
return 1;
|
|
35
|
+
const haystack = normalize(candidate);
|
|
36
|
+
const needle = normalize(query);
|
|
37
|
+
if (haystack.includes(needle)) {
|
|
38
|
+
return 1000 - haystack.indexOf(needle);
|
|
39
|
+
}
|
|
40
|
+
let score = 0;
|
|
41
|
+
let lastIndex = -1;
|
|
42
|
+
for (const char of needle) {
|
|
43
|
+
const nextIndex = haystack.indexOf(char, lastIndex + 1);
|
|
44
|
+
if (nextIndex === -1)
|
|
45
|
+
return -1;
|
|
46
|
+
const gap = nextIndex - lastIndex;
|
|
47
|
+
score += Math.max(1, 10 - gap);
|
|
48
|
+
lastIndex = nextIndex;
|
|
49
|
+
}
|
|
50
|
+
return score;
|
|
51
|
+
}
|
|
52
|
+
function filterChoices(values, input, limit = 50) {
|
|
53
|
+
const query = input?.trim() ?? '';
|
|
54
|
+
const scored = values
|
|
55
|
+
.map((value) => ({ value, score: fuzzyScore(value, query) }))
|
|
56
|
+
.filter((entry) => entry.score >= 0)
|
|
57
|
+
.sort((a, b) => b.score - a.score)
|
|
58
|
+
.slice(0, limit);
|
|
59
|
+
return scored.map((entry) => entry.value);
|
|
60
|
+
}
|
|
61
|
+
function createAutocompleteSource(values) {
|
|
62
|
+
return async (_answers, input) => {
|
|
63
|
+
return filterChoices(values, input);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function promptForVault(deps) {
|
|
67
|
+
const vaults = deps.listVaults();
|
|
68
|
+
if (vaults.length === 0) {
|
|
69
|
+
throw new OpError('No vaults found for this account.', 1);
|
|
70
|
+
}
|
|
71
|
+
const choices = vaults.map((vault) => vault.name);
|
|
72
|
+
const answer = await deps.prompt([
|
|
73
|
+
{
|
|
74
|
+
type: 'autocomplete',
|
|
75
|
+
name: 'vault',
|
|
76
|
+
message: 'Select a vault:',
|
|
77
|
+
source: createAutocompleteSource(choices),
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
if (!answer.vault) {
|
|
81
|
+
throw new OpError('No vault selected.', 2);
|
|
82
|
+
}
|
|
83
|
+
return answer.vault;
|
|
84
|
+
}
|
|
85
|
+
async function promptForItem(vault, deps) {
|
|
86
|
+
const items = deps.listItems(vault);
|
|
87
|
+
if (items.length === 0) {
|
|
88
|
+
throw new OpError(`No items found in vault "${vault}".`, 1);
|
|
89
|
+
}
|
|
90
|
+
const choices = [
|
|
91
|
+
{ name: '⬅ Back to vaults', value: BACK_TO_VAULTS },
|
|
92
|
+
...items.map((item) => ({ name: item.title, value: item.title })),
|
|
93
|
+
];
|
|
94
|
+
const answer = await deps.prompt([
|
|
95
|
+
{
|
|
96
|
+
type: 'autocomplete',
|
|
97
|
+
name: 'item',
|
|
98
|
+
message: `Select an item from ${vault}:`,
|
|
99
|
+
source: async (_answers, input) => {
|
|
100
|
+
const filtered = filterChoices(choices.map((choice) => choice.name), input);
|
|
101
|
+
return choices.filter((choice) => filtered.includes(choice.name));
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
if (answer.item === BACK_TO_VAULTS) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return answer.item ?? null;
|
|
109
|
+
}
|
|
110
|
+
async function promptForAction(deps) {
|
|
111
|
+
const answer = await deps.prompt([
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
name: 'action',
|
|
115
|
+
message: 'Choose an action:',
|
|
116
|
+
choices: [
|
|
117
|
+
{ name: 'Copy to clipboard', value: 'copy' },
|
|
118
|
+
{ name: 'Get secret (print value)', value: 'get' },
|
|
119
|
+
{ name: 'Inspect item fields', value: 'inspect' },
|
|
120
|
+
{ name: '⬅ Back to items', value: BACK_TO_ITEMS },
|
|
121
|
+
{ name: 'Exit', value: 'exit' },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
]);
|
|
125
|
+
return answer.action ?? 'exit';
|
|
126
|
+
}
|
|
127
|
+
function renderItemDetails(itemName, vault, deps) {
|
|
128
|
+
const item = deps.getItem(itemName, vault);
|
|
129
|
+
if (!item)
|
|
130
|
+
return;
|
|
131
|
+
console.log(chalk.cyan(`\nItem: ${item.title}`));
|
|
132
|
+
console.log(chalk.gray(`Vault: ${vault}`));
|
|
133
|
+
if (item.category) {
|
|
134
|
+
console.log(chalk.gray(`Category: ${item.category}`));
|
|
135
|
+
}
|
|
136
|
+
if (item.fields && item.fields.length > 0) {
|
|
137
|
+
const labels = item.fields
|
|
138
|
+
.map((field) => field.label)
|
|
139
|
+
.filter((label) => Boolean(label))
|
|
140
|
+
.join(', ');
|
|
141
|
+
if (labels.length > 0) {
|
|
142
|
+
console.log(chalk.gray(`Fields: ${labels}`));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function createInteractiveCommand(overrides = {}) {
|
|
147
|
+
const deps = { ...defaultDependencies, ...overrides };
|
|
148
|
+
return async function interactiveCommand(options) {
|
|
149
|
+
try {
|
|
150
|
+
if (!deps.isInteractiveInput()) {
|
|
151
|
+
throw new OpError('Interactive mode requires a TTY.', 2);
|
|
152
|
+
}
|
|
153
|
+
deps.checkOpCli();
|
|
154
|
+
const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
|
|
155
|
+
const noColor = options.color === false || envNoColor;
|
|
156
|
+
deps.applyColorConfig(noColor);
|
|
157
|
+
deps.registerPrompt('autocomplete', deps.autocompletePrompt);
|
|
158
|
+
const field = deps.resolveField(options.field);
|
|
159
|
+
let selectedVault = options.vault ? deps.resolveVault(options.vault) : undefined;
|
|
160
|
+
while (true) {
|
|
161
|
+
if (!selectedVault) {
|
|
162
|
+
selectedVault = await promptForVault(deps);
|
|
163
|
+
}
|
|
164
|
+
const selectedItem = await promptForItem(selectedVault, deps);
|
|
165
|
+
if (!selectedItem) {
|
|
166
|
+
selectedVault = undefined;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
renderItemDetails(selectedItem, selectedVault, deps);
|
|
170
|
+
while (true) {
|
|
171
|
+
const action = await promptForAction(deps);
|
|
172
|
+
if (action === 'exit')
|
|
173
|
+
return;
|
|
174
|
+
if (action === BACK_TO_ITEMS) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
if (action === 'copy') {
|
|
178
|
+
await deps.copyCommand(selectedItem, {
|
|
179
|
+
vault: selectedVault,
|
|
180
|
+
field,
|
|
181
|
+
quiet: true,
|
|
182
|
+
color: options.color,
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (action === 'get') {
|
|
187
|
+
await deps.getCommand(selectedItem, {
|
|
188
|
+
vault: selectedVault,
|
|
189
|
+
field,
|
|
190
|
+
quiet: false,
|
|
191
|
+
color: options.color,
|
|
192
|
+
});
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (action === 'inspect') {
|
|
196
|
+
await deps.inspectCommand(selectedItem, {
|
|
197
|
+
vault: selectedVault,
|
|
198
|
+
json: false,
|
|
199
|
+
quiet: false,
|
|
200
|
+
color: options.color,
|
|
201
|
+
});
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (error instanceof OpError) {
|
|
209
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
210
|
+
process.exit(error.exitCode);
|
|
211
|
+
}
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export const interactiveCommand = createInteractiveCommand();
|
|
217
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from 'fs';
|
|
2
1
|
import spawn from 'cross-spawn';
|
|
3
2
|
import { checkOpCli, getSecret } from '../utils/op.js';
|
|
3
|
+
import { loadEnvMappingFile } from '../utils/env-mapping.js';
|
|
4
|
+
import { OpsConfig } from '../utils/config.js';
|
|
4
5
|
export interface RunOptions {
|
|
5
6
|
vault?: string;
|
|
6
7
|
field?: string;
|
|
@@ -8,6 +9,7 @@ export interface RunOptions {
|
|
|
8
9
|
envFile?: string;
|
|
9
10
|
color?: boolean;
|
|
10
11
|
verbose?: boolean;
|
|
12
|
+
parallel?: number;
|
|
11
13
|
}
|
|
12
14
|
export interface ProcessLike {
|
|
13
15
|
env: NodeJS.ProcessEnv;
|
|
@@ -18,11 +20,10 @@ export interface ProcessLike {
|
|
|
18
20
|
export interface RunDependencies {
|
|
19
21
|
getSecret: typeof getSecret;
|
|
20
22
|
checkOpCli: typeof checkOpCli;
|
|
21
|
-
|
|
22
|
-
existsSync: typeof existsSync;
|
|
23
|
-
parseEnv: (content: string) => Record<string, string>;
|
|
23
|
+
loadEnvMappingFile: typeof loadEnvMappingFile;
|
|
24
24
|
spawn: typeof spawn;
|
|
25
25
|
process: ProcessLike;
|
|
26
|
+
loadConfig: () => OpsConfig;
|
|
26
27
|
}
|
|
27
28
|
export declare function createRunCommand(overrides?: Partial<RunDependencies>): (command: string[], options: RunOptions) => Promise<void>;
|
|
28
29
|
export declare const runCommand: (command: string[], options: RunOptions) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAc,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,SAAS,CAAC;CAC7B;AAmGD,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GACvC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAiG3D;AAED,eAAO,MAAM,UAAU,YAnGV,MAAM,EAAE,WAAW,UAAU,KAAK,OAAO,CAAC,IAAI,CAmGf,CAAC"}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from 'fs';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
2
|
import spawn from 'cross-spawn';
|
|
4
|
-
import dotenv from 'dotenv';
|
|
5
3
|
import { checkOpCli, getSecret } from '../utils/op.js';
|
|
6
4
|
import { applyColorConfig, resolveBooleanOption, resolveField, resolveVault, } from '../utils/cli.js';
|
|
7
5
|
import { OpError } from '../utils/types.js';
|
|
6
|
+
import { loadEnvMappingFile } from '../utils/env-mapping.js';
|
|
7
|
+
import { loadConfig } from '../utils/config.js';
|
|
8
8
|
const DEFAULT_ENV_FILE = '.env.ops';
|
|
9
|
+
const DEFAULT_PARALLELISM = 5;
|
|
9
10
|
function parseEnvPairs(pairs) {
|
|
10
11
|
if (!pairs || pairs.length === 0)
|
|
11
12
|
return {};
|
|
@@ -24,27 +25,46 @@ function parseEnvPairs(pairs) {
|
|
|
24
25
|
}
|
|
25
26
|
return mapping;
|
|
26
27
|
}
|
|
27
|
-
function
|
|
28
|
-
if (
|
|
29
|
-
return
|
|
28
|
+
function resolveParallelism(optionValue, config) {
|
|
29
|
+
if (typeof optionValue === 'number' && optionValue > 0)
|
|
30
|
+
return optionValue;
|
|
31
|
+
const envValue = process.env.OPS_PARALLEL;
|
|
32
|
+
if (envValue) {
|
|
33
|
+
const parsed = Number.parseInt(envValue, 10);
|
|
34
|
+
if (!Number.isNaN(parsed) && parsed > 0)
|
|
35
|
+
return parsed;
|
|
30
36
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return deps.parseEnv(content);
|
|
37
|
+
if (typeof config.parallel === 'number' && config.parallel > 0) {
|
|
38
|
+
return config.parallel;
|
|
34
39
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
return DEFAULT_PARALLELISM;
|
|
41
|
+
}
|
|
42
|
+
async function resolveSecrets(mapping, vault, field, parallelism, deps) {
|
|
43
|
+
const entries = Object.entries(mapping);
|
|
44
|
+
const results = [];
|
|
45
|
+
const chunks = [];
|
|
46
|
+
for (let i = 0; i < entries.length; i += parallelism) {
|
|
47
|
+
chunks.push(entries.slice(i, i + parallelism));
|
|
38
48
|
}
|
|
49
|
+
for (const chunk of chunks) {
|
|
50
|
+
const chunkResults = await Promise.all(chunk.map(async ([key, reference]) => {
|
|
51
|
+
const secret = await Promise.resolve(deps.getSecret(reference, vault, field));
|
|
52
|
+
if (secret === null) {
|
|
53
|
+
throw new OpError(`Secret "${reference}" not found in vault "${vault}"`, 1);
|
|
54
|
+
}
|
|
55
|
+
return [key, secret];
|
|
56
|
+
}));
|
|
57
|
+
results.push(...chunkResults);
|
|
58
|
+
}
|
|
59
|
+
return results;
|
|
39
60
|
}
|
|
40
61
|
const defaultDependencies = {
|
|
41
62
|
getSecret,
|
|
42
63
|
checkOpCli,
|
|
43
|
-
|
|
44
|
-
existsSync,
|
|
45
|
-
parseEnv: (content) => dotenv.parse(content),
|
|
64
|
+
loadEnvMappingFile,
|
|
46
65
|
spawn,
|
|
47
66
|
process,
|
|
67
|
+
loadConfig,
|
|
48
68
|
};
|
|
49
69
|
export function createRunCommand(overrides = {}) {
|
|
50
70
|
const deps = { ...defaultDependencies, ...overrides };
|
|
@@ -57,22 +77,18 @@ export function createRunCommand(overrides = {}) {
|
|
|
57
77
|
if (!command || command.length === 0) {
|
|
58
78
|
throw new OpError('Command required. Usage: ops run -- <command>', 2);
|
|
59
79
|
}
|
|
80
|
+
const config = deps.loadConfig();
|
|
60
81
|
const vault = resolveVault(options.vault);
|
|
61
82
|
const field = resolveField(options.field);
|
|
62
|
-
const
|
|
63
|
-
const
|
|
83
|
+
const parallelism = resolveParallelism(options.parallel, config);
|
|
84
|
+
const envFile = options.envFile || config.envFile || DEFAULT_ENV_FILE;
|
|
85
|
+
const fileMapping = deps.loadEnvMappingFile(envFile);
|
|
64
86
|
const flagMapping = parseEnvPairs(options.env);
|
|
65
87
|
const mapping = { ...fileMapping, ...flagMapping };
|
|
66
88
|
if (Object.keys(mapping).length === 0) {
|
|
67
89
|
throw new OpError(`No secrets configured. Add entries to ${envFile} or pass --env KEY=SECRET.`, 2);
|
|
68
90
|
}
|
|
69
|
-
const resolvedEntries = await
|
|
70
|
-
const secret = await Promise.resolve(deps.getSecret(reference, vault, field));
|
|
71
|
-
if (secret === null) {
|
|
72
|
-
throw new OpError(`Secret "${reference}" not found in vault "${vault}"`, 1);
|
|
73
|
-
}
|
|
74
|
-
return [key, secret];
|
|
75
|
-
}));
|
|
91
|
+
const resolvedEntries = await resolveSecrets(mapping, vault, field, parallelism, deps);
|
|
76
92
|
if (options.verbose) {
|
|
77
93
|
console.log(chalk.cyan('[ops] Injecting environment variables:'));
|
|
78
94
|
for (const [key] of resolvedEntries) {
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ import { completionCommand } from './commands/completion.js';
|
|
|
15
15
|
import { getManyCommand } from './commands/get-many.js';
|
|
16
16
|
import { setRetryOptions } from './utils/op.js';
|
|
17
17
|
import { isRetryDisabled } from './utils/retry.js';
|
|
18
|
+
import { loadSessionCacheIntoEnv, persistSessionCacheFromEnv } from './utils/session-cache.js';
|
|
19
|
+
import { interactiveCommand } from './commands/interactive.js';
|
|
18
20
|
// Dynamic version from package.json
|
|
19
21
|
const require = createRequire(import.meta.url);
|
|
20
22
|
const pkg = require('../package.json');
|
|
@@ -29,6 +31,7 @@ program
|
|
|
29
31
|
.option('--retry <count>', 'max retry attempts for transient failures (default: 3, env: OPS_RETRY_COUNT)')
|
|
30
32
|
.option('--no-retry', 'disable retry logic (env: OPS_NO_RETRY=1)')
|
|
31
33
|
.hook('preAction', (thisCommand) => {
|
|
34
|
+
loadSessionCacheIntoEnv();
|
|
32
35
|
const opts = thisCommand.opts();
|
|
33
36
|
// Configure retry options based on CLI flags
|
|
34
37
|
if (opts.retry === false || isRetryDisabled()) {
|
|
@@ -43,6 +46,9 @@ program
|
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
// Otherwise use defaults from environment or built-in defaults
|
|
49
|
+
})
|
|
50
|
+
.hook('postAction', () => {
|
|
51
|
+
persistSessionCacheFromEnv();
|
|
46
52
|
})
|
|
47
53
|
.action(() => {
|
|
48
54
|
// Show help when no command is provided (exit 0, not 1)
|
|
@@ -104,6 +110,7 @@ program
|
|
|
104
110
|
.option('-f, --field <field>', 'field name (default: OPS_FIELD or password)')
|
|
105
111
|
.option('-e, --env <pair>', 'map env var to secret name (repeatable, e.g. --env API_KEY=MY_SECRET)', (value, previous = []) => [...previous, value], [])
|
|
106
112
|
.option('--env-file <file>', 'env mapping file (default: .env.ops)')
|
|
113
|
+
.option('--parallel <count>', 'max concurrent secret lookups (default: 5)', (v) => parseInt(v, 10))
|
|
107
114
|
.option('--verbose', 'show which secrets are being injected')
|
|
108
115
|
.option('--no-color', 'disable color output')
|
|
109
116
|
.action(runCommand);
|
|
@@ -187,6 +194,14 @@ program
|
|
|
187
194
|
.option('-q, --quiet', 'suppress non-essential output')
|
|
188
195
|
.option('--no-color', 'disable color output')
|
|
189
196
|
.action(resolveCommand);
|
|
197
|
+
program
|
|
198
|
+
.command('interactive')
|
|
199
|
+
.alias('i')
|
|
200
|
+
.description('Browse vaults and items interactively')
|
|
201
|
+
.option('-v, --vault <vault>', 'vault name (default: OPS_VAULT or Private)')
|
|
202
|
+
.option('-f, --field <field>', 'field name (default: OPS_FIELD or password)')
|
|
203
|
+
.option('--no-color', 'disable color output')
|
|
204
|
+
.action(interactiveCommand);
|
|
190
205
|
program
|
|
191
206
|
.command('completion [shell]')
|
|
192
207
|
.description('Generate shell completion script (bash, zsh, fish)')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAKT;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAM5D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,qBAmBzD"}
|
package/dist/utils/cli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
3
|
import { OpError } from './types.js';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
4
5
|
const TRUE_VALUES = new Set(['1', 'true', 'yes', 'on']);
|
|
5
6
|
export function resolveBooleanOption(value, envVar) {
|
|
6
7
|
if (value !== undefined)
|
|
@@ -11,10 +12,12 @@ export function resolveBooleanOption(value, envVar) {
|
|
|
11
12
|
return TRUE_VALUES.has(envValue.toLowerCase());
|
|
12
13
|
}
|
|
13
14
|
export function resolveVault(value) {
|
|
14
|
-
|
|
15
|
+
const config = loadConfig();
|
|
16
|
+
return value || process.env.OPS_VAULT || config.vault || 'Private';
|
|
15
17
|
}
|
|
16
18
|
export function resolveField(value) {
|
|
17
|
-
|
|
19
|
+
const config = loadConfig();
|
|
20
|
+
return value || process.env.OPS_FIELD || config.field || 'password';
|
|
18
21
|
}
|
|
19
22
|
export function resolveFormat(value) {
|
|
20
23
|
const format = (value || process.env.OPS_FORMAT || 'env').toLowerCase();
|
package/dist/utils/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAClC,KAA0B,EAC1B,MAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,OAAO,CAAC,mBAAmB,MAAM,yBAAyB,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAc;IACxD,qEAAqE;IACrE,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnC,OAAO;YACL,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;YACjB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,IAAI,EAAE,EAAE;SACiB,CAAC;IAC9B,CAAC;IAED,6EAA6E;IAC7E,OAAO,GAAG,CAAC;QACT,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
export interface OpsConfig {
|
|
5
|
+
vault?: string;
|
|
6
|
+
field?: string;
|
|
7
|
+
envFile?: string;
|
|
8
|
+
parallel?: number;
|
|
9
|
+
sessionCache?: {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
path?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
interface ConfigDependencies {
|
|
15
|
+
existsSync: typeof existsSync;
|
|
16
|
+
readFileSync: typeof readFileSync;
|
|
17
|
+
homedir: typeof homedir;
|
|
18
|
+
cwd: () => string;
|
|
19
|
+
parseYaml: typeof parseYaml;
|
|
20
|
+
}
|
|
21
|
+
export declare function loadConfig(overrides?: Partial<ConfigDependencies>): OpsConfig;
|
|
22
|
+
export declare function clearConfigCache(): void;
|
|
23
|
+
export declare function createConfigLoader(overrides?: Partial<ConfigDependencies>): () => OpsConfig;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,UAAU,kBAAkB;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,SAAS,CAAC;CAC7B;AA8GD,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAAG,SAAS,CAEjF;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,MAAM,SAAS,CAGjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
5
|
+
import { OpError } from './types.js';
|
|
6
|
+
const defaultDeps = {
|
|
7
|
+
existsSync,
|
|
8
|
+
readFileSync,
|
|
9
|
+
homedir,
|
|
10
|
+
cwd: () => process.cwd(),
|
|
11
|
+
parseYaml,
|
|
12
|
+
};
|
|
13
|
+
const defaultCache = {};
|
|
14
|
+
function mergeConfig(base, override) {
|
|
15
|
+
return {
|
|
16
|
+
...base,
|
|
17
|
+
...override,
|
|
18
|
+
sessionCache: {
|
|
19
|
+
...base.sessionCache,
|
|
20
|
+
...override.sessionCache,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function parseConfigContent(content, path, deps) {
|
|
25
|
+
let parsed;
|
|
26
|
+
const lowerPath = path.toLowerCase();
|
|
27
|
+
if (lowerPath.endsWith('.json')) {
|
|
28
|
+
parsed = JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
try {
|
|
32
|
+
parsed = JSON.parse(content);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
parsed = deps.parseYaml(content);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
39
|
+
throw new OpError(`Invalid config in "${path}": expected an object.`, 2);
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
function loadFirstConfig(paths, deps) {
|
|
44
|
+
for (const path of paths) {
|
|
45
|
+
if (!deps.existsSync(path))
|
|
46
|
+
continue;
|
|
47
|
+
const content = deps.readFileSync(path, 'utf-8');
|
|
48
|
+
try {
|
|
49
|
+
return parseConfigContent(content, path, deps);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const message = error instanceof Error ? error.message : 'Unable to parse config file.';
|
|
53
|
+
throw new OpError(message, 2);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
function loadConfigInternal(overrides, cache) {
|
|
59
|
+
if (cache.value)
|
|
60
|
+
return cache.value;
|
|
61
|
+
const deps = { ...defaultDeps, ...overrides };
|
|
62
|
+
const explicitPath = process.env.OPS_CONFIG;
|
|
63
|
+
if (explicitPath) {
|
|
64
|
+
if (!deps.existsSync(explicitPath)) {
|
|
65
|
+
throw new OpError(`Config file not found: ${explicitPath}`, 2);
|
|
66
|
+
}
|
|
67
|
+
const content = deps.readFileSync(explicitPath, 'utf-8');
|
|
68
|
+
const config = parseConfigContent(content, explicitPath, deps);
|
|
69
|
+
cache.value = config;
|
|
70
|
+
return config;
|
|
71
|
+
}
|
|
72
|
+
const homeDir = deps.homedir();
|
|
73
|
+
const cwd = deps.cwd();
|
|
74
|
+
const homePaths = [
|
|
75
|
+
join(homeDir, '.opsrc'),
|
|
76
|
+
join(homeDir, '.opsrc.json'),
|
|
77
|
+
join(homeDir, '.opsrc.yaml'),
|
|
78
|
+
join(homeDir, '.opsrc.yml'),
|
|
79
|
+
];
|
|
80
|
+
const localPaths = [
|
|
81
|
+
join(cwd, '.opsrc'),
|
|
82
|
+
join(cwd, '.opsrc.json'),
|
|
83
|
+
join(cwd, '.opsrc.yaml'),
|
|
84
|
+
join(cwd, '.opsrc.yml'),
|
|
85
|
+
];
|
|
86
|
+
const homeConfig = loadFirstConfig(homePaths, deps);
|
|
87
|
+
const localConfig = loadFirstConfig(localPaths, deps);
|
|
88
|
+
cache.value = mergeConfig(homeConfig, localConfig);
|
|
89
|
+
return cache.value;
|
|
90
|
+
}
|
|
91
|
+
export function loadConfig(overrides = {}) {
|
|
92
|
+
return loadConfigInternal(overrides, defaultCache);
|
|
93
|
+
}
|
|
94
|
+
export function clearConfigCache() {
|
|
95
|
+
defaultCache.value = undefined;
|
|
96
|
+
}
|
|
97
|
+
export function createConfigLoader(overrides = {}) {
|
|
98
|
+
const cache = {};
|
|
99
|
+
return () => loadConfigInternal(overrides, cache);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
interface EnvMappingDependencies {
|
|
3
|
+
existsSync: typeof existsSync;
|
|
4
|
+
readFileSync: typeof readFileSync;
|
|
5
|
+
parseEnv: (content: string) => Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function loadEnvMappingFile(path: string, overrides?: Partial<EnvMappingDependencies>): Record<string, string>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=env-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-mapping.d.ts","sourceRoot":"","sources":["../../src/utils/env-mapping.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAW9C,UAAU,sBAAsB;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AA6CD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
import Ajv from 'ajv';
|
|
3
|
+
import { OpError } from './types.js';
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
6
|
+
const envMappingSchema = {
|
|
7
|
+
type: 'object',
|
|
8
|
+
additionalProperties: { type: 'string' },
|
|
9
|
+
};
|
|
10
|
+
const validateMapping = ajv.compile(envMappingSchema);
|
|
11
|
+
const defaultDeps = {
|
|
12
|
+
existsSync,
|
|
13
|
+
readFileSync,
|
|
14
|
+
parseEnv: (content) => dotenv.parse(content),
|
|
15
|
+
};
|
|
16
|
+
function formatSchemaErrors() {
|
|
17
|
+
if (!validateMapping.errors || validateMapping.errors.length === 0) {
|
|
18
|
+
return 'Invalid env mapping file.';
|
|
19
|
+
}
|
|
20
|
+
const details = validateMapping.errors
|
|
21
|
+
.map((error) => {
|
|
22
|
+
const location = error.instancePath ? error.instancePath : 'root';
|
|
23
|
+
return `${location} ${error.message ?? 'is invalid'}`.trim();
|
|
24
|
+
})
|
|
25
|
+
.join(', ');
|
|
26
|
+
return `Invalid env mapping file: ${details}.`;
|
|
27
|
+
}
|
|
28
|
+
function assertValidEnvMapping(value) {
|
|
29
|
+
if (!validateMapping(value)) {
|
|
30
|
+
throw new OpError(formatSchemaErrors(), 2);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function parseEnvMappingContent(content, path, deps) {
|
|
34
|
+
if (path.toLowerCase().endsWith('.json')) {
|
|
35
|
+
const parsed = JSON.parse(content);
|
|
36
|
+
assertValidEnvMapping(parsed);
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
const parsed = deps.parseEnv(content);
|
|
40
|
+
assertValidEnvMapping(parsed);
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
export function loadEnvMappingFile(path, overrides = {}) {
|
|
44
|
+
const deps = { ...defaultDeps, ...overrides };
|
|
45
|
+
if (!deps.existsSync(path)) {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
const content = deps.readFileSync(path, 'utf-8');
|
|
49
|
+
try {
|
|
50
|
+
return parseEnvMappingContent(content, path, deps);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const message = error instanceof Error ? error.message : 'Unable to parse env mapping file.';
|
|
54
|
+
throw new OpError(`Failed to parse "${path}": ${message}`, 2);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=env-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-mapping.js","sourceRoot":"","sources":["../../src/utils/env-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { OpsConfig } from './config.js';
|
|
5
|
+
interface SessionCacheDependencies {
|
|
6
|
+
existsSync: typeof existsSync;
|
|
7
|
+
readFileSync: typeof readFileSync;
|
|
8
|
+
writeFileSync: typeof writeFileSync;
|
|
9
|
+
mkdirSync: typeof mkdirSync;
|
|
10
|
+
homedir: typeof homedir;
|
|
11
|
+
join: typeof join;
|
|
12
|
+
dirname: typeof dirname;
|
|
13
|
+
env: NodeJS.ProcessEnv;
|
|
14
|
+
now: () => string;
|
|
15
|
+
getConfig: () => OpsConfig;
|
|
16
|
+
}
|
|
17
|
+
export declare function createSessionCache(overrides?: Partial<SessionCacheDependencies>): {
|
|
18
|
+
loadSessionCacheIntoEnv: () => void;
|
|
19
|
+
persistSessionCacheFromEnv: () => void;
|
|
20
|
+
};
|
|
21
|
+
export declare function loadSessionCacheIntoEnv(): void;
|
|
22
|
+
export declare function persistSessionCacheFromEnv(): void;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=session-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-cache.d.ts","sourceRoot":"","sources":["../../src/utils/session-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAc,SAAS,EAAE,MAAM,aAAa,CAAC;AAOpD,UAAU,wBAAwB;IAChC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,SAAS,CAAC;CAC5B;AAoDD,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD;IACD,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,0BAA0B,EAAE,MAAM,IAAI,CAAC;CACxC,CA0CA;AAID,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
const defaultDeps = {
|
|
6
|
+
existsSync,
|
|
7
|
+
readFileSync,
|
|
8
|
+
writeFileSync,
|
|
9
|
+
mkdirSync,
|
|
10
|
+
homedir,
|
|
11
|
+
join,
|
|
12
|
+
dirname,
|
|
13
|
+
env: process.env,
|
|
14
|
+
now: () => new Date().toISOString(),
|
|
15
|
+
getConfig: () => loadConfig(),
|
|
16
|
+
};
|
|
17
|
+
function isCacheEnabled(env, config) {
|
|
18
|
+
if (env.OPS_NO_SESSION_CACHE === '1')
|
|
19
|
+
return false;
|
|
20
|
+
if (env.OPS_SESSION_CACHE === '0')
|
|
21
|
+
return false;
|
|
22
|
+
if (env.OPS_SESSION_CACHE === '1')
|
|
23
|
+
return true;
|
|
24
|
+
if (config.sessionCache?.enabled !== undefined) {
|
|
25
|
+
return config.sessionCache.enabled;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
function getCachePath(config, deps) {
|
|
30
|
+
if (config.sessionCache?.path) {
|
|
31
|
+
return config.sessionCache.path;
|
|
32
|
+
}
|
|
33
|
+
return deps.join(deps.homedir(), '.config', 'ops-cli', 'session.json');
|
|
34
|
+
}
|
|
35
|
+
function readCacheFile(path, deps) {
|
|
36
|
+
if (!deps.existsSync(path))
|
|
37
|
+
return {};
|
|
38
|
+
const content = deps.readFileSync(path, 'utf-8');
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(content);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function collectSessions(env) {
|
|
47
|
+
const sessions = {};
|
|
48
|
+
for (const [key, value] of Object.entries(env)) {
|
|
49
|
+
if (!key.startsWith('OP_SESSION_'))
|
|
50
|
+
continue;
|
|
51
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
52
|
+
continue;
|
|
53
|
+
sessions[key] = value;
|
|
54
|
+
}
|
|
55
|
+
return sessions;
|
|
56
|
+
}
|
|
57
|
+
export function createSessionCache(overrides = {}) {
|
|
58
|
+
const deps = { ...defaultDeps, ...overrides };
|
|
59
|
+
function loadSessionCacheIntoEnv() {
|
|
60
|
+
const config = deps.getConfig();
|
|
61
|
+
if (!isCacheEnabled(deps.env, config))
|
|
62
|
+
return;
|
|
63
|
+
const path = getCachePath(config, deps);
|
|
64
|
+
const cache = readCacheFile(path, deps);
|
|
65
|
+
const sessions = cache.sessions ?? {};
|
|
66
|
+
for (const [key, value] of Object.entries(sessions)) {
|
|
67
|
+
if (deps.env[key])
|
|
68
|
+
continue;
|
|
69
|
+
deps.env[key] = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function persistSessionCacheFromEnv() {
|
|
73
|
+
const config = deps.getConfig();
|
|
74
|
+
if (!isCacheEnabled(deps.env, config))
|
|
75
|
+
return;
|
|
76
|
+
const path = getCachePath(config, deps);
|
|
77
|
+
const existing = readCacheFile(path, deps);
|
|
78
|
+
const merged = {
|
|
79
|
+
...existing.sessions,
|
|
80
|
+
...collectSessions(deps.env),
|
|
81
|
+
};
|
|
82
|
+
if (Object.keys(merged).length === 0) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const payload = {
|
|
86
|
+
sessions: merged,
|
|
87
|
+
updatedAt: deps.now(),
|
|
88
|
+
};
|
|
89
|
+
deps.mkdirSync(deps.dirname(path), { recursive: true, mode: 0o700 });
|
|
90
|
+
deps.writeFileSync(path, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
91
|
+
}
|
|
92
|
+
return { loadSessionCacheIntoEnv, persistSessionCacheFromEnv };
|
|
93
|
+
}
|
|
94
|
+
const defaultSessionCache = createSessionCache();
|
|
95
|
+
export function loadSessionCacheIntoEnv() {
|
|
96
|
+
defaultSessionCache.loadSessionCacheIntoEnv();
|
|
97
|
+
}
|
|
98
|
+
export function persistSessionCacheFromEnv() {
|
|
99
|
+
defaultSessionCache.persistSessionCacheFromEnv();
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=session-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-cache.js","sourceRoot":"","sources":["../../src/utils/session-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dc-ops-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Easy secret retrieval from 1Password with smart fallbacks",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -40,13 +40,16 @@
|
|
|
40
40
|
"author": "",
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"ajv": "^8.17.1",
|
|
43
44
|
"chalk": "^5.3.0",
|
|
44
45
|
"clipboardy": "^3.0.0",
|
|
45
46
|
"commander": "^11.1.0",
|
|
46
47
|
"cross-spawn": "^7.0.3",
|
|
47
48
|
"dotenv": "^16.4.5",
|
|
48
49
|
"inquirer": "^9.2.12",
|
|
49
|
-
"
|
|
50
|
+
"inquirer-autocomplete-prompt": "^3.0.1",
|
|
51
|
+
"ora": "^7.0.1",
|
|
52
|
+
"yaml": "^2.8.2"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|
|
52
55
|
"@semantic-release/changelog": "^6.0.3",
|