terse-cli 0.1.32 → 0.1.34
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/dist/cliUi.d.ts +4 -0
- package/dist/cliUi.d.ts.map +1 -0
- package/dist/cliUi.js +21 -0
- package/dist/cliUi.js.map +1 -0
- package/dist/commands/attach.d.ts.map +1 -1
- package/dist/commands/attach.js +41 -40
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +23 -29
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/generate.d.ts +5 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +57 -82
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +33 -40
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integrate.d.ts +7 -2
- package/dist/commands/integrate.d.ts.map +1 -1
- package/dist/commands/integrate.js +53 -56
- package/dist/commands/integrate.js.map +1 -1
- package/dist/jsonOutput.d.ts +19 -0
- package/dist/jsonOutput.d.ts.map +1 -0
- package/dist/jsonOutput.js +25 -0
- package/dist/jsonOutput.js.map +1 -0
- package/dist/providers/typescript/TypeScriptProvider.d.ts +1 -1
- package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.js +4 -20
- package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
- package/dist/replay.d.ts +3 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +20 -0
- package/dist/replay.js.map +1 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +12 -36
- package/dist/run.js.map +1 -1
- package/dist/shared/ToolDisplayUtils.js +1 -1
- package/dist/shared/ToolDisplayUtils.js.map +1 -1
- package/dist/urls.d.ts +3 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.js +27 -0
- package/dist/urls.js.map +1 -0
- package/package.json +3 -3
- package/templates/typescript/init/src/terse.jobs.ts.hbs +2 -4
- package/dist/commands/deployTheme.d.ts +0 -28
- package/dist/commands/deployTheme.d.ts.map +0 -1
- package/dist/commands/deployTheme.js +0 -68
- package/dist/commands/deployTheme.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -3
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -47
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -1
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -2
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/terseCliTheme.d.ts +0 -28
- package/dist/commands/terseCliTheme.d.ts.map +0 -1
- package/dist/commands/terseCliTheme.js +0 -68
- package/dist/commands/terseCliTheme.js.map +0 -1
- package/dist/perf.d.ts +0 -9
- package/dist/perf.d.ts.map +0 -1
- package/dist/perf.js +0 -59
- package/dist/perf.js.map +0 -1
- package/dist/providers/codegen.test.d.ts +0 -2
- package/dist/providers/codegen.test.d.ts.map +0 -1
- package/dist/providers/codegen.test.js +0 -45
- package/dist/providers/codegen.test.js.map +0 -1
- package/dist/providers/python/PythonProvider.test.d.ts +0 -2
- package/dist/providers/python/PythonProvider.test.d.ts.map +0 -1
- package/dist/providers/python/PythonProvider.test.js +0 -169
- package/dist/providers/python/PythonProvider.test.js.map +0 -1
- package/dist/providers/typescript/prepareCodegenData.test.d.ts +0 -2
- package/dist/providers/typescript/prepareCodegenData.test.d.ts.map +0 -1
- package/dist/providers/typescript/prepareCodegenData.test.js +0 -54
- package/dist/providers/typescript/prepareCodegenData.test.js.map +0 -1
package/dist/cliUi.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliUi.d.ts","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,2CAI5B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQvE"}
|
package/dist/cliUi.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { log, spinner } from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
export function createSpinner() {
|
|
4
|
+
return spinner({
|
|
5
|
+
styleFrame: frame => chalk.hex("#04AB62")(frame)
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function logNextSteps(steps) {
|
|
9
|
+
steps.forEach((step, index) => {
|
|
10
|
+
log.step(`${index + 1}. ${step}`);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function formatSummaryList(items, maxItems = 8) {
|
|
14
|
+
if (items.length <= maxItems) {
|
|
15
|
+
return items.join(", ");
|
|
16
|
+
}
|
|
17
|
+
const visible = items.slice(0, maxItems);
|
|
18
|
+
const remaining = items.length - maxItems;
|
|
19
|
+
return `${visible.join(", ")}, +${remaining} more`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cliUi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliUi.js","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,UAAU,aAAa;IACzB,OAAO,OAAO,CAAC;QACX,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;KACnD,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAe;IACxC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAe,EAAE,QAAQ,GAAG,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAA;IACzC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,SAAS,OAAO,CAAA;AACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAQxE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E1F"}
|
package/dist/commands/attach.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { intro, log, outro } from "@clack/prompts";
|
|
1
2
|
import chalk from "chalk";
|
|
2
3
|
import fs from "node:fs";
|
|
3
4
|
import path from "node:path";
|
|
4
|
-
import
|
|
5
|
+
import { createSpinner, logNextSteps } from "../cliUi.js";
|
|
5
6
|
import { PROJECT_CONFIG_FILENAME, createRemoteProject, readProjectConfig, writeProjectConfig } from "../projectConfig.js";
|
|
6
7
|
import { resolveProvider } from "../providers/resolveProvider.js";
|
|
7
8
|
import { setStoredApiKey } from "../userConfig.js";
|
|
@@ -9,74 +10,74 @@ import { getProjectAttachedUserName, login } from "./auth.js";
|
|
|
9
10
|
import { generate } from "./generate.js";
|
|
10
11
|
import { listAndPromptIntegrations } from "./integrate.js";
|
|
11
12
|
export async function attach(provider = resolveProvider()) {
|
|
13
|
+
intro("terse attach");
|
|
12
14
|
const cwd = process.cwd();
|
|
13
15
|
const projectName = path.basename(cwd);
|
|
14
16
|
const existingUserName = await getProjectAttachedUserName(cwd);
|
|
15
17
|
if (existingUserName) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
log.step(`Already set up for ${chalk.bold(existingUserName)}`);
|
|
19
|
+
log.info("This project already has a valid TERSE_API_KEY, so attach does not need to run again.");
|
|
20
|
+
logNextSteps([
|
|
21
|
+
`Run ${chalk.cyan("terse integrate")} to connect or review integrations`,
|
|
22
|
+
`Run ${chalk.cyan("terse generate")} to refresh generated helpers`,
|
|
23
|
+
`Run ${chalk.cyan("terse deploy")} when you're ready to sync jobs`
|
|
24
|
+
]);
|
|
25
|
+
outro("Done");
|
|
23
26
|
return;
|
|
24
27
|
}
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
log.info(`Attaching Terse to existing project ${chalk.bold(projectName)}`);
|
|
29
|
+
log.info("Self-hosted mode keeps your jobs on your own infrastructure via TERSE_REMOTE_SERVER_URL. No source code is uploaded to Terse.");
|
|
27
30
|
const result = await login();
|
|
28
31
|
if (result?.apiKey) {
|
|
29
|
-
// Save to user config so the CLI itself works without .env. The user still needs to
|
|
30
|
-
// paste the key into their app's environment for the SDK runtime on their server.
|
|
31
32
|
setStoredApiKey(result.apiKey);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
console.log("");
|
|
33
|
+
log.info(`Add ${chalk.cyan("TERSE_API_KEY")} to your server environment so your app can authenticate at runtime.`);
|
|
34
|
+
log.step(`TERSE_API_KEY=${result.apiKey}`);
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
37
|
-
|
|
37
|
+
log.info("You can run `terse login` later to authenticate.");
|
|
38
38
|
}
|
|
39
|
-
// Create the remote project and write terse.config.json (skip if the repo already has one, e.g. cloned from a teammate).
|
|
40
|
-
// attach mode defaults to self-hosted: the user's jobs run on their own infrastructure.
|
|
41
|
-
// We write the selfHosted flag plus an empty remoteServerUrl placeholder so the user knows where to fill it in.
|
|
42
39
|
if (result?.apiKey && !readProjectConfig(cwd)) {
|
|
43
|
-
const
|
|
40
|
+
const s = createSpinner();
|
|
41
|
+
s.start("Creating Terse project");
|
|
44
42
|
try {
|
|
45
43
|
const config = await createRemoteProject(result.apiKey, projectName);
|
|
46
44
|
const selfHostedConfig = { ...config, selfHosted: true, remoteServerUrl: "" };
|
|
47
45
|
writeProjectConfig(cwd, selfHostedConfig);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
s.stop(`Created Terse project (${config.projectId})`);
|
|
47
|
+
log.step(`Created ${PROJECT_CONFIG_FILENAME}`);
|
|
48
|
+
log.info(`Self-hosted mode enabled. Set ${chalk.cyan("remoteServerUrl")} in ${PROJECT_CONFIG_FILENAME} before running ${chalk.cyan("terse deploy")}.`);
|
|
51
49
|
}
|
|
52
50
|
catch (error) {
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
s.stop(`Failed to create Terse project: ${error.message}`);
|
|
52
|
+
log.warn(`You'll need to create a ${PROJECT_CONFIG_FILENAME} manually before running ${chalk.cyan("terse deploy")}.`);
|
|
55
53
|
}
|
|
56
54
|
}
|
|
57
|
-
|
|
55
|
+
log.info("Reviewing integrations");
|
|
56
|
+
await listAndPromptIntegrations({ showLifecycle: false });
|
|
58
57
|
if (canGenerateFromCurrentDirectory(provider, cwd)) {
|
|
59
|
-
const
|
|
58
|
+
const s = createSpinner();
|
|
59
|
+
s.start("Generating code");
|
|
60
60
|
try {
|
|
61
|
-
await generate(provider);
|
|
62
|
-
|
|
61
|
+
await generate(provider, { showLifecycle: false });
|
|
62
|
+
s.stop("Generated code");
|
|
63
63
|
}
|
|
64
64
|
catch {
|
|
65
|
-
|
|
65
|
+
s.stop(`Failed to generate code. Run ${chalk.cyan("terse generate")} manually.`);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
else {
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
log.warn(`Skipped code generation because this repo is missing ${provider.detectionMarkers.requiredFiles.join(", ")}.`);
|
|
70
|
+
log.info(`Add your job entrypoint at ${chalk.cyan(provider.entryFile)}, then run ${chalk.cyan("terse generate")} manually.`);
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
log.info("Next steps");
|
|
73
|
+
logNextSteps([
|
|
74
|
+
`Install ${chalk.cyan("terse-sdk")} in this repo if you haven't already`,
|
|
75
|
+
`Add your Terse job definitions to ${chalk.cyan(provider.entryFile)} and import that file from your app startup path`,
|
|
76
|
+
`Set ${chalk.cyan("remoteServerUrl")} in ${chalk.cyan(PROJECT_CONFIG_FILENAME)} before running ${chalk.cyan("terse deploy")}`,
|
|
77
|
+
`Run ${chalk.cyan("terse integrate")} to connect integrations`
|
|
78
|
+
]);
|
|
79
|
+
log.info(chalk.dim(`If your self-hosted app keeps jobs in another file, use ${chalk.cyan("--entry-file")} with terse test and terse deploy.`));
|
|
80
|
+
outro("Done");
|
|
80
81
|
}
|
|
81
82
|
function canGenerateFromCurrentDirectory(provider, cwd) {
|
|
82
83
|
return provider.detectionMarkers.requiredFiles.every(relativePath => fs.existsSync(path.join(cwd, relativePath)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AA8GA,wBAAsB,KAAK,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAuC5F;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAyBtG;AAED,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI/E;AAED,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAWD,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI1F"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { log } from "@clack/prompts";
|
|
1
2
|
import { confirm } from "@inquirer/prompts";
|
|
2
3
|
import chalk from "chalk";
|
|
3
|
-
import { exec } from "node:child_process";
|
|
4
|
-
import process from "node:process";
|
|
5
|
-
import ora from "ora";
|
|
6
4
|
import { fetchWithAuth, readApiKeyFromDir } from "../api.js";
|
|
5
|
+
import { createSpinner } from "../cliUi.js";
|
|
7
6
|
import { BACKEND_URL, WORKOS_CLIENT_ID } from "../config.js";
|
|
7
|
+
import { openUrlInBrowser } from "../openBrowser.js";
|
|
8
8
|
import { clearStoredApiKey, getAuthFilePath, getStoredApiKey, setStoredApiKey } from "../userConfig.js";
|
|
9
9
|
const DEVICE_AUTH_URL = "https://api.workos.com/user_management/authorize/device";
|
|
10
10
|
const TOKEN_URL = "https://api.workos.com/user_management/authenticate";
|
|
@@ -12,11 +12,6 @@ const DEVICE_CODE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:device_code";
|
|
|
12
12
|
function sleep(ms) {
|
|
13
13
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
14
14
|
}
|
|
15
|
-
function openInBrowser(url) {
|
|
16
|
-
const platform = process.platform;
|
|
17
|
-
const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
18
|
-
exec(`${cmd} "${url}"`);
|
|
19
|
-
}
|
|
20
15
|
async function requestDeviceCode() {
|
|
21
16
|
const res = await fetch(DEVICE_AUTH_URL, {
|
|
22
17
|
method: "POST",
|
|
@@ -76,67 +71,66 @@ async function exchangeForApiKey(accessToken) {
|
|
|
76
71
|
return res.json();
|
|
77
72
|
}
|
|
78
73
|
export async function login() {
|
|
79
|
-
const
|
|
74
|
+
const s = createSpinner();
|
|
75
|
+
s.start("Requesting login code");
|
|
80
76
|
let deviceData;
|
|
81
77
|
try {
|
|
82
78
|
deviceData = await requestDeviceCode();
|
|
83
|
-
|
|
79
|
+
s.stop("Login code ready");
|
|
84
80
|
}
|
|
85
81
|
catch (err) {
|
|
86
|
-
|
|
82
|
+
s.stop("Failed to start login flow");
|
|
87
83
|
console.error(chalk.red(` ${err.message}`));
|
|
88
84
|
return null;
|
|
89
85
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const pollSpinner = ora("Waiting for authentication in browser").start();
|
|
86
|
+
log.info(`Open ${chalk.cyan(deviceData.verification_uri_complete)} in your browser`);
|
|
87
|
+
log.info(`Or visit ${chalk.cyan(deviceData.verification_uri)} and enter code ${chalk.bold(deviceData.user_code)}`);
|
|
88
|
+
openUrlInBrowser(deviceData.verification_uri_complete);
|
|
89
|
+
s.start("Waiting for authentication in browser");
|
|
95
90
|
let tokenData;
|
|
96
91
|
try {
|
|
97
92
|
tokenData = await pollForTokens(deviceData.device_code, deviceData.expires_in, deviceData.interval);
|
|
98
|
-
|
|
93
|
+
s.message("Exchanging token");
|
|
99
94
|
}
|
|
100
95
|
catch (err) {
|
|
101
|
-
|
|
96
|
+
s.stop("Login failed");
|
|
102
97
|
console.error(chalk.red(` ${err.message}`));
|
|
103
98
|
return null;
|
|
104
99
|
}
|
|
105
|
-
let exchangeData;
|
|
106
100
|
try {
|
|
107
|
-
exchangeData = await exchangeForApiKey(tokenData.access_token);
|
|
108
|
-
|
|
101
|
+
const exchangeData = await exchangeForApiKey(tokenData.access_token);
|
|
102
|
+
s.stop(`Logged in as ${exchangeData.user.displayName || exchangeData.user.email}`);
|
|
103
|
+
return { apiKey: exchangeData.apiKey, displayName: exchangeData.user.displayName };
|
|
109
104
|
}
|
|
110
105
|
catch (err) {
|
|
111
|
-
|
|
106
|
+
s.stop("Failed to create API key");
|
|
112
107
|
console.error(chalk.red(` ${err.message}`));
|
|
113
108
|
return null;
|
|
114
109
|
}
|
|
115
|
-
return { apiKey: exchangeData.apiKey, displayName: exchangeData.user.displayName };
|
|
116
110
|
}
|
|
117
111
|
export async function loginAndPersist() {
|
|
118
112
|
const stored = getStoredApiKey();
|
|
119
113
|
if (stored) {
|
|
114
|
+
const s = createSpinner();
|
|
115
|
+
s.start("Checking existing API key");
|
|
120
116
|
const existingName = await fetchDisplayNameForKey(stored);
|
|
121
117
|
if (existingName) {
|
|
122
|
-
|
|
123
|
-
spinner.succeed(`Already logged in as ${chalk.bold(existingName)}`);
|
|
118
|
+
s.stop(`Already logged in as ${existingName}`);
|
|
124
119
|
const shouldContinue = await confirm({ message: "Log in again with a different account?", default: false });
|
|
125
120
|
if (!shouldContinue)
|
|
126
121
|
return { apiKey: stored, displayName: existingName };
|
|
127
122
|
}
|
|
128
123
|
else {
|
|
129
|
-
|
|
130
|
-
spinner.warn("Existing API key is invalid or expired");
|
|
124
|
+
s.stop("Existing API key is invalid or expired");
|
|
131
125
|
}
|
|
132
126
|
}
|
|
133
127
|
const result = await login();
|
|
134
128
|
if (!result?.apiKey) {
|
|
135
|
-
|
|
129
|
+
log.info("You can run `terse login` later to authenticate.");
|
|
136
130
|
return null;
|
|
137
131
|
}
|
|
138
132
|
setStoredApiKey(result.apiKey);
|
|
139
|
-
|
|
133
|
+
log.info(chalk.dim(`Saved credentials to ${getAuthFilePath()}`));
|
|
140
134
|
return result;
|
|
141
135
|
}
|
|
142
136
|
export async function getExistingAuthenticatedUserName() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { LanguageProvider } from "../providers/LanguageProvider.js";
|
|
2
|
-
|
|
2
|
+
type GenerateOptions = {
|
|
3
|
+
showLifecycle?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function generate(provider?: LanguageProvider, options?: GenerateOptions): Promise<void>;
|
|
6
|
+
export {};
|
|
3
7
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAgBxE,KAAK,eAAe,GAAG;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,wBAAsB,QAAQ,CAAC,QAAQ,GAAE,gBAAoC,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+S3H"}
|