@bland-ai/cli 0.1.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/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +143 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/alarm.d.ts +3 -0
- package/dist/commands/alarm.d.ts.map +1 -0
- package/dist/commands/alarm.js +92 -0
- package/dist/commands/alarm.js.map +1 -0
- package/dist/commands/audio.d.ts +3 -0
- package/dist/commands/audio.d.ts.map +1 -0
- package/dist/commands/audio.js +77 -0
- package/dist/commands/audio.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +199 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/batch.d.ts +3 -0
- package/dist/commands/batch.d.ts.map +1 -0
- package/dist/commands/batch.js +108 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/call.d.ts +3 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +348 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/eval.d.ts +3 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +66 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/guard.d.ts +3 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +100 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/knowledge.d.ts +3 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +136 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/listen.d.ts +3 -0
- package/dist/commands/listen.d.ts.map +1 -0
- package/dist/commands/listen.js +98 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +22 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/number.d.ts +3 -0
- package/dist/commands/number.d.ts.map +1 -0
- package/dist/commands/number.js +225 -0
- package/dist/commands/number.js.map +1 -0
- package/dist/commands/pathway.d.ts +3 -0
- package/dist/commands/pathway.d.ts.map +1 -0
- package/dist/commands/pathway.js +977 -0
- package/dist/commands/pathway.js.map +1 -0
- package/dist/commands/persona.d.ts +3 -0
- package/dist/commands/persona.d.ts.map +1 -0
- package/dist/commands/persona.js +234 -0
- package/dist/commands/persona.js.map +1 -0
- package/dist/commands/release.d.ts +3 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +67 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/secret.d.ts +3 -0
- package/dist/commands/secret.d.ts.map +1 -0
- package/dist/commands/secret.js +57 -0
- package/dist/commands/secret.js.map +1 -0
- package/dist/commands/sip.d.ts +3 -0
- package/dist/commands/sip.d.ts.map +1 -0
- package/dist/commands/sip.js +45 -0
- package/dist/commands/sip.js.map +1 -0
- package/dist/commands/sms.d.ts +3 -0
- package/dist/commands/sms.d.ts.map +1 -0
- package/dist/commands/sms.js +83 -0
- package/dist/commands/sms.js.map +1 -0
- package/dist/commands/tool.d.ts +3 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +200 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/voice.d.ts +3 -0
- package/dist/commands/voice.d.ts.map +1 -0
- package/dist/commands/voice.js +95 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/commands/widget.d.ts +3 -0
- package/dist/commands/widget.d.ts.map +1 -0
- package/dist/commands/widget.js +77 -0
- package/dist/commands/widget.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +17 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +89 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +117 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +43 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/output.d.ts +30 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +131 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pathway-file.d.ts +31 -0
- package/dist/lib/pathway-file.d.ts.map +1 -0
- package/dist/lib/pathway-file.js +236 -0
- package/dist/lib/pathway-file.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +375 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/types/api.d.ts +302 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/config.d.ts +14 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/pathway.d.ts +55 -0
- package/dist/types/pathway.d.ts.map +1 -0
- package/dist/types/pathway.js +2 -0
- package/dist/types/pathway.js.map +1 -0
- package/package.json +51 -0
- package/templates/pathway.yaml +30 -0
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { getApiKey, getBaseUrl } from "./config.js";
|
|
2
|
+
import { BlandError, AuthError } from "./errors.js";
|
|
3
|
+
function buildUrl(path, query) {
|
|
4
|
+
const base = getBaseUrl().replace(/\/$/, "");
|
|
5
|
+
const cleanPath = path.startsWith("/") ? path : `/${path}`;
|
|
6
|
+
const url = new URL(`${base}${cleanPath}`);
|
|
7
|
+
if (query) {
|
|
8
|
+
for (const [key, val] of Object.entries(query)) {
|
|
9
|
+
if (val !== undefined && val !== null) {
|
|
10
|
+
url.searchParams.set(key, String(val));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return url.toString();
|
|
15
|
+
}
|
|
16
|
+
export async function request(path, options = {}) {
|
|
17
|
+
const { method = "GET", body, query, headers: extraHeaders } = options;
|
|
18
|
+
let apiKey;
|
|
19
|
+
try {
|
|
20
|
+
apiKey = getApiKey();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new AuthError();
|
|
24
|
+
}
|
|
25
|
+
const url = buildUrl(path, query);
|
|
26
|
+
const headers = {
|
|
27
|
+
authorization: apiKey,
|
|
28
|
+
...extraHeaders,
|
|
29
|
+
};
|
|
30
|
+
const fetchOptions = {
|
|
31
|
+
method,
|
|
32
|
+
headers,
|
|
33
|
+
};
|
|
34
|
+
if (body) {
|
|
35
|
+
if (body instanceof FormData) {
|
|
36
|
+
fetchOptions.body = body;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
headers["content-type"] = "application/json";
|
|
40
|
+
fetchOptions.body = JSON.stringify(body);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let response;
|
|
44
|
+
try {
|
|
45
|
+
response = await fetch(url, fetchOptions);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new BlandError(`Network error: ${err instanceof Error ? err.message : "Failed to connect to Bland API"}`);
|
|
49
|
+
}
|
|
50
|
+
if (response.status === 401) {
|
|
51
|
+
throw new AuthError("Invalid API key. Run `bland auth login` to re-authenticate.");
|
|
52
|
+
}
|
|
53
|
+
let data;
|
|
54
|
+
const contentType = response.headers.get("content-type") || "";
|
|
55
|
+
if (contentType.includes("application/json")) {
|
|
56
|
+
data = await response.json();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const text = await response.text();
|
|
60
|
+
try {
|
|
61
|
+
data = JSON.parse(text);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new BlandError(`API error (${response.status}): ${text}`);
|
|
66
|
+
}
|
|
67
|
+
return text;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Handle Bland's { data, errors } response pattern
|
|
71
|
+
const apiResponse = data;
|
|
72
|
+
if (apiResponse.errors && apiResponse.errors.length > 0) {
|
|
73
|
+
throw new BlandError(apiResponse.errors.map((e) => e.message).join("; "), response.status, apiResponse.errors);
|
|
74
|
+
}
|
|
75
|
+
// Some endpoints return data directly, others wrap in { data }
|
|
76
|
+
if (apiResponse.data !== undefined) {
|
|
77
|
+
return apiResponse.data;
|
|
78
|
+
}
|
|
79
|
+
return data;
|
|
80
|
+
}
|
|
81
|
+
// Convenience methods
|
|
82
|
+
export const api = {
|
|
83
|
+
get: (path, query) => request(path, { method: "GET", query }),
|
|
84
|
+
post: (path, body) => request(path, { method: "POST", body }),
|
|
85
|
+
put: (path, body) => request(path, { method: "PUT", body }),
|
|
86
|
+
patch: (path, body) => request(path, { method: "PATCH", body }),
|
|
87
|
+
delete: (path) => request(path, { method: "DELETE" }),
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWpD,SAAS,QAAQ,CACf,IAAY,EACZ,KAA6D;IAE7D,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;IAE3C,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACtC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,UAA0B,EAAE;IAE5B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEvE,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,MAAM;QACrB,GAAG,YAAY;KAChB,CAAC;IAEF,MAAM,YAAY,GAAgB;QAChC,MAAM;QACN,OAAO;KACR,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAClB,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAC1F,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,SAAS,CACjB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,UAAU,CAAC,cAAc,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,IAAoB,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,WAAW,GAAG,IAAsB,CAAC;IAC3C,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,UAAU,CAClB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7D,QAAQ,CAAC,MAAM,EACf,WAAW,CAAC,MAAM,CACnB,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC,IAAS,CAAC;IAC/B,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,sBAAsB;AACtB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,GAAG,EAAE,CACH,IAAY,EACZ,KAA6D,EAC7D,EAAE,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAE/C,IAAI,EAAE,CAAc,IAAY,EAAE,IAA8B,EAAE,EAAE,CAClE,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE5C,GAAG,EAAE,CAAc,IAAY,EAAE,IAA8B,EAAE,EAAE,CACjE,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE3C,KAAK,EAAE,CAAc,IAAY,EAAE,IAA8B,EAAE,EAAE,CACnE,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAE7C,MAAM,EAAE,CAAc,IAAY,EAAE,EAAE,CACpC,OAAO,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;CACzC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Profile, ProjectConfig } from "../types/config.js";
|
|
2
|
+
export declare function getProfiles(): Record<string, Profile>;
|
|
3
|
+
export declare function getCurrentProfileName(): string;
|
|
4
|
+
export declare function getCurrentProfile(): Profile;
|
|
5
|
+
export declare function setProfile(name: string, profile: Profile): void;
|
|
6
|
+
export declare function switchProfile(name: string): void;
|
|
7
|
+
export declare function deleteProfile(name: string): void;
|
|
8
|
+
export declare function getApiKey(): string;
|
|
9
|
+
export declare function getBaseUrl(): string;
|
|
10
|
+
export declare function saveApiKey(key: string, profileName?: string, baseUrl?: string): void;
|
|
11
|
+
export declare function clearAuth(): void;
|
|
12
|
+
export declare function isAuthenticated(): boolean;
|
|
13
|
+
export declare function findProjectConfig(startDir?: string): string | null;
|
|
14
|
+
export declare function readProjectConfig(dir?: string): ProjectConfig | null;
|
|
15
|
+
export declare function writeProjectConfig(config: ProjectConfig, dir?: string): void;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAe9E,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAI/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CASnC;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,WAAW,SAAY,EACvB,OAAO,SAAmB,GACzB,IAAI,CAGN;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,SAAgB,GAAG,MAAM,GAAG,IAAI,CAYzE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,SAAgB,GAAG,aAAa,GAAG,IAAI,CAS3E;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,GAAG,SAAgB,GAClB,IAAI,CAGN"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import Conf from "conf";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import * as yaml from "yaml";
|
|
5
|
+
import { AuthError } from "./errors.js";
|
|
6
|
+
const DEFAULT_BASE_URL = "https://api.bland.ai";
|
|
7
|
+
const store = new Conf({
|
|
8
|
+
projectName: "bland-cli",
|
|
9
|
+
defaults: {
|
|
10
|
+
current_profile: "default",
|
|
11
|
+
profiles: {},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
// ── Profile Management ──
|
|
15
|
+
export function getProfiles() {
|
|
16
|
+
return store.get("profiles");
|
|
17
|
+
}
|
|
18
|
+
export function getCurrentProfileName() {
|
|
19
|
+
return store.get("current_profile");
|
|
20
|
+
}
|
|
21
|
+
export function getCurrentProfile() {
|
|
22
|
+
const name = getCurrentProfileName();
|
|
23
|
+
const profiles = getProfiles();
|
|
24
|
+
const profile = profiles[name];
|
|
25
|
+
if (!profile) {
|
|
26
|
+
throw new AuthError();
|
|
27
|
+
}
|
|
28
|
+
return profile;
|
|
29
|
+
}
|
|
30
|
+
export function setProfile(name, profile) {
|
|
31
|
+
const profiles = getProfiles();
|
|
32
|
+
profiles[name] = profile;
|
|
33
|
+
store.set("profiles", profiles);
|
|
34
|
+
}
|
|
35
|
+
export function switchProfile(name) {
|
|
36
|
+
const profiles = getProfiles();
|
|
37
|
+
if (!profiles[name]) {
|
|
38
|
+
throw new AuthError(`Profile "${name}" not found.`);
|
|
39
|
+
}
|
|
40
|
+
store.set("current_profile", name);
|
|
41
|
+
}
|
|
42
|
+
export function deleteProfile(name) {
|
|
43
|
+
const profiles = getProfiles();
|
|
44
|
+
delete profiles[name];
|
|
45
|
+
store.set("profiles", profiles);
|
|
46
|
+
if (getCurrentProfileName() === name) {
|
|
47
|
+
const remaining = Object.keys(profiles);
|
|
48
|
+
store.set("current_profile", remaining[0] || "default");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function getApiKey() {
|
|
52
|
+
// Environment variable takes precedence
|
|
53
|
+
if (process.env.BLAND_API_KEY) {
|
|
54
|
+
return process.env.BLAND_API_KEY;
|
|
55
|
+
}
|
|
56
|
+
return getCurrentProfile().api_key;
|
|
57
|
+
}
|
|
58
|
+
export function getBaseUrl() {
|
|
59
|
+
if (process.env.BLAND_BASE_URL) {
|
|
60
|
+
return process.env.BLAND_BASE_URL;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
return getCurrentProfile().base_url || DEFAULT_BASE_URL;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return DEFAULT_BASE_URL;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function saveApiKey(key, profileName = "default", baseUrl = DEFAULT_BASE_URL) {
|
|
70
|
+
setProfile(profileName, { api_key: key, base_url: baseUrl });
|
|
71
|
+
store.set("current_profile", profileName);
|
|
72
|
+
}
|
|
73
|
+
export function clearAuth() {
|
|
74
|
+
store.clear();
|
|
75
|
+
}
|
|
76
|
+
export function isAuthenticated() {
|
|
77
|
+
try {
|
|
78
|
+
getApiKey();
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ── Project Config (.blandrc in project directory) ──
|
|
86
|
+
const PROJECT_CONFIG_NAME = ".blandrc";
|
|
87
|
+
export function findProjectConfig(startDir = process.cwd()) {
|
|
88
|
+
let dir = startDir;
|
|
89
|
+
while (true) {
|
|
90
|
+
const configPath = path.join(dir, PROJECT_CONFIG_NAME);
|
|
91
|
+
if (fs.existsSync(configPath)) {
|
|
92
|
+
return configPath;
|
|
93
|
+
}
|
|
94
|
+
const parent = path.dirname(dir);
|
|
95
|
+
if (parent === dir)
|
|
96
|
+
break;
|
|
97
|
+
dir = parent;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
export function readProjectConfig(dir = process.cwd()) {
|
|
102
|
+
const configPath = findProjectConfig(dir);
|
|
103
|
+
if (!configPath)
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
107
|
+
return yaml.parse(content);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function writeProjectConfig(config, dir = process.cwd()) {
|
|
114
|
+
const configPath = path.join(dir, PROJECT_CONFIG_NAME);
|
|
115
|
+
fs.writeFileSync(configPath, yaml.stringify(config), "utf-8");
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ApiError } from "../types/api.js";
|
|
2
|
+
export declare class BlandError extends Error {
|
|
3
|
+
statusCode?: number | undefined;
|
|
4
|
+
apiErrors?: ApiError[] | undefined;
|
|
5
|
+
constructor(message: string, statusCode?: number | undefined, apiErrors?: ApiError[] | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare class AuthError extends BlandError {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class NotFoundError extends BlandError {
|
|
11
|
+
constructor(resource: string, id: string);
|
|
12
|
+
}
|
|
13
|
+
export declare function formatError(err: unknown): string;
|
|
14
|
+
export declare function handleError(err: unknown): never;
|
|
15
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,UAAW,SAAQ,KAAK;IAG1B,UAAU,CAAC,EAAE,MAAM;IACnB,SAAS,CAAC,EAAE,QAAQ,EAAE;gBAF7B,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAA;CAKhC;AAED,qBAAa,SAAU,SAAQ,UAAU;gBAC3B,OAAO,SAAqD;CAIzE;AAED,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CAIzC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAgBhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAG/C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export class BlandError extends Error {
|
|
3
|
+
statusCode;
|
|
4
|
+
apiErrors;
|
|
5
|
+
constructor(message, statusCode, apiErrors) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
this.apiErrors = apiErrors;
|
|
9
|
+
this.name = "BlandError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class AuthError extends BlandError {
|
|
13
|
+
constructor(message = "Not authenticated. Run `bland auth login` first.") {
|
|
14
|
+
super(message, 401);
|
|
15
|
+
this.name = "AuthError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class NotFoundError extends BlandError {
|
|
19
|
+
constructor(resource, id) {
|
|
20
|
+
super(`${resource} "${id}" not found.`, 404);
|
|
21
|
+
this.name = "NotFoundError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function formatError(err) {
|
|
25
|
+
if (err instanceof BlandError) {
|
|
26
|
+
let msg = chalk.red(`Error: ${err.message}`);
|
|
27
|
+
if (err.apiErrors?.length) {
|
|
28
|
+
for (const e of err.apiErrors) {
|
|
29
|
+
msg += `\n ${chalk.dim(e.error)}: ${e.message}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return msg;
|
|
33
|
+
}
|
|
34
|
+
if (err instanceof Error) {
|
|
35
|
+
return chalk.red(`Error: ${err.message}`);
|
|
36
|
+
}
|
|
37
|
+
return chalk.red(`Error: ${String(err)}`);
|
|
38
|
+
}
|
|
39
|
+
export function handleError(err) {
|
|
40
|
+
console.error(formatError(err));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,UAAW,SAAQ,KAAK;IAG1B;IACA;IAHT,YACE,OAAe,EACR,UAAmB,EACnB,SAAsB;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAS;QACnB,cAAS,GAAT,SAAS,CAAa;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAO,GAAG,kDAAkD;QACtE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C,YAAY,QAAgB,EAAE,EAAU;QACtC,KAAK,CAAC,GAAG,QAAQ,KAAK,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC9B,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface Column {
|
|
2
|
+
key: string;
|
|
3
|
+
header: string;
|
|
4
|
+
width?: number;
|
|
5
|
+
format?: (value: unknown) => string;
|
|
6
|
+
}
|
|
7
|
+
/** Print data as a formatted table */
|
|
8
|
+
export declare function table<T extends Record<string, unknown>>(data: T[], columns: Column[]): void;
|
|
9
|
+
/** Print JSON output (for --json flag) */
|
|
10
|
+
export declare function json(data: unknown): void;
|
|
11
|
+
/** Print a key-value detail view */
|
|
12
|
+
export declare function detail(pairs: [string, unknown][], indent?: number): void;
|
|
13
|
+
/** Print a success message */
|
|
14
|
+
export declare function success(message: string): void;
|
|
15
|
+
/** Print a warning */
|
|
16
|
+
export declare function warn(message: string): void;
|
|
17
|
+
/** Print an info message */
|
|
18
|
+
export declare function info(message: string): void;
|
|
19
|
+
/** Print a header/title */
|
|
20
|
+
export declare function header(text: string): void;
|
|
21
|
+
/** Format a duration in seconds to human readable */
|
|
22
|
+
export declare function formatDuration(seconds: number): string;
|
|
23
|
+
/** Format a phone number for display */
|
|
24
|
+
export declare function formatPhone(phone: string): string;
|
|
25
|
+
/** Format a date string for display */
|
|
26
|
+
export declare function formatDate(dateStr: string): string;
|
|
27
|
+
/** Truncate text with ellipsis */
|
|
28
|
+
export declare function truncate(text: string, maxLen: number): string;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,UAAU,MAAM;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,sCAAsC;AACtC,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrD,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE,MAAM,EAAE,GAChB,IAAI,CA0CN;AAED,0CAA0C;AAC1C,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAExC;AAED,oCAAoC;AACpC,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC1B,MAAM,SAAI,GACT,IAAI,CASN;AAcD,8BAA8B;AAC9B,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,sBAAsB;AACtB,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,2BAA2B;AAC3B,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG7D"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
/** Print data as a formatted table */
|
|
3
|
+
export function table(data, columns) {
|
|
4
|
+
if (data.length === 0) {
|
|
5
|
+
console.log(chalk.dim(" No results found."));
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
// Calculate column widths
|
|
9
|
+
const widths = columns.map((col) => {
|
|
10
|
+
if (col.width)
|
|
11
|
+
return col.width;
|
|
12
|
+
const headerLen = col.header.length;
|
|
13
|
+
const maxDataLen = data.reduce((max, row) => {
|
|
14
|
+
const val = col.format
|
|
15
|
+
? col.format(row[col.key])
|
|
16
|
+
: String(row[col.key] ?? "");
|
|
17
|
+
return Math.max(max, val.length);
|
|
18
|
+
}, 0);
|
|
19
|
+
return Math.min(Math.max(headerLen, maxDataLen) + 2, 50);
|
|
20
|
+
});
|
|
21
|
+
// Print header
|
|
22
|
+
const headerLine = columns
|
|
23
|
+
.map((col, i) => chalk.bold(col.header.padEnd(widths[i])))
|
|
24
|
+
.join(" ");
|
|
25
|
+
console.log(headerLine);
|
|
26
|
+
console.log(columns
|
|
27
|
+
.map((_, i) => chalk.dim("─".repeat(widths[i])))
|
|
28
|
+
.join(" "));
|
|
29
|
+
// Print rows
|
|
30
|
+
for (const row of data) {
|
|
31
|
+
const line = columns
|
|
32
|
+
.map((col, i) => {
|
|
33
|
+
const val = col.format
|
|
34
|
+
? col.format(row[col.key])
|
|
35
|
+
: String(row[col.key] ?? "");
|
|
36
|
+
return val.padEnd(widths[i]).slice(0, widths[i]);
|
|
37
|
+
})
|
|
38
|
+
.join(" ");
|
|
39
|
+
console.log(line);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Print JSON output (for --json flag) */
|
|
43
|
+
export function json(data) {
|
|
44
|
+
console.log(JSON.stringify(data, null, 2));
|
|
45
|
+
}
|
|
46
|
+
/** Print a key-value detail view */
|
|
47
|
+
export function detail(pairs, indent = 2) {
|
|
48
|
+
const pad = " ".repeat(indent);
|
|
49
|
+
const maxKeyLen = Math.max(...pairs.map(([k]) => k.length));
|
|
50
|
+
for (const [key, value] of pairs) {
|
|
51
|
+
const formattedKey = chalk.bold(key.padEnd(maxKeyLen));
|
|
52
|
+
const formattedVal = formatValue(value);
|
|
53
|
+
console.log(`${pad}${formattedKey} ${formattedVal}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatValue(value) {
|
|
57
|
+
if (value === null || value === undefined)
|
|
58
|
+
return chalk.dim("—");
|
|
59
|
+
if (typeof value === "boolean")
|
|
60
|
+
return value ? chalk.green("yes") : chalk.red("no");
|
|
61
|
+
if (typeof value === "number")
|
|
62
|
+
return chalk.cyan(String(value));
|
|
63
|
+
if (value instanceof Date)
|
|
64
|
+
return chalk.yellow(value.toISOString());
|
|
65
|
+
if (Array.isArray(value))
|
|
66
|
+
return value.length === 0 ? chalk.dim("[]") : value.join(", ");
|
|
67
|
+
if (typeof value === "object")
|
|
68
|
+
return JSON.stringify(value);
|
|
69
|
+
return String(value);
|
|
70
|
+
}
|
|
71
|
+
/** Print a success message */
|
|
72
|
+
export function success(message) {
|
|
73
|
+
console.log(`${chalk.green("✓")} ${message}`);
|
|
74
|
+
}
|
|
75
|
+
/** Print a warning */
|
|
76
|
+
export function warn(message) {
|
|
77
|
+
console.log(`${chalk.yellow("⚠")} ${message}`);
|
|
78
|
+
}
|
|
79
|
+
/** Print an info message */
|
|
80
|
+
export function info(message) {
|
|
81
|
+
console.log(`${chalk.blue("ℹ")} ${message}`);
|
|
82
|
+
}
|
|
83
|
+
/** Print a header/title */
|
|
84
|
+
export function header(text) {
|
|
85
|
+
console.log();
|
|
86
|
+
console.log(chalk.bold(text));
|
|
87
|
+
console.log(chalk.dim("─".repeat(text.length)));
|
|
88
|
+
}
|
|
89
|
+
/** Format a duration in seconds to human readable */
|
|
90
|
+
export function formatDuration(seconds) {
|
|
91
|
+
if (seconds < 60)
|
|
92
|
+
return `${Math.round(seconds)}s`;
|
|
93
|
+
const mins = Math.floor(seconds / 60);
|
|
94
|
+
const secs = Math.round(seconds % 60);
|
|
95
|
+
if (mins < 60)
|
|
96
|
+
return `${mins}m ${secs}s`;
|
|
97
|
+
const hrs = Math.floor(mins / 60);
|
|
98
|
+
const remainMins = mins % 60;
|
|
99
|
+
return `${hrs}h ${remainMins}m`;
|
|
100
|
+
}
|
|
101
|
+
/** Format a phone number for display */
|
|
102
|
+
export function formatPhone(phone) {
|
|
103
|
+
if (!phone)
|
|
104
|
+
return chalk.dim("—");
|
|
105
|
+
// Simple US format
|
|
106
|
+
const clean = phone.replace(/\D/g, "");
|
|
107
|
+
if (clean.length === 11 && clean.startsWith("1")) {
|
|
108
|
+
return `+1 (${clean.slice(1, 4)}) ${clean.slice(4, 7)}-${clean.slice(7)}`;
|
|
109
|
+
}
|
|
110
|
+
return phone;
|
|
111
|
+
}
|
|
112
|
+
/** Format a date string for display */
|
|
113
|
+
export function formatDate(dateStr) {
|
|
114
|
+
if (!dateStr)
|
|
115
|
+
return chalk.dim("—");
|
|
116
|
+
const d = new Date(dateStr);
|
|
117
|
+
return d.toLocaleDateString("en-US", {
|
|
118
|
+
month: "short",
|
|
119
|
+
day: "numeric",
|
|
120
|
+
year: "numeric",
|
|
121
|
+
hour: "2-digit",
|
|
122
|
+
minute: "2-digit",
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** Truncate text with ellipsis */
|
|
126
|
+
export function truncate(text, maxLen) {
|
|
127
|
+
if (text.length <= maxLen)
|
|
128
|
+
return text;
|
|
129
|
+
return text.slice(0, maxLen - 1) + "…";
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { PathwayFile } from "../types/pathway.js";
|
|
2
|
+
import type { Pathway, PathwayNode, PathwayEdge } from "../types/api.js";
|
|
3
|
+
/** Find pathway file in a directory */
|
|
4
|
+
export declare function findPathwayFile(dir: string): string | null;
|
|
5
|
+
/** Read and parse a local pathway file */
|
|
6
|
+
export declare function readPathwayFile(filePath: string): PathwayFile;
|
|
7
|
+
/** Write a pathway file to disk */
|
|
8
|
+
export declare function writePathwayFile(filePath: string, pathway: PathwayFile): void;
|
|
9
|
+
/** Convert API pathway response to local file format */
|
|
10
|
+
export declare function apiToFile(pathway: Pathway): PathwayFile;
|
|
11
|
+
/** Convert local file format to API request body */
|
|
12
|
+
export declare function fileToApi(file: PathwayFile): {
|
|
13
|
+
name: string;
|
|
14
|
+
nodes: PathwayNode[];
|
|
15
|
+
edges: PathwayEdge[];
|
|
16
|
+
};
|
|
17
|
+
/** Create a starter pathway file */
|
|
18
|
+
export declare function createStarterPathway(name: string): PathwayFile;
|
|
19
|
+
/** Create a starter test cases file */
|
|
20
|
+
export declare function createStarterTestCases(pathwayName: string): PathwayTestCasesFile;
|
|
21
|
+
interface PathwayTestCasesFile {
|
|
22
|
+
pathway: string;
|
|
23
|
+
tests: Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
scenario: string;
|
|
26
|
+
expected_path?: string[];
|
|
27
|
+
expected_variables?: Record<string, unknown>;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=pathway-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathway-file.d.ts","sourceRoot":"","sources":["../../src/lib/pathway-file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAWzB,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1D;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAiB7D;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,IAAI,CAoBN;AA0BD,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAwDvD;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CACvB,IAAI,EAAE,WAAW,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAuD9D;AAED,oCAAoC;AACpC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAsC9D;AAED,uCAAuC;AACvC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAYhF;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC,CAAC;CACJ"}
|