@dotenvx/dotenvx-vlt 0.49.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/CHANGELOG.md +652 -0
- package/LICENSE +71 -0
- package/README.md +11 -0
- package/package.json +77 -0
- package/src/cli/actions/armor/down.js +37 -0
- package/src/cli/actions/armor/move.js +42 -0
- package/src/cli/actions/armor/pull.js +37 -0
- package/src/cli/actions/armor/push.js +37 -0
- package/src/cli/actions/armor/rotate.js +25 -0
- package/src/cli/actions/armor/up.js +37 -0
- package/src/cli/actions/backup.js +93 -0
- package/src/cli/actions/gateway/start.js +17 -0
- package/src/cli/actions/get.js +34 -0
- package/src/cli/actions/keypair.js +59 -0
- package/src/cli/actions/login.js +110 -0
- package/src/cli/actions/logout.js +36 -0
- package/src/cli/actions/observe.js +36 -0
- package/src/cli/actions/open.js +37 -0
- package/src/cli/actions/rotate/github/connect.js +84 -0
- package/src/cli/actions/rotate/npm/connect.js +84 -0
- package/src/cli/actions/rotate/openai/connect.js +84 -0
- package/src/cli/actions/rotate.js +44 -0
- package/src/cli/actions/set.js +34 -0
- package/src/cli/actions/settings/device.js +24 -0
- package/src/cli/actions/settings/hostname.js +20 -0
- package/src/cli/actions/settings/off.js +17 -0
- package/src/cli/actions/settings/on.js +17 -0
- package/src/cli/actions/settings/path.js +21 -0
- package/src/cli/actions/settings/token.js +24 -0
- package/src/cli/actions/settings/username.js +22 -0
- package/src/cli/actions/status.js +13 -0
- package/src/cli/actions/sync.js +104 -0
- package/src/cli/commands/armor.js +73 -0
- package/src/cli/commands/gateway.js +16 -0
- package/src/cli/commands/rotate/github.js +26 -0
- package/src/cli/commands/rotate/npm.js +26 -0
- package/src/cli/commands/rotate/openai.js +26 -0
- package/src/cli/commands/rotate.js +32 -0
- package/src/cli/commands/settings.js +60 -0
- package/src/cli/dotenvx-ops.js +163 -0
- package/src/cli/postinstall.js +16 -0
- package/src/db/device.js +73 -0
- package/src/db/session.js +193 -0
- package/src/lib/api/getAccount.js +32 -0
- package/src/lib/api/getSynchronization.js +34 -0
- package/src/lib/api/getVersion.js +24 -0
- package/src/lib/api/postArmorDown.js +48 -0
- package/src/lib/api/postArmorMove.js +48 -0
- package/src/lib/api/postArmorPull.js +48 -0
- package/src/lib/api/postArmorPush.js +48 -0
- package/src/lib/api/postArmorUp.js +51 -0
- package/src/lib/api/postBackup.js +68 -0
- package/src/lib/api/postGet.js +37 -0
- package/src/lib/api/postKeypair.js +60 -0
- package/src/lib/api/postLogout.js +34 -0
- package/src/lib/api/postOauthDeviceCode.js +45 -0
- package/src/lib/api/postOauthToken.js +38 -0
- package/src/lib/api/postObserve.js +62 -0
- package/src/lib/api/postRotate.js +39 -0
- package/src/lib/api/postRotateConnect.js +54 -0
- package/src/lib/api/postSet.js +43 -0
- package/src/lib/api/postSync.js +68 -0
- package/src/lib/helpers/armoredKeyDisplay.js +10 -0
- package/src/lib/helpers/buildApiError.js +16 -0
- package/src/lib/helpers/buildOauthError.js +13 -0
- package/src/lib/helpers/canonicalEnvFilename.js +13 -0
- package/src/lib/helpers/clipboardy/fallbacks/linux/xsel +0 -0
- package/src/lib/helpers/clipboardy/fallbacks/windows/clipboard_i686.exe +0 -0
- package/src/lib/helpers/clipboardy/fallbacks/windows/clipboard_x86_64.exe +0 -0
- package/src/lib/helpers/clipboardy/linux.js +57 -0
- package/src/lib/helpers/clipboardy/macos.js +14 -0
- package/src/lib/helpers/clipboardy/termux.js +41 -0
- package/src/lib/helpers/clipboardy/windows.js +16 -0
- package/src/lib/helpers/clipboardy.js +51 -0
- package/src/lib/helpers/confirm.js +17 -0
- package/src/lib/helpers/createSpinner.js +101 -0
- package/src/lib/helpers/createSpinner2.js +24 -0
- package/src/lib/helpers/decryptValue.js +10 -0
- package/src/lib/helpers/dotenvxProjectId.js +36 -0
- package/src/lib/helpers/encryptValue.js +9 -0
- package/src/lib/helpers/errors.js +30 -0
- package/src/lib/helpers/formatCode.js +11 -0
- package/src/lib/helpers/gitBranch.js +13 -0
- package/src/lib/helpers/gitUrl.js +13 -0
- package/src/lib/helpers/http.js +17 -0
- package/src/lib/helpers/jsonToEnv.js +7 -0
- package/src/lib/helpers/keyNamesForEnvFile.js +43 -0
- package/src/lib/helpers/keypairMetadata.js +88 -0
- package/src/lib/helpers/likelyUpdateCommand.js +33 -0
- package/src/lib/helpers/localKeypair.js +12 -0
- package/src/lib/helpers/mask.js +12 -0
- package/src/lib/helpers/normalizePath.js +5 -0
- package/src/lib/helpers/normalizeToken.js +5 -0
- package/src/lib/helpers/openUrl.js +7 -0
- package/src/lib/helpers/packageJson.js +3 -0
- package/src/lib/helpers/playwrightConnect.js +29 -0
- package/src/lib/helpers/pluralize.js +10 -0
- package/src/lib/helpers/prompts.js +68 -0
- package/src/lib/helpers/removeEnvKey.js +50 -0
- package/src/lib/helpers/safeRealpath.js +13 -0
- package/src/lib/helpers/sha256File.js +9 -0
- package/src/lib/helpers/smartMask.js +11 -0
- package/src/lib/helpers/truncate.js +10 -0
- package/src/lib/helpers/upsertEnvKey.js +61 -0
- package/src/lib/main.d.ts +152 -0
- package/src/lib/main.js +114 -0
- package/src/lib/services/armorDown.js +77 -0
- package/src/lib/services/armorMove.js +54 -0
- package/src/lib/services/armorPull.js +77 -0
- package/src/lib/services/armorPush.js +82 -0
- package/src/lib/services/armorUp.js +79 -0
- package/src/lib/services/backup.js +105 -0
- package/src/lib/services/gatewayStart.js +132 -0
- package/src/lib/services/keypair.js +59 -0
- package/src/lib/services/loggedIn.js +24 -0
- package/src/lib/services/login.js +28 -0
- package/src/lib/services/loginPoll.js +43 -0
- package/src/lib/services/logout.js +28 -0
- package/src/lib/services/rotate.js +28 -0
- package/src/lib/services/rotateGithubConnect.js +56 -0
- package/src/lib/services/rotateNpmConnect.js +56 -0
- package/src/lib/services/rotateOpenaiConnect.js +60 -0
- package/src/lib/services/status.js +11 -0
- package/src/lib/services/sync.js +70 -0
- package/src/lib/services/syncConflict.js +36 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
|
|
4
|
+
const Login = require('./../../lib/services/login')
|
|
5
|
+
const LoginPoll = require('./../../lib/services/loginPoll')
|
|
6
|
+
|
|
7
|
+
const clipboardy = require('./../../lib/helpers/clipboardy')
|
|
8
|
+
const createSpinner2 = require('../../lib/helpers/createSpinner2')
|
|
9
|
+
const formatCode = require('./../../lib/helpers/formatCode')
|
|
10
|
+
const openUrl = require('./../../lib/helpers/openUrl')
|
|
11
|
+
|
|
12
|
+
const FRAMES = ['◐', '◓', '◑', '◒']
|
|
13
|
+
|
|
14
|
+
function listenForOpenKey (onOpen) {
|
|
15
|
+
const stdin = process.stdin
|
|
16
|
+
if (!stdin.isTTY) return () => {}
|
|
17
|
+
|
|
18
|
+
const canSetRawMode = typeof stdin.setRawMode === 'function'
|
|
19
|
+
const wasRawMode = Boolean(stdin.isRaw)
|
|
20
|
+
let didHandleOpenChoice = false
|
|
21
|
+
|
|
22
|
+
const cleanup = () => {
|
|
23
|
+
stdin.off('data', onData)
|
|
24
|
+
if (canSetRawMode) stdin.setRawMode(wasRawMode)
|
|
25
|
+
stdin.pause()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const onData = (chunk) => {
|
|
29
|
+
const key = String(chunk)
|
|
30
|
+
const lower = key.toLowerCase()
|
|
31
|
+
|
|
32
|
+
if (key === '\u0003') { // Ctrl+C
|
|
33
|
+
cleanup()
|
|
34
|
+
process.kill(process.pid, 'SIGINT')
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (key === '\r' || key === '\n' || lower === 'y') {
|
|
39
|
+
if (!didHandleOpenChoice) {
|
|
40
|
+
didHandleOpenChoice = true
|
|
41
|
+
Promise.resolve(onOpen()).catch(() => {})
|
|
42
|
+
}
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (lower === 'n') {
|
|
47
|
+
cleanup()
|
|
48
|
+
process.kill(process.pid, 'SIGINT')
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (canSetRawMode) stdin.setRawMode(true)
|
|
53
|
+
stdin.resume()
|
|
54
|
+
stdin.on('data', onData)
|
|
55
|
+
|
|
56
|
+
return cleanup
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function login () {
|
|
60
|
+
const options = this.opts()
|
|
61
|
+
const spinner = await createSpinner2({ ...options, text: 'logging in', frames: FRAMES })
|
|
62
|
+
|
|
63
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
64
|
+
|
|
65
|
+
const sesh = new Session()
|
|
66
|
+
await sesh.notifyUpdate()
|
|
67
|
+
const hostname = options.hostname || sesh.hostname()
|
|
68
|
+
let cleanupOpenKeyListener = () => {}
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const {
|
|
72
|
+
deviceCode,
|
|
73
|
+
userCode,
|
|
74
|
+
verificationUri,
|
|
75
|
+
verificationUriComplete,
|
|
76
|
+
interval
|
|
77
|
+
} = await new Login(hostname).run()
|
|
78
|
+
|
|
79
|
+
try { await clipboardy.write(userCode) } catch (_e) {}
|
|
80
|
+
|
|
81
|
+
const promptMessage = `◌ press Enter to open [${verificationUri}] and enter code [${formatCode(userCode)}]...`
|
|
82
|
+
|
|
83
|
+
logger.debug(`POST ${hostname} with deviceCode ${deviceCode} at interval ${interval}`)
|
|
84
|
+
logger.info(promptMessage)
|
|
85
|
+
|
|
86
|
+
// begin polling
|
|
87
|
+
const pollPromise = new LoginPoll(hostname, deviceCode, interval).run()
|
|
88
|
+
cleanupOpenKeyListener = listenForOpenKey(() => openUrl(verificationUriComplete))
|
|
89
|
+
const data = await pollPromise
|
|
90
|
+
|
|
91
|
+
cleanupOpenKeyListener()
|
|
92
|
+
if (spinner) spinner.stop()
|
|
93
|
+
logger.success(`◉ logged in (${data.username})`)
|
|
94
|
+
process.exit(0)
|
|
95
|
+
} catch (error) {
|
|
96
|
+
cleanupOpenKeyListener()
|
|
97
|
+
if (spinner) spinner.stop()
|
|
98
|
+
if (error.message) {
|
|
99
|
+
logger.error(error.message)
|
|
100
|
+
} else {
|
|
101
|
+
logger.error(error)
|
|
102
|
+
}
|
|
103
|
+
if (error.stack) {
|
|
104
|
+
logger.debug(error.stack)
|
|
105
|
+
}
|
|
106
|
+
process.exit(1)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = login
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
|
|
4
|
+
const createSpinner2 = require('../../lib/helpers/createSpinner2')
|
|
5
|
+
const Logout = require('./../../lib/services/logout')
|
|
6
|
+
|
|
7
|
+
const FRAMES = ['◐', '◓', '◑', '◒']
|
|
8
|
+
|
|
9
|
+
async function logout () {
|
|
10
|
+
const options = this.opts()
|
|
11
|
+
const spinner = await createSpinner2({ ...options, text: 'logging out', frames: FRAMES })
|
|
12
|
+
|
|
13
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
14
|
+
|
|
15
|
+
const sesh = new Session()
|
|
16
|
+
const hostname = options.hostname || sesh.hostname()
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const data = await new Logout(hostname).run()
|
|
20
|
+
spinner.stop()
|
|
21
|
+
logger.success(`◌ logged out (${data.username})`)
|
|
22
|
+
} catch (error) {
|
|
23
|
+
spinner.stop()
|
|
24
|
+
if (error.message) {
|
|
25
|
+
logger.error(error.message)
|
|
26
|
+
} else {
|
|
27
|
+
logger.error(error)
|
|
28
|
+
}
|
|
29
|
+
if (error.stack) {
|
|
30
|
+
logger.debug(error.stack)
|
|
31
|
+
}
|
|
32
|
+
process.exit(1)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = logout
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
|
|
4
|
+
const main = require('./../../lib/main')
|
|
5
|
+
|
|
6
|
+
async function observe (base64) {
|
|
7
|
+
const commandArgs = this.args
|
|
8
|
+
logger.debug(`process command [${commandArgs.join(' ')}]`)
|
|
9
|
+
|
|
10
|
+
const options = this.opts()
|
|
11
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
12
|
+
|
|
13
|
+
const sesh = new Session()
|
|
14
|
+
const hostname = options.hostname || sesh.hostname()
|
|
15
|
+
const token = options.token
|
|
16
|
+
const dotenvxProjectId = options.dotenvxProjectId
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
await main.observe(base64, { hostname, token, dotenvxProjectId })
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (error.message) {
|
|
22
|
+
logger.error(error.message)
|
|
23
|
+
} else {
|
|
24
|
+
logger.error(error)
|
|
25
|
+
}
|
|
26
|
+
if (error.help) {
|
|
27
|
+
logger.help(error.help)
|
|
28
|
+
}
|
|
29
|
+
if (error.stack) {
|
|
30
|
+
logger.debug(error.stack)
|
|
31
|
+
}
|
|
32
|
+
// do not process exit 1 since that would exit dotenvx run --
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = observe
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
|
|
4
|
+
const dotenvxProjectId = require('./../../lib/helpers/dotenvxProjectId')
|
|
5
|
+
const openUrl = require('./../../lib/helpers/openUrl')
|
|
6
|
+
|
|
7
|
+
async function open () {
|
|
8
|
+
// debug opts
|
|
9
|
+
const options = this.opts()
|
|
10
|
+
const sesh = new Session()
|
|
11
|
+
const hostname = options.hostname || sesh.hostname()
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
const uid = dotenvxProjectId(this.cwd)
|
|
15
|
+
const url = `${hostname}/go/${uid}`
|
|
16
|
+
|
|
17
|
+
await openUrl(url)
|
|
18
|
+
|
|
19
|
+
logger.success(`✔ opened [${url}]`)
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (error.message) {
|
|
22
|
+
logger.error(error.message)
|
|
23
|
+
} else {
|
|
24
|
+
logger.error(error)
|
|
25
|
+
}
|
|
26
|
+
if (error.help) {
|
|
27
|
+
logger.help(error.help)
|
|
28
|
+
}
|
|
29
|
+
if (error.stack) {
|
|
30
|
+
logger.debug(error.stack)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
process.exit(1)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = open
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const prompts = require('../../../../lib/helpers/prompts')
|
|
3
|
+
const Session = require('./../../../../db/session')
|
|
4
|
+
const RotateGithubConnect = require('./../../../../lib/services/rotateGithubConnect')
|
|
5
|
+
const { createSpinner } = require('./../../../../lib/helpers/createSpinner')
|
|
6
|
+
const GetAccount = require('./../../../../lib/api/getAccount')
|
|
7
|
+
|
|
8
|
+
const spinner = createSpinner('waiting on browser completion')
|
|
9
|
+
|
|
10
|
+
async function connect () {
|
|
11
|
+
const options = this.opts()
|
|
12
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const sesh = new Session()
|
|
16
|
+
const hostname = options.hostname || sesh.hostname()
|
|
17
|
+
const token = options.token || sesh.token()
|
|
18
|
+
let org = options.org
|
|
19
|
+
let username = options.username
|
|
20
|
+
let password = options.password
|
|
21
|
+
const email = options.email
|
|
22
|
+
|
|
23
|
+
// user must be logged in to use feature
|
|
24
|
+
const accountJson = await new GetAccount(hostname, token).run()
|
|
25
|
+
|
|
26
|
+
if (!org) {
|
|
27
|
+
const choices = accountJson.organizations.map(o => ({
|
|
28
|
+
name: o.provider_slug,
|
|
29
|
+
value: o.provider_slug
|
|
30
|
+
}))
|
|
31
|
+
|
|
32
|
+
if (choices.length === 1) {
|
|
33
|
+
org = choices[0].value // just use first choice
|
|
34
|
+
} else {
|
|
35
|
+
org = await prompts.select({
|
|
36
|
+
message: 'Select org',
|
|
37
|
+
choices
|
|
38
|
+
}, {
|
|
39
|
+
input: process.stdin,
|
|
40
|
+
output: process.stderr
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!username) {
|
|
46
|
+
username = await prompts.input({ message: 'github username:' }, {
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stderr
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!password) {
|
|
53
|
+
password = await prompts.password({ message: 'github password:' }, {
|
|
54
|
+
input: process.stdin,
|
|
55
|
+
output: process.stderr
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
spinner.start()
|
|
60
|
+
|
|
61
|
+
const { uid, url } = await new RotateGithubConnect(hostname, token, org, username, password, email).run()
|
|
62
|
+
|
|
63
|
+
spinner.stop()
|
|
64
|
+
|
|
65
|
+
logger.success(`✔ connected [${url}]`)
|
|
66
|
+
logger.help(`⮕ next run [dotenvx-ops rotate dotenvx://${uid}]`)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
spinner.stop()
|
|
69
|
+
if (error.message) {
|
|
70
|
+
logger.error(error.message)
|
|
71
|
+
} else {
|
|
72
|
+
logger.error(error)
|
|
73
|
+
}
|
|
74
|
+
if (error.help) {
|
|
75
|
+
logger.help(error.help)
|
|
76
|
+
}
|
|
77
|
+
if (error.stack) {
|
|
78
|
+
logger.debug(error.stack)
|
|
79
|
+
}
|
|
80
|
+
process.exit(1)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = connect
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const prompts = require('../../../../lib/helpers/prompts')
|
|
3
|
+
const Session = require('./../../../../db/session')
|
|
4
|
+
const RotateNpmConnect = require('./../../../../lib/services/rotateNpmConnect')
|
|
5
|
+
const { createSpinner } = require('./../../../../lib/helpers/createSpinner')
|
|
6
|
+
const GetAccount = require('./../../../../lib/api/getAccount')
|
|
7
|
+
|
|
8
|
+
const spinner = createSpinner('waiting on browser completion')
|
|
9
|
+
|
|
10
|
+
async function connect () {
|
|
11
|
+
const options = this.opts()
|
|
12
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const sesh = new Session()
|
|
16
|
+
const hostname = options.hostname || sesh.hostname()
|
|
17
|
+
const token = options.token || sesh.token()
|
|
18
|
+
let org = options.org
|
|
19
|
+
let username = options.username
|
|
20
|
+
let password = options.password
|
|
21
|
+
const email = options.email
|
|
22
|
+
|
|
23
|
+
// user must be logged in to use feature
|
|
24
|
+
const accountJson = await new GetAccount(hostname, token).run()
|
|
25
|
+
|
|
26
|
+
if (!org) {
|
|
27
|
+
const choices = accountJson.organizations.map(o => ({
|
|
28
|
+
name: o.provider_slug,
|
|
29
|
+
value: o.provider_slug
|
|
30
|
+
}))
|
|
31
|
+
|
|
32
|
+
if (choices.length === 1) {
|
|
33
|
+
org = choices[0].value // just use first choice
|
|
34
|
+
} else {
|
|
35
|
+
org = await prompts.select({
|
|
36
|
+
message: 'Select org',
|
|
37
|
+
choices
|
|
38
|
+
}, {
|
|
39
|
+
input: process.stdin,
|
|
40
|
+
output: process.stderr
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!username) {
|
|
46
|
+
username = await prompts.input({ message: 'npm username:' }, {
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stderr
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!password) {
|
|
53
|
+
password = await prompts.password({ message: 'npm password:' }, {
|
|
54
|
+
input: process.stdin,
|
|
55
|
+
output: process.stderr
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
spinner.start()
|
|
60
|
+
|
|
61
|
+
const { uid, url } = await new RotateNpmConnect(hostname, token, org, username, password, email).run()
|
|
62
|
+
|
|
63
|
+
spinner.stop()
|
|
64
|
+
|
|
65
|
+
logger.success(`✔ connected [${url}]`)
|
|
66
|
+
logger.help(`⮕ next run [dotenvx-ops rotate dotenvx://${uid}]`)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
spinner.stop()
|
|
69
|
+
if (error.message) {
|
|
70
|
+
logger.error(error.message)
|
|
71
|
+
} else {
|
|
72
|
+
logger.error(error)
|
|
73
|
+
}
|
|
74
|
+
if (error.help) {
|
|
75
|
+
logger.help(error.help)
|
|
76
|
+
}
|
|
77
|
+
if (error.stack) {
|
|
78
|
+
logger.debug(error.stack)
|
|
79
|
+
}
|
|
80
|
+
process.exit(1)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = connect
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const prompts = require('../../../../lib/helpers/prompts')
|
|
3
|
+
const Session = require('./../../../../db/session')
|
|
4
|
+
const RotateOpenaiConnect = require('./../../../../lib/services/rotateOpenaiConnect')
|
|
5
|
+
const { createSpinner } = require('./../../../../lib/helpers/createSpinner')
|
|
6
|
+
const GetAccount = require('./../../../../lib/api/getAccount')
|
|
7
|
+
|
|
8
|
+
const spinner = createSpinner('waiting on browser completion')
|
|
9
|
+
|
|
10
|
+
async function connect () {
|
|
11
|
+
const options = this.opts()
|
|
12
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const sesh = new Session()
|
|
16
|
+
const hostname = options.hostname || sesh.hostname()
|
|
17
|
+
const token = options.token || sesh.token()
|
|
18
|
+
let org = options.org
|
|
19
|
+
let username = options.username
|
|
20
|
+
let password = options.password
|
|
21
|
+
const email = options.email
|
|
22
|
+
|
|
23
|
+
// user must be logged in to use feature
|
|
24
|
+
const accountJson = await new GetAccount(hostname, token).run()
|
|
25
|
+
|
|
26
|
+
if (!org) {
|
|
27
|
+
const choices = accountJson.organizations.map(o => ({
|
|
28
|
+
name: o.provider_slug,
|
|
29
|
+
value: o.provider_slug
|
|
30
|
+
}))
|
|
31
|
+
|
|
32
|
+
if (choices.length === 1) {
|
|
33
|
+
org = choices[0].value // just use first choice
|
|
34
|
+
} else {
|
|
35
|
+
org = await prompts.select({
|
|
36
|
+
message: 'Select org',
|
|
37
|
+
choices
|
|
38
|
+
}, {
|
|
39
|
+
input: process.stdin,
|
|
40
|
+
output: process.stderr
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!username) {
|
|
46
|
+
username = await prompts.input({ message: 'openai username:' }, {
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stderr
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!password) {
|
|
53
|
+
password = await prompts.password({ message: 'openai password:' }, {
|
|
54
|
+
input: process.stdin,
|
|
55
|
+
output: process.stderr
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
spinner.start()
|
|
60
|
+
|
|
61
|
+
const { uid, url } = await new RotateOpenaiConnect(hostname, token, org, username, password, email).run()
|
|
62
|
+
|
|
63
|
+
spinner.stop()
|
|
64
|
+
|
|
65
|
+
logger.success(`✔ connected [${url}]`)
|
|
66
|
+
logger.help(`⮕ next run [dotenvx-ops rotate dotenvx://${uid}]`)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
spinner.stop()
|
|
69
|
+
if (error.message) {
|
|
70
|
+
logger.error(error.message)
|
|
71
|
+
} else {
|
|
72
|
+
logger.error(error)
|
|
73
|
+
}
|
|
74
|
+
if (error.help) {
|
|
75
|
+
logger.help(error.help)
|
|
76
|
+
}
|
|
77
|
+
if (error.stack) {
|
|
78
|
+
logger.debug(error.stack)
|
|
79
|
+
}
|
|
80
|
+
process.exit(1)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = connect
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
const Rotate = require('./../../lib/services/rotate')
|
|
4
|
+
const createSpinner2 = require('./../../lib/helpers/createSpinner2')
|
|
5
|
+
|
|
6
|
+
async function rotate (uri) {
|
|
7
|
+
const options = this.opts()
|
|
8
|
+
const spinner = await createSpinner2({ ...options, text: 'rotating' })
|
|
9
|
+
|
|
10
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
11
|
+
if (uri) {
|
|
12
|
+
logger.debug(`uri: ${uri}`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const sesh = new Session()
|
|
17
|
+
await sesh.notifyUpdate()
|
|
18
|
+
const hostname = options.hostname || sesh.hostname()
|
|
19
|
+
const token = options.token || sesh.token()
|
|
20
|
+
|
|
21
|
+
const { url, rotUid } = await new Rotate(hostname, token, uri).run()
|
|
22
|
+
|
|
23
|
+
if (spinner) spinner.stop()
|
|
24
|
+
|
|
25
|
+
logger.success(`⟳ rotated [${url}]`)
|
|
26
|
+
logger.help(`⮕ next run [dotenvx-ops get dotenvx://${rotUid}]`)
|
|
27
|
+
} catch (error) {
|
|
28
|
+
if (spinner) spinner.stop()
|
|
29
|
+
if (error.message) {
|
|
30
|
+
logger.error(error.message)
|
|
31
|
+
} else {
|
|
32
|
+
logger.error(error)
|
|
33
|
+
}
|
|
34
|
+
if (error.help) {
|
|
35
|
+
logger.help(error.help)
|
|
36
|
+
}
|
|
37
|
+
if (error.stack) {
|
|
38
|
+
logger.debug(error.stack)
|
|
39
|
+
}
|
|
40
|
+
process.exit(1)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
module.exports = rotate
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../db/session')
|
|
3
|
+
|
|
4
|
+
const main = require('./../../lib/main')
|
|
5
|
+
|
|
6
|
+
async function set (uri, value) {
|
|
7
|
+
// debug opts
|
|
8
|
+
const options = this.opts()
|
|
9
|
+
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
10
|
+
|
|
11
|
+
const sesh = new Session()
|
|
12
|
+
const hostname = options.hostname || sesh.hostname()
|
|
13
|
+
const token = options.token
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await main.set(uri, value, { hostname, token })
|
|
17
|
+
logger.success(`✔ set [${uri}]`)
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error.message) {
|
|
20
|
+
logger.error(error.message)
|
|
21
|
+
} else {
|
|
22
|
+
logger.error(error)
|
|
23
|
+
}
|
|
24
|
+
if (error.help) {
|
|
25
|
+
logger.help(error.help)
|
|
26
|
+
}
|
|
27
|
+
if (error.stack) {
|
|
28
|
+
logger.debug(error.stack)
|
|
29
|
+
}
|
|
30
|
+
process.exit(1)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = set
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
|
|
3
|
+
const Session = require('./../../../db/session')
|
|
4
|
+
const smartMask = require('./../../../lib/helpers/smartMask')
|
|
5
|
+
|
|
6
|
+
function device () {
|
|
7
|
+
const options = this.opts()
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
const sesh = new Session()
|
|
11
|
+
const devicePublicKey = sesh.devicePublicKey()
|
|
12
|
+
if (devicePublicKey && devicePublicKey.length > 1) {
|
|
13
|
+
console.log(smartMask(devicePublicKey, options.unmask, 6))
|
|
14
|
+
} else {
|
|
15
|
+
logger.error('missing device. Try generating one with [dotenvx-ops login].')
|
|
16
|
+
process.exit(1)
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
logger.error(error.message)
|
|
20
|
+
process.exit(1)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = device
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
const Session = require('./../../../db/session')
|
|
3
|
+
|
|
4
|
+
function hostname () {
|
|
5
|
+
try {
|
|
6
|
+
const sesh = new Session()
|
|
7
|
+
const _hostname = sesh.hostname()
|
|
8
|
+
if (_hostname && _hostname.length > 1) {
|
|
9
|
+
console.log(_hostname)
|
|
10
|
+
} else {
|
|
11
|
+
logger.error('missing hostname. Try running [dotenvx-ops login].')
|
|
12
|
+
process.exit(1)
|
|
13
|
+
}
|
|
14
|
+
} catch (error) {
|
|
15
|
+
logger.error(error.message)
|
|
16
|
+
process.exit(1)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = hostname
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
|
|
3
|
+
const Session = require('./../../../db/session')
|
|
4
|
+
|
|
5
|
+
function off () {
|
|
6
|
+
try {
|
|
7
|
+
const sesh = new Session()
|
|
8
|
+
sesh.turnOff()
|
|
9
|
+
logger.success('✔ ops: off')
|
|
10
|
+
logger.help('⮕ check status with [dotenvx-ops status]')
|
|
11
|
+
} catch (error) {
|
|
12
|
+
logger.error(error.message)
|
|
13
|
+
process.exit(1)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = off
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
|
|
3
|
+
const Session = require('./../../../db/session')
|
|
4
|
+
|
|
5
|
+
function on () {
|
|
6
|
+
try {
|
|
7
|
+
const sesh = new Session()
|
|
8
|
+
sesh.turnOn()
|
|
9
|
+
logger.success('✔ ops: on')
|
|
10
|
+
logger.help('⮕ check status with [dotenvx-ops status]')
|
|
11
|
+
} catch (error) {
|
|
12
|
+
logger.error(error.message)
|
|
13
|
+
process.exit(1)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = on
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
|
|
3
|
+
const Session = require('./../../../db/session')
|
|
4
|
+
|
|
5
|
+
function path () {
|
|
6
|
+
try {
|
|
7
|
+
const sesh = new Session()
|
|
8
|
+
const path = sesh.path()
|
|
9
|
+
if (path && path.length > 1) {
|
|
10
|
+
console.log(path)
|
|
11
|
+
} else {
|
|
12
|
+
logger.error('missing path. Try generating one with [dotenvx-ops login].')
|
|
13
|
+
process.exit(1)
|
|
14
|
+
}
|
|
15
|
+
} catch (error) {
|
|
16
|
+
logger.error(error.message)
|
|
17
|
+
process.exit(1)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = path
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const { logger } = require('@dotenvx/dotenvx')
|
|
2
|
+
|
|
3
|
+
const Session = require('./../../../db/session')
|
|
4
|
+
const smartMask = require('./../../../lib/helpers/smartMask')
|
|
5
|
+
|
|
6
|
+
function token () {
|
|
7
|
+
const options = this.opts()
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
const sesh = new Session()
|
|
11
|
+
const token = sesh.token()
|
|
12
|
+
if (token && token.length > 1) {
|
|
13
|
+
console.log(smartMask(token, options.unmask, 10))
|
|
14
|
+
} else {
|
|
15
|
+
logger.error('missing token. Try generating one with [dotenvx-ops login].')
|
|
16
|
+
process.exit(1)
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
logger.error(error.message)
|
|
20
|
+
process.exit(1)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = token
|