terse-cli 0.1.35 → 0.1.37
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 +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +10 -10
- package/dist/api.js.map +1 -1
- package/dist/assertProjectRoot.d.ts +1 -1
- package/dist/assertProjectRoot.d.ts.map +1 -1
- package/dist/assertProjectRoot.js +5 -4
- package/dist/assertProjectRoot.js.map +1 -1
- package/dist/cliError.d.ts +22 -0
- package/dist/cliError.d.ts.map +1 -0
- package/dist/cliError.js +67 -0
- package/dist/cliError.js.map +1 -0
- package/dist/cliHelpers.d.ts +20 -0
- package/dist/cliHelpers.d.ts.map +1 -0
- package/dist/cliHelpers.js +69 -0
- package/dist/cliHelpers.js.map +1 -0
- package/dist/commands/attach.d.ts +2 -1
- package/dist/commands/attach.d.ts.map +1 -1
- package/dist/commands/attach.js +7 -5
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/auth.d.ts +2 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +20 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +14 -14
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/generate.d.ts +1 -5
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +13 -16
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/history.d.ts +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +4 -3
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integrate.d.ts +32 -2
- package/dist/commands/integrate.d.ts.map +1 -1
- package/dist/commands/integrate.js +424 -64
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +5 -6
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +14 -17
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/test.d.ts +47 -0
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +268 -48
- package/dist/commands/test.js.map +1 -1
- package/dist/index.js +161 -14
- package/dist/index.js.map +1 -1
- package/dist/integrationApi.d.ts +5 -2
- package/dist/integrationApi.d.ts.map +1 -1
- package/dist/integrationApi.js +8 -4
- package/dist/integrationApi.js.map +1 -1
- package/dist/loadJob.d.ts +2 -1
- package/dist/loadJob.d.ts.map +1 -1
- package/dist/loadJob.js +16 -13
- package/dist/loadJob.js.map +1 -1
- package/dist/nonInteractive.d.ts +20 -0
- package/dist/nonInteractive.d.ts.map +1 -0
- package/dist/nonInteractive.js +60 -0
- package/dist/nonInteractive.js.map +1 -0
- package/dist/projectConfig.d.ts.map +1 -1
- package/dist/projectConfig.js +17 -10
- package/dist/projectConfig.js.map +1 -1
- package/dist/providers/python/PythonProvider.d.ts.map +1 -1
- package/dist/providers/python/PythonProvider.js +24 -14
- package/dist/providers/python/PythonProvider.js.map +1 -1
- package/dist/providers/resolveProvider.d.ts.map +1 -1
- package/dist/providers/resolveProvider.js +7 -9
- package/dist/providers/resolveProvider.js.map +1 -1
- package/dist/providers/shared/entryFileGuidance.d.ts.map +1 -1
- package/dist/providers/shared/entryFileGuidance.js +7 -12
- package/dist/providers/shared/entryFileGuidance.js.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.js +30 -27
- package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
- package/dist/sampleEventCache.d.ts +9 -0
- package/dist/sampleEventCache.d.ts.map +1 -0
- package/dist/sampleEventCache.js +47 -0
- package/dist/sampleEventCache.js.map +1 -0
- package/dist/sampleEventId.d.ts +9 -0
- package/dist/sampleEventId.d.ts.map +1 -0
- package/dist/sampleEventId.js +16 -0
- package/dist/sampleEventId.js.map +1 -0
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
+
import { CliError, emitCliError, isCliError, setErrorOutputJson } from "./cliError.js";
|
|
5
|
+
import { collectKeyValue, parseIntFlag } from "./cliHelpers.js";
|
|
4
6
|
import { getCliVersion } from "./cliVersion.js";
|
|
5
7
|
import { attach } from "./commands/attach.js";
|
|
6
8
|
import { loginAndPersist, logout } from "./commands/auth.js";
|
|
@@ -10,54 +12,195 @@ import { openDocs } from "./commands/docs.js";
|
|
|
10
12
|
import { generate } from "./commands/generate.js";
|
|
11
13
|
import { history } from "./commands/history.js";
|
|
12
14
|
import { init } from "./commands/init.js";
|
|
13
|
-
import { integrate } from "./commands/integrate.js";
|
|
15
|
+
import { integrate, integrateConnect, integrateDescribe, integrateDisconnect, integrateList, integrateWait } from "./commands/integrate.js";
|
|
14
16
|
import { replay } from "./commands/replay.js";
|
|
15
17
|
import { run } from "./commands/run.js";
|
|
16
|
-
import { test } from "./commands/test.js";
|
|
18
|
+
import { test, testList, testRun, testShow } from "./commands/test.js";
|
|
17
19
|
import { isCliRunCommandEnabled } from "./env.js";
|
|
18
20
|
import { isPromptCancellationError } from "./promptErrors.js";
|
|
19
21
|
import { resolveProvider } from "./providers/resolveProvider.js";
|
|
20
22
|
const program = new Command();
|
|
23
|
+
const NON_INTERACTIVE_OPTION = ["-y, --non-interactive", "Run non-interactively; fail fast if authentication or choices are required"];
|
|
24
|
+
const ENTRY_FILE_OPTION = ["--entry-file <path>", "Path to the job entry file (overrides default)"];
|
|
25
|
+
function syncJsonErrorOutput(command) {
|
|
26
|
+
const { json } = command.opts();
|
|
27
|
+
setErrorOutputJson(Boolean(json));
|
|
28
|
+
}
|
|
21
29
|
program.name("terse").description("The Terse CLI — create and manage Terse projects").version(getCliVersion());
|
|
30
|
+
program.hook("preAction", (_thisCommand, actionCommand) => {
|
|
31
|
+
syncJsonErrorOutput(actionCommand);
|
|
32
|
+
});
|
|
22
33
|
program.commandsGroup("Getting started:");
|
|
23
34
|
program
|
|
24
35
|
.command("init")
|
|
25
36
|
.description("Create a new Terse project")
|
|
26
37
|
.argument("[project-name]", "Name for the project directory")
|
|
27
|
-
.
|
|
38
|
+
.option(...NON_INTERACTIVE_OPTION)
|
|
39
|
+
.addHelpText("after", `
|
|
40
|
+
Examples:
|
|
41
|
+
$ terse init myproj # interactive scaffold
|
|
42
|
+
$ terse init myproj --non-interactive # non-interactive; requires prior \`terse login\`
|
|
43
|
+
$ terse init myproj < /dev/null # auto non-interactive (no TTY)
|
|
44
|
+
`)
|
|
45
|
+
.action(async (projectName, opts) => {
|
|
28
46
|
const language = "ts";
|
|
29
47
|
const provider = resolveProvider({ command: "init", language });
|
|
30
|
-
await init(projectName, provider);
|
|
48
|
+
await init(projectName, provider, opts);
|
|
31
49
|
});
|
|
32
50
|
program
|
|
33
51
|
.command("attach")
|
|
34
52
|
.description("Add Terse to an existing project (self-hosted)")
|
|
35
|
-
.
|
|
36
|
-
|
|
53
|
+
.option(...NON_INTERACTIVE_OPTION)
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
await attach(resolveProvider(), opts);
|
|
37
56
|
});
|
|
38
|
-
program
|
|
57
|
+
const testCommand = program
|
|
39
58
|
.command("test")
|
|
40
59
|
.description("Fetch sample events and run a job interactively")
|
|
41
60
|
.argument("[job-name]", "Name of the job to test (auto-selects if only one exists)")
|
|
42
61
|
.option("-v, --verbose", "Show agent stream output", true)
|
|
43
|
-
.option(
|
|
62
|
+
.option(...ENTRY_FILE_OPTION)
|
|
63
|
+
.addHelpText("after", `
|
|
64
|
+
Examples:
|
|
65
|
+
$ terse test # interactive picker
|
|
66
|
+
$ terse test my-job # test a specific job
|
|
67
|
+
|
|
68
|
+
Non-interactive subcommands (for AI agents and CI):
|
|
69
|
+
$ terse test list --json # enumerate sample events with ids
|
|
70
|
+
$ terse test show <id> # inspect a specific sample
|
|
71
|
+
$ terse test run --id <id> # run a cached sample by content hash
|
|
72
|
+
$ terse test run --event-file sample.json # run a sample event from disk
|
|
73
|
+
`)
|
|
44
74
|
.action(async (jobName, opts) => {
|
|
45
75
|
await test(jobName, opts?.verbose, resolveProvider(), opts?.entryFile);
|
|
46
76
|
});
|
|
77
|
+
testCommand
|
|
78
|
+
.command("list")
|
|
79
|
+
.description("List sample events for a job with content-addressed ids")
|
|
80
|
+
.argument("[job-name]", "Name of the job (auto-selects if only one exists)")
|
|
81
|
+
.option("--json", "Emit JSON with the full event payload for each id")
|
|
82
|
+
.option(...ENTRY_FILE_OPTION)
|
|
83
|
+
.action(async (jobName, opts) => {
|
|
84
|
+
await testList({ jobName, json: opts?.json, entryFile: opts?.entryFile });
|
|
85
|
+
});
|
|
86
|
+
testCommand
|
|
87
|
+
.command("show")
|
|
88
|
+
.description("Show the full contents of a cached sample event")
|
|
89
|
+
.argument("<id>", "Sample event id from `terse test list`")
|
|
90
|
+
.argument("[job-name]", "Name of the job (auto-selects if only one exists)")
|
|
91
|
+
.option("--json", "Emit JSON instead of rendered text")
|
|
92
|
+
.option(...ENTRY_FILE_OPTION)
|
|
93
|
+
.action(async (id, jobName, opts) => {
|
|
94
|
+
await testShow({ id, jobName, json: opts?.json, entryFile: opts?.entryFile });
|
|
95
|
+
});
|
|
96
|
+
testCommand
|
|
97
|
+
.command("run")
|
|
98
|
+
.description("Run a job against a sample event non-interactively")
|
|
99
|
+
.argument("[job-name]", "Name of the job (auto-selects if only one exists)")
|
|
100
|
+
.option("--id <id>", "Sample event id from `terse test list`")
|
|
101
|
+
.option("--event <json>", "Inline serialized event JSON string")
|
|
102
|
+
.option("--event-file <path>", "Path to a JSON file containing the serialized event")
|
|
103
|
+
.option("-v, --verbose", "Show agent stream output", true)
|
|
104
|
+
.option(...ENTRY_FILE_OPTION)
|
|
105
|
+
.addHelpText("after", `
|
|
106
|
+
Examples:
|
|
107
|
+
$ terse test list --json | jq -r '.events[0].id' | xargs -I{} terse test run --id {}
|
|
108
|
+
$ terse test run --event-file fixture.json
|
|
109
|
+
`)
|
|
110
|
+
.action(async (jobName, opts) => {
|
|
111
|
+
await testRun({
|
|
112
|
+
jobName,
|
|
113
|
+
id: opts?.id,
|
|
114
|
+
eventJson: opts?.event,
|
|
115
|
+
eventFile: opts?.eventFile,
|
|
116
|
+
verbose: opts?.verbose,
|
|
117
|
+
entryFile: opts?.entryFile
|
|
118
|
+
});
|
|
119
|
+
});
|
|
47
120
|
program
|
|
48
121
|
.command("deploy")
|
|
49
122
|
.description("Deploy all jobs to Terse (syncs with server — removed jobs are deleted)")
|
|
50
|
-
.option(
|
|
123
|
+
.option(...ENTRY_FILE_OPTION)
|
|
51
124
|
.action(async (opts) => {
|
|
52
125
|
await deploy(resolveProvider(), opts?.entryFile);
|
|
53
126
|
});
|
|
54
127
|
program.commandsGroup("Build with workspace context:");
|
|
55
|
-
program
|
|
128
|
+
const integrateCommand = program
|
|
56
129
|
.command("integrate")
|
|
57
|
-
.description("
|
|
130
|
+
.description("Connect and manage integrations")
|
|
131
|
+
.addHelpText("after", `
|
|
132
|
+
Examples:
|
|
133
|
+
$ terse integrate # interactive picker
|
|
134
|
+
$ terse integrate list --json # enumerate integrations
|
|
135
|
+
$ terse integrate describe snowflake --json # see required fields
|
|
136
|
+
$ terse integrate connect snowflake --field account=x --field username=y --fields-stdin <<< '{"password":"'"$PW"'"}'
|
|
137
|
+
$ terse integrate connect slack # OAuth → opens browser, exit 2 (follow up with 'wait')
|
|
138
|
+
$ terse integrate wait slack --timeout 300 # block until OAuth completes
|
|
139
|
+
$ terse integrate disconnect snowflake
|
|
140
|
+
`)
|
|
58
141
|
.action(async () => {
|
|
59
142
|
await integrate();
|
|
60
143
|
});
|
|
144
|
+
integrateCommand
|
|
145
|
+
.command("list")
|
|
146
|
+
.description("List integrations and their connection status")
|
|
147
|
+
.option("--json", "Emit JSON")
|
|
148
|
+
.option("--status <status>", "Filter to `connected` or `disconnected`")
|
|
149
|
+
.action(async (opts) => {
|
|
150
|
+
if (opts.status && opts.status !== "connected" && opts.status !== "disconnected") {
|
|
151
|
+
throw new CliError("invalid_status_filter", `--status must be "connected" or "disconnected", got "${opts.status}".`);
|
|
152
|
+
}
|
|
153
|
+
await integrateList({ json: opts.json, status: opts.status });
|
|
154
|
+
});
|
|
155
|
+
integrateCommand
|
|
156
|
+
.command("describe")
|
|
157
|
+
.description("Show schema and status for an integration type")
|
|
158
|
+
.argument("<type>", "Integration type (e.g. slack, snowflake)")
|
|
159
|
+
.option("--json", "Emit JSON")
|
|
160
|
+
.action(async (type, opts) => {
|
|
161
|
+
await integrateDescribe({ integrationType: type, json: opts.json });
|
|
162
|
+
});
|
|
163
|
+
integrateCommand
|
|
164
|
+
.command("connect")
|
|
165
|
+
.description("Connect (or refresh) an integration. OAuth types open a browser and exit 2 — follow up with `wait` to block.")
|
|
166
|
+
.argument("<type>", "Integration type (e.g. slack, gmail, snowflake)")
|
|
167
|
+
.option("--field <key=value>", "Form field value (repeatable). Never put secrets here — use --fields-stdin.", collectKeyValue, [])
|
|
168
|
+
.option("--fields-stdin", "Read a JSON object of additional fields from stdin (secrets go here)")
|
|
169
|
+
.option("-f, --force", "Re-run the install even if the integration is already connected")
|
|
170
|
+
.option("--json", "Emit JSON")
|
|
171
|
+
.addHelpText("after", `
|
|
172
|
+
Examples:
|
|
173
|
+
$ terse integrate connect snowflake --field account=xyz --field username=foo --fields-stdin <<< '{"password":"'"$PW"'"}'
|
|
174
|
+
$ terse integrate connect slack # OAuth: opens browser, prints URL + wait command, exit 2
|
|
175
|
+
$ terse integrate connect slack --json # OAuth: opens browser, emits handoff JSON, exit 2
|
|
176
|
+
$ terse integrate connect snowflake --force # refresh an existing connection
|
|
177
|
+
`)
|
|
178
|
+
.action(async (type, opts) => {
|
|
179
|
+
await integrateConnect({
|
|
180
|
+
integrationType: type,
|
|
181
|
+
fieldFlags: opts.field,
|
|
182
|
+
fieldsStdin: opts.fieldsStdin,
|
|
183
|
+
force: opts.force,
|
|
184
|
+
json: opts.json
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
integrateCommand
|
|
188
|
+
.command("disconnect")
|
|
189
|
+
.description("Disconnect an integration")
|
|
190
|
+
.argument("<type>", "Integration type (e.g. slack, snowflake)")
|
|
191
|
+
.option("--json", "Emit JSON")
|
|
192
|
+
.action(async (type, opts) => {
|
|
193
|
+
await integrateDisconnect({ integrationType: type, json: opts.json });
|
|
194
|
+
});
|
|
195
|
+
integrateCommand
|
|
196
|
+
.command("wait")
|
|
197
|
+
.description("Block until an OAuth integration finishes connecting (run after `connect` emits a handoff)")
|
|
198
|
+
.argument("<type>", "Integration type (e.g. slack, gmail)")
|
|
199
|
+
.option("--timeout <seconds>", "Timeout in seconds (default 300, max 900)", parseIntFlag)
|
|
200
|
+
.option("--json", "Emit JSON")
|
|
201
|
+
.action(async (type, opts) => {
|
|
202
|
+
await integrateWait({ integrationType: type, timeoutSeconds: opts.timeout, json: opts.json });
|
|
203
|
+
});
|
|
61
204
|
program
|
|
62
205
|
.command("generate")
|
|
63
206
|
.description("Autogenerate context from your connected workspaces")
|
|
@@ -72,7 +215,7 @@ if (isCliRunCommandEnabled()) {
|
|
|
72
215
|
.argument("[job-name]", "Name of the job to run (auto-selects if only one exists)")
|
|
73
216
|
.option("--event <json>", "Serialized event JSON string")
|
|
74
217
|
.option("--event-file <path>", "Path to a JSON file containing the serialized event")
|
|
75
|
-
.option(
|
|
218
|
+
.option(...ENTRY_FILE_OPTION)
|
|
76
219
|
.action(async (jobName, opts) => {
|
|
77
220
|
await run(jobName, opts?.event, opts?.eventFile, resolveProvider(), opts?.entryFile);
|
|
78
221
|
});
|
|
@@ -90,8 +233,8 @@ program
|
|
|
90
233
|
.description("View past run events for a job (use --json to pipe into tooling like the Claude Code /improve skill)")
|
|
91
234
|
.argument("[job-name]", "Name of the job to view the history of")
|
|
92
235
|
.option("--json", "Output runs as JSON for machine consumption")
|
|
93
|
-
.option("--limit <n>", "Max runs to fetch (default 20, max 100)",
|
|
94
|
-
.option("--page <n>", "Page number (1-indexed)",
|
|
236
|
+
.option("--limit <n>", "Max runs to fetch (default 20, max 100)", parseIntFlag)
|
|
237
|
+
.option("--page <n>", "Page number (1-indexed)", parseIntFlag)
|
|
95
238
|
.option("--status <list>", "Comma-separated statuses (success,failed,cancelled,skipped,in_progress,awaiting_approval)")
|
|
96
239
|
.option("--since <iso>", "Only include runs at or after this ISO timestamp")
|
|
97
240
|
.option("--until <iso>", "Only include runs at or before this ISO timestamp")
|
|
@@ -145,6 +288,10 @@ catch (error) {
|
|
|
145
288
|
console.log(chalk.yellow("\n Cancelled.\n"));
|
|
146
289
|
process.exit(130);
|
|
147
290
|
}
|
|
291
|
+
if (isCliError(error)) {
|
|
292
|
+
emitCliError(error);
|
|
293
|
+
process.exit(error.exitCode);
|
|
294
|
+
}
|
|
148
295
|
throw error;
|
|
149
296
|
}
|
|
150
297
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACtF,OAAO,EAAsB,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC3I,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,MAAM,sBAAsB,GAAG,CAAC,uBAAuB,EAAE,4EAA4E,CAAU,CAAA;AAE/I,MAAM,iBAAiB,GAAG,CAAC,qBAAqB,EAAE,gDAAgD,CAAU,CAAA;AAE5G,SAAS,mBAAmB,CAAC,OAAgB;IACzC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAY,CAAA;IACzC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AACrC,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;AAC9G,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACtD,mBAAmB,CAAC,aAAa,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAA;AACzC,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;KAC5D,MAAM,CAAC,GAAG,sBAAsB,CAAC;KACjC,WAAW,CACR,OAAO,EACP;;;;;CAKP,CACI;KACA,MAAM,CAAC,KAAK,EAAE,WAAoB,EAAE,IAAyB,EAAE,EAAE;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAA;IACrB,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC/D,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA;AACN,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,GAAG,sBAAsB,CAAC;KACjC,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IACxC,MAAM,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC,CAAC,CAAA;AAEN,MAAM,WAAW,GAAG,OAAO;KACtB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,YAAY,EAAE,2DAA2D,CAAC;KACnF,MAAM,CAAC,eAAe,EAAE,0BAA0B,EAAE,IAAI,CAAC;KACzD,MAAM,CAAC,GAAG,iBAAiB,CAAC;KAC5B,WAAW,CACR,OAAO,EACP;;;;;;;;;;CAUP,CACI;KACA,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,IAA4C,EAAE,EAAE;IAC7E,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;AAC1E,CAAC,CAAC,CAAA;AAEN,WAAW;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yDAAyD,CAAC;KACtE,QAAQ,CAAC,YAAY,EAAE,mDAAmD,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC;KACrE,MAAM,CAAC,GAAG,iBAAiB,CAAC;KAC5B,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,IAAwB,EAAE,EAAE;IACzD,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC7E,CAAC,CAAC,CAAA;AAEN,WAAW;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC;KAC1D,QAAQ,CAAC,YAAY,EAAE,mDAAmD,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,oCAAoC,CAAC;KACtD,MAAM,CAAC,GAAG,iBAAiB,CAAC;KAC5B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAgB,EAAE,IAAwB,EAAE,EAAE;IACrE,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjF,CAAC,CAAC,CAAA;AAEN,WAAW;KACN,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,oDAAoD,CAAC;KACjE,QAAQ,CAAC,YAAY,EAAE,mDAAmD,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;KAC7D,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,qDAAqD,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,0BAA0B,EAAE,IAAI,CAAC;KACzD,MAAM,CAAC,GAAG,iBAAiB,CAAC;KAC5B,WAAW,CACR,OAAO,EACP;;;;CAIP,CACI;KACA,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,IAAiG,EAAE,EAAE;IAClI,MAAM,OAAO,CAAC;QACV,OAAO;QACP,EAAE,EAAE,IAAI,EAAE,EAAE;QACZ,SAAS,EAAE,IAAI,EAAE,KAAK;QACtB,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;QACtB,SAAS,EAAE,IAAI,EAAE,SAAS;KAC7B,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEN,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yEAAyE,CAAC;KACtF,MAAM,CAAC,GAAG,iBAAiB,CAAC;KAC5B,MAAM,CAAC,KAAK,EAAE,IAAoB,EAAE,EAAE;IACnC,MAAM,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;AACpD,CAAC,CAAC,CAAA;AAEN,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAA;AAEtD,MAAM,gBAAgB,GAAG,OAAO;KAC3B,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,WAAW,CACR,OAAO,EACP;;;;;;;;;CASP,CACI;KACA,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,SAAS,EAAE,CAAA;AACrB,CAAC,CAAC,CAAA;AAEN,gBAAgB;KACX,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC7B,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAyC,EAAE,EAAE;IACxD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QAC/E,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,wDAAwD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;IACxH,CAAC;IACD,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAkD,EAAE,CAAC,CAAA;AAC7G,CAAC,CAAC,CAAA;AAEN,gBAAgB;KACX,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,QAAQ,CAAC,QAAQ,EAAE,0CAA0C,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAc,EAAE,EAAE;IAC3C,MAAM,iBAAiB,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEN,gBAAgB;KACX,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8GAA8G,CAAC;KAC3H,QAAQ,CAAC,QAAQ,EAAE,iDAAiD,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,6EAA6E,EAAE,eAAe,EAAE,EAAE,CAAC;KACjI,MAAM,CAAC,gBAAgB,EAAE,sEAAsE,CAAC;KAChG,MAAM,CAAC,aAAa,EAAE,iEAAiE,CAAC;KACxF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC7B,WAAW,CACR,OAAO,EACP;;;;;;CAMP,CACI;KACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAkF,EAAE,EAAE;IAC/G,MAAM,gBAAgB,CAAC;QACnB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,IAAI,CAAC,KAAK;QACtB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;KAClB,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEN,gBAAgB;KACX,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,QAAQ,EAAE,0CAA0C,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAc,EAAE,EAAE;IAC3C,MAAM,mBAAmB,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;AACzE,CAAC,CAAC,CAAA;AAEN,gBAAgB;KACX,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4FAA4F,CAAC;KACzG,QAAQ,CAAC,QAAQ,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,EAAE,YAAY,CAAC;KACxF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA0C,EAAE,EAAE;IACvE,MAAM,aAAa,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;AACjG,CAAC,CAAC,CAAA;AAEN,OAAO;KACF,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAA;AACrC,CAAC,CAAC,CAAA;AAEN,IAAI,sBAAsB,EAAE,EAAE,CAAC;IAC3B,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IACjC,OAAO;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,YAAY,EAAE,0DAA0D,CAAC;SAClF,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;SACxD,MAAM,CAAC,qBAAqB,EAAE,qDAAqD,CAAC;SACpF,MAAM,CAAC,GAAG,iBAAiB,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,IAAiE,EAAE,EAAE;QAClG,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;AACV,CAAC;AAED,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;AACvC,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC,CAAC,CAAA;AACN,OAAO;KACF,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sGAAsG,CAAC;KACnH,QAAQ,CAAC,YAAY,EAAE,wCAAwC,CAAC;KAChE,MAAM,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,yCAAyC,EAAE,YAAY,CAAC;KAC9E,MAAM,CAAC,YAAY,EAAE,yBAAyB,EAAE,YAAY,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,2FAA2F,CAAC;KACtH,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;KAC3E,MAAM,CAAC,eAAe,EAAE,mDAAmD,CAAC;KAC5E,MAAM,CAAC,aAAa,EAAE,4DAA4D,CAAC;KACnF,MAAM,CAAC,YAAY,EAAE,wFAAwF,CAAC;KAC9G,MAAM,CAAC,UAAU,EAAE,qFAAqF,CAAC;KACzG,MAAM,CAAC,eAAe,EAAE,0DAA0D,CAAC;KACnF,MAAM,CACH,KAAK,EACD,OAA2B,EAC3B,IAWC,EACH,EAAE;IACA,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAChC,CAAC,CACJ,CAAA;AACL,OAAO;KACF,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,GAAG,EAAE;IACT,aAAa,EAAE,CAAA;AACnB,CAAC,CAAC,CAAA;AAEN,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAA;AACxC,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAA;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AACN,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,GAAG,EAAE;IACT,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;IACxB,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;IAC7C,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC9C,CAAC;AACL,CAAC,CAAC,CAAA;AAEN,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAA;AACtC,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,GAAG,EAAE;IACT,QAAQ,EAAE,CAAA;AACd,CAAC,CAAC,CAAA;AACN,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AAEzB,IAAI,CAAC;IACD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;AAC9B,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACb,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,KAAK,CAAA;AACf,CAAC"}
|
package/dist/integrationApi.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { IntegrationWithStatus } from "terse-types";
|
|
2
|
-
import { ConfigurationFieldDefinition, FormFieldDefinition, IntegrationFieldsResponse, OAuthInstallationDetails } from "terse-types";
|
|
1
|
+
import { ConfigurationFieldDefinition, FormFieldDefinition, IntegrationFieldsResponse, IntegrationType, IntegrationWithStatus, OAuthInstallationDetails } from "terse-types";
|
|
3
2
|
export type { IntegrationFieldsResponse, FormFieldDefinition, ConfigurationFieldDefinition };
|
|
4
3
|
export declare function fetchIntegrations(apiKey: string): Promise<IntegrationWithStatus[]>;
|
|
5
4
|
export declare function fetchIntegrationFields(apiKey: string, integrationType: string): Promise<IntegrationFieldsResponse>;
|
|
@@ -8,5 +7,9 @@ export declare function submitIntegrationForm(apiKey: string, integrationType: s
|
|
|
8
7
|
error?: string;
|
|
9
8
|
}>;
|
|
10
9
|
export declare function fetchInstallationUrl(apiKey: string, integrationType: string, options?: Record<string, string>): Promise<OAuthInstallationDetails>;
|
|
10
|
+
export declare function disconnectIntegration(apiKey: string, integrationType: IntegrationType): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}>;
|
|
11
14
|
export declare function pollForConnection(apiKey: string, integrationType: string, timeoutMs?: number, intervalMs?: number): Promise<boolean>;
|
|
12
15
|
//# sourceMappingURL=integrationApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrationApi.d.ts","sourceRoot":"","sources":["../src/integrationApi.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"integrationApi.d.ts","sourceRoot":"","sources":["../src/integrationApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,4BAA4B,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAc,MAAM,aAAa,CAAA;AAInM,YAAY,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,CAAA;AAE5F,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAExF;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAExH;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAEtK;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAGvJ;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAE3I;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,SAAU,EAAE,UAAU,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAe1I"}
|
package/dist/integrationApi.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
import { ApiRoutes, buildRoute } from "terse-types";
|
|
1
2
|
import { fetchWithAuth } from "./api.js";
|
|
2
3
|
export async function fetchIntegrations(apiKey) {
|
|
3
|
-
return fetchWithAuth(
|
|
4
|
+
return fetchWithAuth(ApiRoutes.INTEGRATIONS.LIST, apiKey);
|
|
4
5
|
}
|
|
5
6
|
export async function fetchIntegrationFields(apiKey, integrationType) {
|
|
6
|
-
return fetchWithAuth(
|
|
7
|
+
return fetchWithAuth(buildRoute(ApiRoutes.SDK.INTEGRATION_FIELDS, { integrationType }), apiKey);
|
|
7
8
|
}
|
|
8
9
|
export async function submitIntegrationForm(apiKey, integrationType, formValues) {
|
|
9
|
-
return fetchWithAuth(
|
|
10
|
+
return fetchWithAuth(buildRoute(ApiRoutes.SDK.INTEGRATION_FORM_SUBMIT, { integrationType }), apiKey, { formValues }, "POST");
|
|
10
11
|
}
|
|
11
12
|
export async function fetchInstallationUrl(apiKey, integrationType, options) {
|
|
12
13
|
const optionsParam = options ? `?options=${encodeURIComponent(JSON.stringify(options))}` : "";
|
|
13
|
-
return fetchWithAuth(
|
|
14
|
+
return fetchWithAuth(`${buildRoute(ApiRoutes.INTEGRATIONS.INSTALLATION_DETAILS_BY_TYPE, { integrationType })}${optionsParam}`, apiKey);
|
|
15
|
+
}
|
|
16
|
+
export async function disconnectIntegration(apiKey, integrationType) {
|
|
17
|
+
return fetchWithAuth(buildRoute(ApiRoutes.INTEGRATIONS.DISCONNECT_BY_TYPE, { integrationType }), apiKey, {}, "DELETE");
|
|
14
18
|
}
|
|
15
19
|
export async function pollForConnection(apiKey, integrationType, timeoutMs = 120_000, intervalMs = 3_000) {
|
|
16
20
|
const deadline = Date.now() + timeoutMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrationApi.js","sourceRoot":"","sources":["../src/integrationApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integrationApi.js","sourceRoot":"","sources":["../src/integrationApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkJ,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnM,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIxC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IAClD,OAAO,aAAa,CAA0B,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc,EAAE,eAAuB;IAChF,OAAO,aAAa,CAA4B,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;AAC9H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,eAAuB,EAAE,UAAkC;IACnH,OAAO,aAAa,CAAuC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,CAAC,CAAA;AACtK,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,eAAuB,EAAE,OAAgC;IAChH,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7F,OAAO,aAAa,CAA2B,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,4BAA4B,EAAE,EAAE,eAAe,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,MAAM,CAAC,CAAA;AACpK,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,eAAgC;IACxF,OAAO,aAAa,CAAuC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAChK,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,eAAuB,EAAE,SAAS,GAAG,OAAO,EAAE,UAAU,GAAG,KAAK;IACpH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IAEvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;QAC7D,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,eAAe,CAAC,CAAA;YAC3E,IAAI,KAAK,EAAE,QAAQ;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QAAC,MAAM,CAAC;YACL,wCAAwC;QAC5C,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAA;AAChB,CAAC"}
|
package/dist/loadJob.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { CreateJobParameters } from "terse-sdk";
|
|
2
|
+
import { type NonInteractiveOpts } from "./cliHelpers.js";
|
|
2
3
|
import type { LanguageProvider } from "./providers/LanguageProvider.js";
|
|
3
4
|
/**
|
|
4
5
|
* Imports the user's entry file and returns the full job registry.
|
|
5
6
|
* Each createJob() call populates this map.
|
|
6
7
|
*/
|
|
7
8
|
export declare function loadJobRegistry(provider: LanguageProvider, entryFile?: string): Promise<Map<string, CreateJobParameters>>;
|
|
8
|
-
export declare function loadJob(provider: LanguageProvider, jobName?: string, entryFile?: string): Promise<{
|
|
9
|
+
export declare function loadJob(provider: LanguageProvider, jobName?: string, entryFile?: string, opts?: NonInteractiveOpts): Promise<{
|
|
9
10
|
job: CreateJobParameters;
|
|
10
11
|
}>;
|
|
11
12
|
//# sourceMappingURL=loadJob.d.ts.map
|
package/dist/loadJob.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadJob.d.ts","sourceRoot":"","sources":["../src/loadJob.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loadJob.d.ts","sourceRoot":"","sources":["../src/loadJob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAI/C,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAG/H;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAkChK"}
|
package/dist/loadJob.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { select } from "@inquirer/prompts";
|
|
2
|
-
import chalk from "chalk";
|
|
3
2
|
import { assertProjectRoot } from "./assertProjectRoot.js";
|
|
3
|
+
import { CliError } from "./cliError.js";
|
|
4
|
+
import { isNonInteractive } from "./cliHelpers.js";
|
|
4
5
|
/**
|
|
5
6
|
* Imports the user's entry file and returns the full job registry.
|
|
6
7
|
* Each createJob() call populates this map.
|
|
@@ -9,30 +10,32 @@ export async function loadJobRegistry(provider, entryFile) {
|
|
|
9
10
|
assertProjectRoot(provider, provider.detectionMarkers);
|
|
10
11
|
return provider.loadJobRegistry(entryFile);
|
|
11
12
|
}
|
|
12
|
-
export async function loadJob(provider, jobName, entryFile) {
|
|
13
|
+
export async function loadJob(provider, jobName, entryFile, opts) {
|
|
13
14
|
const registry = await loadJobRegistry(provider, entryFile);
|
|
14
15
|
if (registry.size === 0) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
process.exit(1);
|
|
16
|
+
throw new CliError("no_jobs_found", "No jobs found.", {
|
|
17
|
+
detail: `Make sure ${provider.entryFile} registers at least one job.`
|
|
18
|
+
});
|
|
19
19
|
}
|
|
20
|
-
// Resolve which job to run
|
|
21
20
|
let resolvedName;
|
|
22
21
|
if (jobName) {
|
|
23
22
|
if (!registry.has(jobName)) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
process.exit(1);
|
|
23
|
+
const available = [...registry.keys()].join(", ");
|
|
24
|
+
throw new CliError("job_not_found", `Job "${jobName}" not found.`, {
|
|
25
|
+
detail: `Available jobs: ${available}`
|
|
26
|
+
});
|
|
30
27
|
}
|
|
31
28
|
resolvedName = jobName;
|
|
32
29
|
}
|
|
33
30
|
else if (registry.size === 1) {
|
|
34
31
|
resolvedName = registry.keys().next().value;
|
|
35
32
|
}
|
|
33
|
+
else if (isNonInteractive(opts)) {
|
|
34
|
+
const available = [...registry.keys()].join(", ");
|
|
35
|
+
throw new CliError("job_selection_required", "Multiple jobs found — specify which one to use.", {
|
|
36
|
+
detail: `Available jobs: ${available}. Pass the job name as an argument.`
|
|
37
|
+
});
|
|
38
|
+
}
|
|
36
39
|
else {
|
|
37
40
|
resolvedName = await select({
|
|
38
41
|
message: "Multiple jobs found. Which one?",
|
package/dist/loadJob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadJob.js","sourceRoot":"","sources":["../src/loadJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"loadJob.js","sourceRoot":"","sources":["../src/loadJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAA2B,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAG3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA0B,EAAE,SAAkB;IAChF,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IACtD,OAAO,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAA0B,EAAE,OAAgB,EAAE,SAAkB,EAAE,IAAyB;IACrH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAE3D,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,gBAAgB,EAAE;YAClD,MAAM,EAAE,aAAa,QAAQ,CAAC,SAAS,8BAA8B;SACxE,CAAC,CAAA;IACN,CAAC;IAED,IAAI,YAAoB,CAAA;IAExB,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,QAAQ,OAAO,cAAc,EAAE;gBAC/D,MAAM,EAAE,mBAAmB,SAAS,EAAE;aACzC,CAAC,CAAA;QACN,CAAC;QACD,YAAY,GAAG,OAAO,CAAA;IAC1B,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAA;IAChD,CAAC;SAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,iDAAiD,EAAE;YAC5F,MAAM,EAAE,mBAAmB,SAAS,qCAAqC;SAC5E,CAAC,CAAA;IACN,CAAC;SAAM,CAAC;QACJ,YAAY,GAAG,MAAM,MAAM,CAAS;YAChC,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SACrE,CAAC,CAAA;IACN,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAE,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type NonInteractiveOpts = {
|
|
2
|
+
nonInteractive?: boolean;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* True when the CLI should avoid any interactive prompt. Honors the explicit
|
|
6
|
+
* flag first, falls back to TTY detection so subprocess / piped invocations
|
|
7
|
+
* behave non-interactively without the caller needing to pass `--non-interactive`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isNonInteractive(opts?: NonInteractiveOpts): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Supports parsing a series of key=value flags from the CLI.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseKeyValueFlags(values: string[] | undefined): Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Read a JSON object from stdin and return it as a string map. Used by
|
|
16
|
+
* `terse integrate connect --fields-stdin` so passwords and tokens never touch
|
|
17
|
+
* argv.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readFieldsFromStdin(): Promise<Record<string, string>>;
|
|
20
|
+
//# sourceMappingURL=nonInteractive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonInteractive.d.ts","sourceRoot":"","sources":["../src/nonInteractive.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAGnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUvF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B3E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { CliError } from "./cliError.js";
|
|
2
|
+
/**
|
|
3
|
+
* True when the CLI should avoid any interactive prompt. Honors the explicit
|
|
4
|
+
* flag first, falls back to TTY detection so subprocess / piped invocations
|
|
5
|
+
* behave non-interactively without the caller needing to pass `--non-interactive`.
|
|
6
|
+
*/
|
|
7
|
+
export function isNonInteractive(opts) {
|
|
8
|
+
if (opts?.nonInteractive)
|
|
9
|
+
return true;
|
|
10
|
+
return !process.stdin.isTTY || !process.stdout.isTTY;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Supports parsing a series of key=value flags from the CLI.
|
|
14
|
+
*/
|
|
15
|
+
export function parseKeyValueFlags(values) {
|
|
16
|
+
const out = {};
|
|
17
|
+
for (const raw of values ?? []) {
|
|
18
|
+
const eq = raw.indexOf("=");
|
|
19
|
+
if (eq <= 0) {
|
|
20
|
+
throw new CliError("invalid_field", `Invalid --field value "${raw}"`, { detail: "Expected key=value" });
|
|
21
|
+
}
|
|
22
|
+
out[raw.slice(0, eq)] = raw.slice(eq + 1);
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read a JSON object from stdin and return it as a string map. Used by
|
|
28
|
+
* `terse integrate connect --fields-stdin` so passwords and tokens never touch
|
|
29
|
+
* argv.
|
|
30
|
+
*/
|
|
31
|
+
export async function readFieldsFromStdin() {
|
|
32
|
+
const chunks = [];
|
|
33
|
+
for await (const chunk of process.stdin) {
|
|
34
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
35
|
+
}
|
|
36
|
+
const raw = Buffer.concat(chunks).toString("utf-8").trim();
|
|
37
|
+
if (!raw)
|
|
38
|
+
return {};
|
|
39
|
+
let parsed;
|
|
40
|
+
try {
|
|
41
|
+
parsed = JSON.parse(raw);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
throw new CliError("invalid_fields_stdin", "Could not parse JSON from stdin", {
|
|
45
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
49
|
+
throw new CliError("invalid_fields_stdin", "Expected a JSON object on stdin", { detail: 'Example: {"password":"..."}' });
|
|
50
|
+
}
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
53
|
+
if (typeof v !== "string") {
|
|
54
|
+
throw new CliError("invalid_fields_stdin", `Field "${k}" must be a string`);
|
|
55
|
+
}
|
|
56
|
+
out[k] = v;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=nonInteractive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonInteractive.js","sourceRoot":"","sources":["../src/nonInteractive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAMxC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACtD,IAAI,IAAI,EAAE,cAAc;QAAE,OAAO,IAAI,CAAA;IACrC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA4B;IAC3D,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACV,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,0BAA0B,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAA;QAC3G,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACrC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACvE,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAEnB,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,iCAAiC,EAAE;YAC1E,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,iCAAiC,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAA;IAC5H,CAAC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;QACrE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAA;QAC/E,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAKrD,eAAO,MAAM,uBAAuB,sBAAsB,CAAA;AAE1D,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAErE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,GAAG,IAAI,CAsBxF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,CAOvF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAIhF;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAInG"}
|
package/dist/projectConfig.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
1
|
import fs from "node:fs";
|
|
3
2
|
import path from "node:path";
|
|
4
3
|
import { ApiRoutes, sdkCreateProjectResponseBodySchema, terseProjectConfigSchema } from "terse-types";
|
|
5
4
|
import { fetchWithAuth } from "./api.js";
|
|
5
|
+
import { CliError } from "./cliError.js";
|
|
6
6
|
export const PROJECT_CONFIG_FILENAME = "terse.config.json";
|
|
7
7
|
export function projectConfigPath(cwd = process.cwd()) {
|
|
8
8
|
return path.join(cwd, PROJECT_CONFIG_FILENAME);
|
|
@@ -12,11 +12,20 @@ export function readProjectConfig(cwd = process.cwd()) {
|
|
|
12
12
|
if (!fs.existsSync(filePath))
|
|
13
13
|
return null;
|
|
14
14
|
const raw = fs.readFileSync(filePath, "utf8");
|
|
15
|
-
|
|
15
|
+
let parsedJson;
|
|
16
|
+
try {
|
|
17
|
+
parsedJson = JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new CliError("project_config_malformed", `${PROJECT_CONFIG_FILENAME} is malformed.`, {
|
|
21
|
+
detail: error instanceof Error ? error.message : String(error)
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const parsed = terseProjectConfigSchema.safeParse(parsedJson);
|
|
16
25
|
if (!parsed.success) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
throw new CliError("project_config_malformed", `${PROJECT_CONFIG_FILENAME} is malformed.`, {
|
|
27
|
+
detail: parsed.error.issues.map(issue => `${issue.path.join(".") || "(root)"}: ${issue.message}`).join("\n")
|
|
28
|
+
});
|
|
20
29
|
}
|
|
21
30
|
return parsed.data;
|
|
22
31
|
}
|
|
@@ -24,11 +33,9 @@ export function readProjectConfigOrBail(cwd = process.cwd()) {
|
|
|
24
33
|
const config = readProjectConfig(cwd);
|
|
25
34
|
if (config)
|
|
26
35
|
return config;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.error(` For an existing repo, run ${chalk.cyan("terse attach")}.\n`);
|
|
31
|
-
process.exit(1);
|
|
36
|
+
throw new CliError("project_not_attached", `No ${PROJECT_CONFIG_FILENAME} found in ${cwd}.`, {
|
|
37
|
+
detail: `This project isn't linked to a Terse project yet.\n\nFor a new project, run \`terse init\`.\nFor an existing repo, run \`terse attach\`.`
|
|
38
|
+
});
|
|
32
39
|
}
|
|
33
40
|
export function writeProjectConfig(cwd, config) {
|
|
34
41
|
const filePath = projectConfigPath(cwd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,kCAAkC,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAGrG,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAA;AAE1D,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC7C,IAAI,UAAmB,CAAA;IACvB,IAAI,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,GAAG,uBAAuB,gBAAgB,EAAE;YACvF,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACjE,CAAC,CAAA;IACN,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,GAAG,uBAAuB,gBAAgB,EAAE;YACvF,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC/G,CAAC,CAAA;IACN,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,MAAM,uBAAuB,aAAa,GAAG,GAAG,EAAE;QACzF,MAAM,EAAE,0IAA0I;KACrJ,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAA0B;IACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;IACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,IAAY;IAClE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5F,MAAM,MAAM,GAAG,kCAAkC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACjE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PythonProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/python/PythonProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAgB,MAAM,WAAW,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"PythonProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/python/PythonProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAgB,MAAM,WAAW,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AA+BtD,qBAAa,cAAe,YAAW,gBAAgB;IACnD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAS;IACrC,QAAQ,CAAC,WAAW,YAAW;IAC/B,QAAQ,CAAC,gBAAgB;;;MAGxB;IACD,QAAQ,CAAC,cAAc;;;MAGtB;IACD,QAAQ,CAAC,SAAS,iBAAgB;IAClC,QAAQ,CAAC,iBAAiB,4BAA2B;IACrD,QAAQ,CAAC,gBAAgB;;;MAGxB;IAED,aAAa,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAW5D,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAO1F,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE;IAInD,oBAAoB,IAAI,MAAM;IAIxB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAM1C,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IA+C9E,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCzJ,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU;cAexC,aAAa,CACzB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;QACF,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAC1B,GACF,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;cAI9B,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;cAI3F,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,SAAS,CAAC,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI5D,SAAS,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAG7D;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAA"}
|