@statechange/xano-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -0
- package/dist/auth.d.ts +22 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +94 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/audit.d.ts +6 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +316 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +179 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/health.d.ts +6 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +115 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/history.d.ts +6 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +250 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/inventory.d.ts +6 -0
- package/dist/commands/inventory.d.ts.map +1 -0
- package/dist/commands/inventory.js +282 -0
- package/dist/commands/inventory.js.map +1 -0
- package/dist/commands/logs.d.ts +6 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +411 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/performance.d.ts +6 -0
- package/dist/commands/performance.d.ts.map +1 -0
- package/dist/commands/performance.js +520 -0
- package/dist/commands/performance.js.map +1 -0
- package/dist/commands/secure.d.ts +6 -0
- package/dist/commands/secure.d.ts.map +1 -0
- package/dist/commands/secure.js +52 -0
- package/dist/commands/secure.js.map +1 -0
- package/dist/commands/xanoscript.d.ts +6 -0
- package/dist/commands/xanoscript.d.ts.map +1 -0
- package/dist/commands/xanoscript.js +216 -0
- package/dist/commands/xanoscript.js.map +1 -0
- package/dist/commands/xray.d.ts +6 -0
- package/dist/commands/xray.d.ts.map +1 -0
- package/dist/commands/xray.js +194 -0
- package/dist/commands/xray.js.map +1 -0
- package/dist/format.d.ts +10 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +59 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/performance/load-analysis.d.ts +33 -0
- package/dist/performance/load-analysis.d.ts.map +1 -0
- package/dist/performance/load-analysis.js +290 -0
- package/dist/performance/load-analysis.js.map +1 -0
- package/dist/performance/stack-rollup.d.ts +57 -0
- package/dist/performance/stack-rollup.d.ts.map +1 -0
- package/dist/performance/stack-rollup.js +108 -0
- package/dist/performance/stack-rollup.js.map +1 -0
- package/dist/registry-client.d.ts +81 -0
- package/dist/registry-client.d.ts.map +1 -0
- package/dist/registry-client.js +333 -0
- package/dist/registry-client.js.map +1 -0
- package/dist/xano-client.d.ts +103 -0
- package/dist/xano-client.d.ts.map +1 -0
- package/dist/xano-client.js +399 -0
- package/dist/xano-client.js.map +1 -0
- package/package.json +49 -0
- package/skills/performance-analysis/SKILL.md +135 -0
- package/skills/xano-cli/SKILL.md +158 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateChange Backend Client - Fetch Xano token from StateChange backend
|
|
3
|
+
*/
|
|
4
|
+
import { getStateChangeApiKey, getAuthToken, loadAuthFromFile, saveAuthToFile } from "./auth.js";
|
|
5
|
+
import { XanoClient } from "./xano-client.js";
|
|
6
|
+
import { resolve as dnsResolve } from "dns/promises";
|
|
7
|
+
const STATECHANGE_BACKEND_URL = "https://api.statechange.ai/api:jKMCYXQa/";
|
|
8
|
+
// Token health thresholds
|
|
9
|
+
const STALE_THRESHOLD_MS = 60 * 60 * 1000; // warn when < 1h remaining
|
|
10
|
+
async function fetchWithAuth(path, options = {}, apiKey) {
|
|
11
|
+
// Exchange API key for auth token
|
|
12
|
+
const authToken = await getAuthToken(apiKey);
|
|
13
|
+
const url = `${STATECHANGE_BACKEND_URL}${path}`;
|
|
14
|
+
return fetch(url, {
|
|
15
|
+
...options,
|
|
16
|
+
headers: {
|
|
17
|
+
...(options.headers || {}),
|
|
18
|
+
Authorization: `Bearer ${authToken}`,
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function listXanoTokens(apiKey) {
|
|
24
|
+
const res = await fetchWithAuth("xano-tokens", { method: "GET" }, apiKey);
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const errorText = await res.text();
|
|
27
|
+
throw new Error(`Failed to list tokens: ${res.status} ${res.statusText} - ${errorText}`);
|
|
28
|
+
}
|
|
29
|
+
return (await res.json());
|
|
30
|
+
}
|
|
31
|
+
export async function getXanoToken(instanceId, apiKey) {
|
|
32
|
+
const res = await fetchWithAuth(`xano-tokens/${encodeURIComponent(instanceId)}`, { method: "GET" }, apiKey);
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
if (res.status === 404) {
|
|
35
|
+
throw new Error(`No token found for instance: ${instanceId}`);
|
|
36
|
+
}
|
|
37
|
+
const errorText = await res.text();
|
|
38
|
+
throw new Error(`Failed to get token: ${res.status} ${res.statusText} - ${errorText}`);
|
|
39
|
+
}
|
|
40
|
+
return (await res.json());
|
|
41
|
+
}
|
|
42
|
+
export async function getXanoMasterToken(apiKey) {
|
|
43
|
+
const res = await fetchWithAuth("xano-master-token", { method: "GET" }, apiKey);
|
|
44
|
+
if (!res.ok) {
|
|
45
|
+
const errorText = await res.text();
|
|
46
|
+
throw new Error(`Failed to get master token: ${res.status} ${res.statusText} - ${errorText}`);
|
|
47
|
+
}
|
|
48
|
+
return (await res.json());
|
|
49
|
+
}
|
|
50
|
+
export async function resolveMasterToken(options) {
|
|
51
|
+
// Direct token takes precedence
|
|
52
|
+
if (options.token)
|
|
53
|
+
return options.token;
|
|
54
|
+
// Environment variable
|
|
55
|
+
const envToken = process.env.XANO_MASTER_TOKEN;
|
|
56
|
+
if (envToken)
|
|
57
|
+
return envToken;
|
|
58
|
+
// Try StateChange backend
|
|
59
|
+
const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
|
|
60
|
+
if (apiKey) {
|
|
61
|
+
try {
|
|
62
|
+
const tokenData = await getXanoMasterToken(apiKey);
|
|
63
|
+
return tokenData.rawXanoToken;
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
// Silently fail and fall through
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve a custom domain to its underlying .xano.io hostname via CNAME.
|
|
73
|
+
* Xano admin APIs (api:mvp-admin) are only served on the raw hostname,
|
|
74
|
+
* not on custom domains.
|
|
75
|
+
*/
|
|
76
|
+
async function resolveXanoHostname(hostname) {
|
|
77
|
+
if (hostname.endsWith(".xano.io"))
|
|
78
|
+
return hostname;
|
|
79
|
+
try {
|
|
80
|
+
const records = await dnsResolve(hostname, "CNAME");
|
|
81
|
+
if (records.length > 0) {
|
|
82
|
+
// CNAME may have trailing dot, strip it
|
|
83
|
+
const cname = records[0].replace(/\.$/, "");
|
|
84
|
+
if (cname.endsWith(".xano.io"))
|
|
85
|
+
return cname;
|
|
86
|
+
// Could be chained (e.g. custom -> x.n7.xano.io -> n7.xano.io)
|
|
87
|
+
// The first xano.io CNAME is what we want
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
// No CNAME record — hostname might already be correct
|
|
92
|
+
}
|
|
93
|
+
return hostname;
|
|
94
|
+
}
|
|
95
|
+
// Cache the token list to avoid redundant API calls within the same CLI invocation
|
|
96
|
+
let cachedTokenList = null;
|
|
97
|
+
async function getTokenList(apiKey) {
|
|
98
|
+
if (cachedTokenList)
|
|
99
|
+
return cachedTokenList;
|
|
100
|
+
const response = await listXanoTokens(apiKey);
|
|
101
|
+
cachedTokenList = response.tokens || [];
|
|
102
|
+
return cachedTokenList;
|
|
103
|
+
}
|
|
104
|
+
function freshTokenList(apiKey) {
|
|
105
|
+
cachedTokenList = null;
|
|
106
|
+
return getTokenList(apiKey);
|
|
107
|
+
}
|
|
108
|
+
export function checkTokenHealth(token) {
|
|
109
|
+
const updatedAt = token.updated_at ?? token.updatedAt ?? 0;
|
|
110
|
+
const ttl = (token.ttl ?? 86400) * 1000; // seconds → ms
|
|
111
|
+
const expiresAt = updatedAt + ttl;
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
const ageHours = Math.round(((now - updatedAt) / 3600000) * 10) / 10;
|
|
114
|
+
const remainingMs = expiresAt - now;
|
|
115
|
+
const remainingHours = Math.round((remainingMs / 3600000) * 10) / 10;
|
|
116
|
+
if (updatedAt === 0) {
|
|
117
|
+
return { status: "unknown", updatedAt, ttl: token.ttl ?? 86400, expiresAt, ageHours, remainingHours, message: "Token age unknown" };
|
|
118
|
+
}
|
|
119
|
+
if (remainingMs > STALE_THRESHOLD_MS) {
|
|
120
|
+
return { status: "fresh", updatedAt, ttl: token.ttl ?? 86400, expiresAt, ageHours, remainingHours, message: "" };
|
|
121
|
+
}
|
|
122
|
+
if (remainingMs > 0) {
|
|
123
|
+
const mins = Math.floor(remainingMs / 60000);
|
|
124
|
+
return { status: "stale", updatedAt, ttl: token.ttl ?? 86400, expiresAt, ageHours, remainingHours, message: `Token expires in ${mins} minutes` };
|
|
125
|
+
}
|
|
126
|
+
const expiredAgo = Math.round((-remainingMs / 3600000) * 10) / 10;
|
|
127
|
+
return { status: "expired", updatedAt, ttl: token.ttl ?? 86400, expiresAt, ageHours, remainingHours, message: `Token expired ${expiredAgo} hours ago` };
|
|
128
|
+
}
|
|
129
|
+
export async function getTokenHealthForInstance(apiKey, instanceId) {
|
|
130
|
+
const tokens = await getTokenList(apiKey);
|
|
131
|
+
let token;
|
|
132
|
+
if (instanceId) {
|
|
133
|
+
token = tokens.find((t) => (t.instanceId || t.instance_id) === instanceId);
|
|
134
|
+
}
|
|
135
|
+
if (!token && tokens.length === 1) {
|
|
136
|
+
token = tokens[0];
|
|
137
|
+
}
|
|
138
|
+
if (!token)
|
|
139
|
+
return null;
|
|
140
|
+
return { token, health: checkTokenHealth(token) };
|
|
141
|
+
}
|
|
142
|
+
/** Print a refresh prompt and poll until the token is updated. Returns the fresh raw token. */
|
|
143
|
+
export async function waitForFreshToken(apiKey, instanceId, staleUpdatedAt, { timeoutMs = 300000, intervalMs = 5000 } = {}) {
|
|
144
|
+
console.error("");
|
|
145
|
+
console.error(" Your Xano session has expired.");
|
|
146
|
+
console.error(" To refresh it, open your Xano workspace in the browser");
|
|
147
|
+
console.error(" with the StateChange extension active:");
|
|
148
|
+
console.error("");
|
|
149
|
+
console.error(" https://app.xano.com");
|
|
150
|
+
console.error("");
|
|
151
|
+
console.error(" Waiting for token refresh... (Ctrl+C to cancel)");
|
|
152
|
+
console.error("");
|
|
153
|
+
const deadline = Date.now() + timeoutMs;
|
|
154
|
+
while (Date.now() < deadline) {
|
|
155
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
156
|
+
const tokens = await freshTokenList(apiKey);
|
|
157
|
+
const match = tokens.find((t) => (t.instanceId || t.instance_id) === instanceId);
|
|
158
|
+
if (match) {
|
|
159
|
+
const newUpdatedAt = match.updated_at ?? match.updatedAt ?? 0;
|
|
160
|
+
if (newUpdatedAt > staleUpdatedAt) {
|
|
161
|
+
const rawToken = match.rawXanoToken || match.raw_xano_token;
|
|
162
|
+
console.error(" Token refreshed! Continuing...");
|
|
163
|
+
console.error("");
|
|
164
|
+
return rawToken;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
throw new Error("Timed out waiting for token refresh. Please open Xano with the StateChange extension and try again.");
|
|
169
|
+
}
|
|
170
|
+
export async function resolveInstance(options) {
|
|
171
|
+
let hostname = "";
|
|
172
|
+
// Direct flag takes precedence
|
|
173
|
+
if (options.instance) {
|
|
174
|
+
hostname = options.instance;
|
|
175
|
+
}
|
|
176
|
+
// Environment variable
|
|
177
|
+
if (!hostname && process.env.XANO_INSTANCE) {
|
|
178
|
+
hostname = process.env.XANO_INSTANCE;
|
|
179
|
+
}
|
|
180
|
+
// Saved instance from auth config
|
|
181
|
+
const auth = loadAuthFromFile();
|
|
182
|
+
if (!hostname && auth?.xanoInstance) {
|
|
183
|
+
hostname = auth.xanoInstance;
|
|
184
|
+
}
|
|
185
|
+
// Try StateChange backend — auto-select if only one instance
|
|
186
|
+
if (!hostname) {
|
|
187
|
+
const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
|
|
188
|
+
if (apiKey) {
|
|
189
|
+
try {
|
|
190
|
+
const tokens = await getTokenList(apiKey);
|
|
191
|
+
if (tokens.length === 1) {
|
|
192
|
+
const t = tokens[0];
|
|
193
|
+
hostname = t.instanceId || t.instance_id || "";
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
// Silently fail
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (!hostname)
|
|
202
|
+
return "";
|
|
203
|
+
// Resolve custom domains to the real .xano.io hostname
|
|
204
|
+
// (admin APIs are only served on the raw Xano hostname)
|
|
205
|
+
hostname = await resolveXanoHostname(hostname);
|
|
206
|
+
// Cache the resolved hostname
|
|
207
|
+
if (auth && auth.xanoInstance !== hostname) {
|
|
208
|
+
auth.xanoInstance = hostname;
|
|
209
|
+
saveAuthToFile(auth);
|
|
210
|
+
}
|
|
211
|
+
return hostname;
|
|
212
|
+
}
|
|
213
|
+
export async function resolveWorkspace(options) {
|
|
214
|
+
if (options.workspace)
|
|
215
|
+
return parseInt(options.workspace);
|
|
216
|
+
if (process.env.XANO_WORKSPACE)
|
|
217
|
+
return parseInt(process.env.XANO_WORKSPACE);
|
|
218
|
+
// Saved workspace from auth config
|
|
219
|
+
const auth = loadAuthFromFile();
|
|
220
|
+
if (auth?.xanoWorkspace)
|
|
221
|
+
return auth.xanoWorkspace;
|
|
222
|
+
// Try from token list
|
|
223
|
+
const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
|
|
224
|
+
if (apiKey) {
|
|
225
|
+
try {
|
|
226
|
+
const tokens = await getTokenList(apiKey);
|
|
227
|
+
if (tokens.length === 1) {
|
|
228
|
+
const wsId = tokens[0].workspaceId || tokens[0].workspace_id;
|
|
229
|
+
if (wsId) {
|
|
230
|
+
if (auth) {
|
|
231
|
+
auth.xanoWorkspace = wsId;
|
|
232
|
+
saveAuthToFile(auth);
|
|
233
|
+
}
|
|
234
|
+
return wsId;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (e) {
|
|
239
|
+
// Silently fail
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
export async function resolveXanoToken(options) {
|
|
245
|
+
const { instance, token } = options;
|
|
246
|
+
// Direct token takes precedence (no health check — user-provided)
|
|
247
|
+
if (token)
|
|
248
|
+
return token;
|
|
249
|
+
// Environment variable token (no health check — user-managed)
|
|
250
|
+
const envToken = process.env.XANO_TOKEN;
|
|
251
|
+
if (envToken)
|
|
252
|
+
return envToken;
|
|
253
|
+
// Try StateChange backend if authenticated — find matching token from list
|
|
254
|
+
const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
|
|
255
|
+
if (apiKey) {
|
|
256
|
+
try {
|
|
257
|
+
const tokens = await getTokenList(apiKey);
|
|
258
|
+
// Find token matching the instance, handling both camelCase and snake_case
|
|
259
|
+
let match = tokens.find((t) => {
|
|
260
|
+
const id = t.instanceId || t.instance_id;
|
|
261
|
+
return id === instance;
|
|
262
|
+
});
|
|
263
|
+
// Fallback: if only one token, use it regardless of instance match
|
|
264
|
+
if (!match && tokens.length === 1) {
|
|
265
|
+
match = tokens[0];
|
|
266
|
+
}
|
|
267
|
+
if (match) {
|
|
268
|
+
const rawToken = match.rawXanoToken || match.raw_xano_token;
|
|
269
|
+
if (!rawToken)
|
|
270
|
+
return "";
|
|
271
|
+
// Health check: warn if token is stale/expired (but still try — Xano may accept it)
|
|
272
|
+
if (!options.skipHealthCheck) {
|
|
273
|
+
const health = checkTokenHealth(match);
|
|
274
|
+
if (health.status === "expired") {
|
|
275
|
+
console.error(`⚠️ Xano token looks expired (${health.message}). Will try anyway...`);
|
|
276
|
+
}
|
|
277
|
+
else if (health.status === "stale") {
|
|
278
|
+
console.error(`⚠️ ${health.message}. Consider opening Xano to refresh your session.`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return rawToken;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
// Silently fail and fall through
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return "";
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Resolve instance/workspace/token and create a XanoClient with auto-refresh on 401.
|
|
292
|
+
* Replaces the per-command makeClient() boilerplate.
|
|
293
|
+
*/
|
|
294
|
+
export async function makeClient(options) {
|
|
295
|
+
const instance = await resolveInstance({ instance: options.instance, apiKey: options.apiKey });
|
|
296
|
+
if (!instance) {
|
|
297
|
+
console.error("Error: Xano instance required (--instance or XANO_INSTANCE env var)");
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
const token = await resolveXanoToken({ instance, token: options.token, apiKey: options.apiKey });
|
|
301
|
+
if (!token) {
|
|
302
|
+
console.error("Error: Xano token required (--token, XANO_TOKEN, or StateChange backend via 'sc-xano auth init')");
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
const workspace = await resolveWorkspace({ workspace: options.workspace, apiKey: options.apiKey });
|
|
306
|
+
if (!workspace) {
|
|
307
|
+
console.error("Error: Workspace ID required (--workspace or XANO_WORKSPACE env var)");
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
const branchId = parseInt(options.branch || "0");
|
|
311
|
+
// Wire up 401 refresh: on Xano token rejection, poll SC backend for a fresh token
|
|
312
|
+
const apiKey = getStateChangeApiKey({ apiKey: options.apiKey });
|
|
313
|
+
const onTokenExpired = apiKey
|
|
314
|
+
? async () => {
|
|
315
|
+
// First, check if backend has a newer token already (e.g. user refreshed recently)
|
|
316
|
+
const tokens = await freshTokenList(apiKey);
|
|
317
|
+
const match = tokens.find((t) => (t.instanceId || t.instance_id) === instance) || (tokens.length === 1 ? tokens[0] : null);
|
|
318
|
+
if (!match)
|
|
319
|
+
throw new Error("No token found");
|
|
320
|
+
const matchInstance = match.instanceId || match.instance_id || instance;
|
|
321
|
+
const currentUpdatedAt = match.updated_at ?? match.updatedAt ?? 0;
|
|
322
|
+
// If the backend token is recent (updated in last 60s), just return it
|
|
323
|
+
if (Date.now() - currentUpdatedAt < 60000) {
|
|
324
|
+
return match.rawXanoToken || match.raw_xano_token || "";
|
|
325
|
+
}
|
|
326
|
+
// Otherwise, prompt user and poll for refresh
|
|
327
|
+
return await waitForFreshToken(apiKey, matchInstance, currentUpdatedAt);
|
|
328
|
+
}
|
|
329
|
+
: undefined;
|
|
330
|
+
const client = new XanoClient({ instance, token, onTokenExpired });
|
|
331
|
+
return { client, instance, workspace, branchId };
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=registry-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../src/registry-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Xano API Client - Portable version for CLI use
|
|
3
|
+
* Based on src/workers/xanoapi.ts
|
|
4
|
+
*/
|
|
5
|
+
export interface XanoClientConfig {
|
|
6
|
+
instance: string;
|
|
7
|
+
token: string;
|
|
8
|
+
}
|
|
9
|
+
/** Flush all sink caches (or a specific key) */
|
|
10
|
+
export declare function flushSinkCache(key?: string): void;
|
|
11
|
+
export declare class XanoClient {
|
|
12
|
+
private instance;
|
|
13
|
+
private token;
|
|
14
|
+
private onTokenExpired?;
|
|
15
|
+
constructor(config: XanoClientConfig & {
|
|
16
|
+
onTokenExpired?: () => Promise<string>;
|
|
17
|
+
});
|
|
18
|
+
/** Flush the sink cache (call after writes) */
|
|
19
|
+
flushCache(): void;
|
|
20
|
+
private getCached;
|
|
21
|
+
private setCache;
|
|
22
|
+
fetch(path: string, options?: RequestInit): Promise<Response>;
|
|
23
|
+
fetchJson<T = Record<string, any>>(path: string, options?: RequestInit, attempts?: number, attemptTimeout?: number): Promise<T>;
|
|
24
|
+
getWorkspaces(): Promise<Record<string, any>>;
|
|
25
|
+
getFunctions(workspaceId: number, branchId?: number): Promise<{
|
|
26
|
+
functions: any[];
|
|
27
|
+
}>;
|
|
28
|
+
/** Get a single function by plucking from the sink list */
|
|
29
|
+
getFunction(functionId: number, workspaceId?: number, branchId?: number): Promise<any>;
|
|
30
|
+
getAPIAppsAndQueries(workspaceId: number, branchId?: number): Promise<{
|
|
31
|
+
apps: any[];
|
|
32
|
+
queries: any[];
|
|
33
|
+
}>;
|
|
34
|
+
getApp(appId: number, branchId: number): Promise<Record<string, any>>;
|
|
35
|
+
updateApp(app: any): Promise<Record<string, any>>;
|
|
36
|
+
getQuery(queryId: number): Promise<Record<string, any>>;
|
|
37
|
+
updateQuery(query: any): Promise<Record<string, any>>;
|
|
38
|
+
updateTask(task: any): Promise<Record<string, any>>;
|
|
39
|
+
updateTrigger(trigger: any): Promise<Record<string, any>>;
|
|
40
|
+
getRequestHistory(workspaceId: number, page?: number, branchId?: number): Promise<{
|
|
41
|
+
curPage: number;
|
|
42
|
+
items: any[];
|
|
43
|
+
nextPage?: number;
|
|
44
|
+
}>;
|
|
45
|
+
getRequestHistoryForQuery(queryId: number, page?: number, branchId?: number): Promise<{
|
|
46
|
+
curPage: number;
|
|
47
|
+
items: any[];
|
|
48
|
+
nextPage?: number;
|
|
49
|
+
}>;
|
|
50
|
+
getRequest(requestId: number): Promise<Record<string, any>>;
|
|
51
|
+
getTasks(workspaceId: number, branchId?: number): Promise<any[]>;
|
|
52
|
+
getTaskHistory(taskId: number, page?: number): Promise<{
|
|
53
|
+
curPage: number;
|
|
54
|
+
items: any[];
|
|
55
|
+
nextPage?: number;
|
|
56
|
+
}>;
|
|
57
|
+
getTriggers(workspaceId: number, branchId?: number): Promise<any[]>;
|
|
58
|
+
getTriggerHistory(triggerId: number, branchId?: number, page?: number): Promise<{
|
|
59
|
+
curPage: number;
|
|
60
|
+
items: any[];
|
|
61
|
+
nextPage?: number;
|
|
62
|
+
}>;
|
|
63
|
+
getMCPServers(workspaceId: number, branchId?: number): Promise<any[]>;
|
|
64
|
+
getMCPServerHistory(toolId: number, branchId?: number, page?: number): Promise<{
|
|
65
|
+
curPage: number;
|
|
66
|
+
items: any[];
|
|
67
|
+
nextPage?: number;
|
|
68
|
+
}>;
|
|
69
|
+
getMiddleware(workspaceId: number, branchId?: number): Promise<any[]>;
|
|
70
|
+
getAddons(workspaceId: number, branchId?: number): Promise<any[]>;
|
|
71
|
+
getWorkspaceSink(workspaceId: number): Promise<{
|
|
72
|
+
dbos: any[];
|
|
73
|
+
workspace?: any;
|
|
74
|
+
branch?: any;
|
|
75
|
+
}>;
|
|
76
|
+
/** Get a single table by plucking from the workspace sink */
|
|
77
|
+
getTable(tableId: number, workspaceId?: number): Promise<any>;
|
|
78
|
+
getTaskHistoryItem(taskId: number, runId: number): Promise<any>;
|
|
79
|
+
generateXanoScript(workspaceId: number, data: any, kind: string): Promise<{
|
|
80
|
+
status: string;
|
|
81
|
+
payload: any;
|
|
82
|
+
}>;
|
|
83
|
+
convertXanoScript(workspaceId: number, script: string): Promise<{
|
|
84
|
+
status: string;
|
|
85
|
+
payload: any;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Xano Master API Client - for api:master endpoints on app.xano.com
|
|
90
|
+
*/
|
|
91
|
+
export interface MasterClientConfig {
|
|
92
|
+
token: string;
|
|
93
|
+
}
|
|
94
|
+
export declare class XanoMasterClient {
|
|
95
|
+
private token;
|
|
96
|
+
constructor(config: MasterClientConfig);
|
|
97
|
+
private fetchJson;
|
|
98
|
+
getInstances(): Promise<any[]>;
|
|
99
|
+
getInstanceDatabases(instanceId: number): Promise<any>;
|
|
100
|
+
clearInstanceDatabases(instanceId: number, tables: string[], force?: boolean): Promise<void>;
|
|
101
|
+
restartDeployment(instanceId: number, name: string): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=xano-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xano-client.d.ts","sourceRoot":"","sources":["../src/xano-client.ts"],"names":[],"mappings":"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"}
|