@xano/cli 1.0.6-beta.7 → 1.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/README.md +3 -61
- package/dist/base-command.d.ts +0 -2
- package/dist/base-command.js +4 -10
- package/dist/commands/release/pull/index.d.ts +6 -0
- package/dist/commands/release/pull/index.js +95 -10
- package/dist/commands/sandbox/pull/index.d.ts +1 -0
- package/dist/commands/sandbox/pull/index.js +77 -10
- package/dist/commands/tenant/pull/index.d.ts +6 -0
- package/dist/commands/tenant/pull/index.js +95 -10
- package/dist/commands/workspace/git/pull/index.js +3 -53
- package/dist/commands/workspace/pull/index.d.ts +6 -0
- package/dist/commands/workspace/pull/index.js +95 -10
- package/dist/utils/document-parser.d.ts +0 -85
- package/dist/utils/document-parser.js +1 -214
- package/dist/utils/knowledge-sync.d.ts +0 -1
- package/dist/utils/knowledge-sync.js +5 -11
- package/dist/utils/paging.d.ts +1 -2
- package/dist/utils/reference-checker.js +0 -13
- package/oclif.manifest.json +3174 -5182
- package/package.json +1 -10
- package/dist/commands/ephemeral/create/index.d.ts +0 -18
- package/dist/commands/ephemeral/create/index.js +0 -103
- package/dist/commands/ephemeral/delete/index.d.ts +0 -18
- package/dist/commands/ephemeral/delete/index.js +0 -99
- package/dist/commands/ephemeral/edit/index.d.ts +0 -18
- package/dist/commands/ephemeral/edit/index.js +0 -109
- package/dist/commands/ephemeral/get/index.d.ts +0 -21
- package/dist/commands/ephemeral/get/index.js +0 -125
- package/dist/commands/ephemeral/impersonate/index.d.ts +0 -20
- package/dist/commands/ephemeral/impersonate/index.js +0 -120
- package/dist/commands/ephemeral/list/index.d.ts +0 -19
- package/dist/commands/ephemeral/list/index.js +0 -123
- package/dist/commands/ephemeral/pull/index.d.ts +0 -19
- package/dist/commands/ephemeral/pull/index.js +0 -164
- package/dist/commands/ephemeral/push/index.d.ts +0 -25
- package/dist/commands/ephemeral/push/index.js +0 -144
- package/dist/commands/ephemeral/static_host/build/delete/index.d.ts +0 -20
- package/dist/commands/ephemeral/static_host/build/delete/index.js +0 -121
- package/dist/commands/ephemeral/static_host/build/get/index.d.ts +0 -18
- package/dist/commands/ephemeral/static_host/build/get/index.js +0 -137
- package/dist/commands/ephemeral/static_host/build/list/index.d.ts +0 -18
- package/dist/commands/ephemeral/static_host/build/list/index.js +0 -137
- package/dist/commands/ephemeral/static_host/build/pull/index.d.ts +0 -53
- package/dist/commands/ephemeral/static_host/build/pull/index.js +0 -308
- package/dist/commands/ephemeral/static_host/build/push/index.d.ts +0 -24
- package/dist/commands/ephemeral/static_host/build/push/index.js +0 -250
- package/dist/commands/ephemeral/static_host/create/index.d.ts +0 -18
- package/dist/commands/ephemeral/static_host/create/index.js +0 -92
- package/dist/commands/ephemeral/static_host/deploy/index.d.ts +0 -19
- package/dist/commands/ephemeral/static_host/deploy/index.js +0 -112
- package/dist/commands/ephemeral/static_host/edit/index.d.ts +0 -24
- package/dist/commands/ephemeral/static_host/edit/index.js +0 -158
- package/dist/commands/ephemeral/static_host/get/index.d.ts +0 -19
- package/dist/commands/ephemeral/static_host/get/index.js +0 -101
- package/dist/commands/ephemeral/static_host/list/index.d.ts +0 -17
- package/dist/commands/ephemeral/static_host/list/index.js +0 -132
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
3
|
-
export default class EphemeralStaticHostBuildDelete extends BaseCommand {
|
|
4
|
-
static args = {
|
|
5
|
-
tenant_name: Args.string({
|
|
6
|
-
description: 'Ephemeral tenant name',
|
|
7
|
-
required: true,
|
|
8
|
-
}),
|
|
9
|
-
};
|
|
10
|
-
static description = 'Delete a static host build for an ephemeral tenant permanently. This action cannot be undone.';
|
|
11
|
-
static examples = [
|
|
12
|
-
`$ xano ephemeral static_host build delete e4f2-9ab1-xyz1 --static-host default --build_id 52
|
|
13
|
-
Are you sure you want to delete build 52 from static host 'default'? This action cannot be undone. (y/N) y
|
|
14
|
-
Deleted build 52 from static host 'default'
|
|
15
|
-
`,
|
|
16
|
-
`$ xano ephemeral static_host build delete e4f2-9ab1-xyz1 -H default --build_id 52 --force
|
|
17
|
-
Deleted build 52 from static host 'default'
|
|
18
|
-
`,
|
|
19
|
-
`$ xano ephemeral static_host build delete e4f2-9ab1-xyz1 -H myhost --build_id 123 -w 40 -f
|
|
20
|
-
Deleted build 123 from static host 'myhost'
|
|
21
|
-
`,
|
|
22
|
-
`$ xano ephemeral static_host build delete e4f2-9ab1-xyz1 -H default --build_id 52 -f -o json`,
|
|
23
|
-
];
|
|
24
|
-
static flags = {
|
|
25
|
-
...BaseCommand.baseFlags,
|
|
26
|
-
build_id: Flags.string({
|
|
27
|
-
description: 'Build ID to delete',
|
|
28
|
-
required: true,
|
|
29
|
-
}),
|
|
30
|
-
force: Flags.boolean({
|
|
31
|
-
char: 'f',
|
|
32
|
-
default: false,
|
|
33
|
-
description: '[CRITICAL] NEVER run without explicit user confirmation. Skips the confirmation prompt.',
|
|
34
|
-
required: false,
|
|
35
|
-
}),
|
|
36
|
-
output: Flags.string({
|
|
37
|
-
char: 'o',
|
|
38
|
-
default: 'summary',
|
|
39
|
-
description: 'Output format',
|
|
40
|
-
options: ['summary', 'json'],
|
|
41
|
-
required: false,
|
|
42
|
-
}),
|
|
43
|
-
'static-host': Flags.string({
|
|
44
|
-
char: 'H',
|
|
45
|
-
description: 'Static host name',
|
|
46
|
-
required: true,
|
|
47
|
-
}),
|
|
48
|
-
workspace: Flags.string({
|
|
49
|
-
char: 'w',
|
|
50
|
-
description: 'Workspace ID (optional if set in profile)',
|
|
51
|
-
required: false,
|
|
52
|
-
}),
|
|
53
|
-
};
|
|
54
|
-
async run() {
|
|
55
|
-
const { args, flags } = await this.parse(EphemeralStaticHostBuildDelete);
|
|
56
|
-
const { profile, profileName } = this.resolveProfile(flags);
|
|
57
|
-
const tenantName = args.tenant_name;
|
|
58
|
-
const staticHost = flags['static-host'];
|
|
59
|
-
// Determine workspace_id from flag or profile
|
|
60
|
-
let workspaceId;
|
|
61
|
-
if (flags.workspace) {
|
|
62
|
-
workspaceId = flags.workspace;
|
|
63
|
-
}
|
|
64
|
-
else if (profile.workspace) {
|
|
65
|
-
workspaceId = profile.workspace;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this.error(`Workspace ID is required. Either:\n` +
|
|
69
|
-
` 1. Provide it as a flag: xano ephemeral static_host build delete <tenant_name> --static-host <static_host> --build_id <id> -w <workspace_id>\n` +
|
|
70
|
-
` 2. Set it in your profile using: xano profile edit ${profileName} -w <workspace_id>`);
|
|
71
|
-
}
|
|
72
|
-
if (!flags.force) {
|
|
73
|
-
const confirmed = await this.confirm(`Are you sure you want to delete build ${flags.build_id} from static host '${staticHost}'? This action cannot be undone.`);
|
|
74
|
-
if (!confirmed) {
|
|
75
|
-
this.log('Deletion cancelled.');
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const apiUrl = `${profile.instance_origin}/api:meta/workspace/${workspaceId}/tenant/${tenantName}/static_host/${staticHost}/build/${flags.build_id}`;
|
|
80
|
-
try {
|
|
81
|
-
const response = await this.verboseFetch(apiUrl, {
|
|
82
|
-
headers: {
|
|
83
|
-
'accept': 'application/json',
|
|
84
|
-
'Authorization': `Bearer ${profile.access_token}`,
|
|
85
|
-
},
|
|
86
|
-
method: 'DELETE',
|
|
87
|
-
}, flags.verbose, profile.access_token);
|
|
88
|
-
if (!response.ok) {
|
|
89
|
-
const errorText = await response.text();
|
|
90
|
-
this.error(`API request failed with status ${response.status}: ${response.statusText}\n${errorText}`);
|
|
91
|
-
}
|
|
92
|
-
if (flags.output === 'json') {
|
|
93
|
-
this.log(JSON.stringify({ build_id: flags.build_id, deleted: true, static_host: staticHost }, null, 2));
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
this.log(`Deleted build ${flags.build_id} from static host '${staticHost}'`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
if (error instanceof Error) {
|
|
101
|
-
this.error(`Failed to delete build: ${error.message}`);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
this.error(`Failed to delete build: ${String(error)}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
async confirm(message) {
|
|
109
|
-
const readline = await import('node:readline');
|
|
110
|
-
const rl = readline.createInterface({
|
|
111
|
-
input: process.stdin,
|
|
112
|
-
output: process.stdout,
|
|
113
|
-
});
|
|
114
|
-
return new Promise((resolve) => {
|
|
115
|
-
rl.question(`${message} (y/N) `, (answer) => {
|
|
116
|
-
rl.close();
|
|
117
|
-
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
2
|
-
export default class EphemeralStaticHostBuildGet extends BaseCommand {
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
6
|
-
static description: string;
|
|
7
|
-
static examples: string[];
|
|
8
|
-
static flags: {
|
|
9
|
-
build_id: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
'static-host': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
workspace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
-
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
-
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
-
};
|
|
17
|
-
run(): Promise<void>;
|
|
18
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
3
|
-
export default class EphemeralStaticHostBuildGet extends BaseCommand {
|
|
4
|
-
static args = {
|
|
5
|
-
tenant_name: Args.string({
|
|
6
|
-
description: 'Ephemeral tenant name',
|
|
7
|
-
required: true,
|
|
8
|
-
}),
|
|
9
|
-
};
|
|
10
|
-
static description = 'Get details of a specific build for a static host of an ephemeral tenant';
|
|
11
|
-
static examples = [
|
|
12
|
-
`$ xano ephemeral static_host build get e4f2-9ab1-xyz1 --static-host default --build_id 52
|
|
13
|
-
Build Details:
|
|
14
|
-
ID: 52
|
|
15
|
-
Name: v1.0.0
|
|
16
|
-
Status: completed
|
|
17
|
-
`,
|
|
18
|
-
`$ xano ephemeral static_host build get e4f2-9ab1-xyz1 -H default --build_id 52 -w 40
|
|
19
|
-
Build Details:
|
|
20
|
-
ID: 52
|
|
21
|
-
Name: v1.0.0
|
|
22
|
-
Status: completed
|
|
23
|
-
`,
|
|
24
|
-
`$ xano ephemeral static_host build get e4f2-9ab1-xyz1 -H myhost --build_id 123 --profile production
|
|
25
|
-
Build Details:
|
|
26
|
-
ID: 123
|
|
27
|
-
Name: production-build
|
|
28
|
-
`,
|
|
29
|
-
`$ xano ephemeral static_host build get e4f2-9ab1-xyz1 -H default --build_id 52 -o json
|
|
30
|
-
{
|
|
31
|
-
"id": 52,
|
|
32
|
-
"name": "v1.0.0",
|
|
33
|
-
"status": "completed"
|
|
34
|
-
}
|
|
35
|
-
`,
|
|
36
|
-
];
|
|
37
|
-
static flags = {
|
|
38
|
-
...BaseCommand.baseFlags,
|
|
39
|
-
build_id: Flags.string({
|
|
40
|
-
description: 'Build ID',
|
|
41
|
-
required: true,
|
|
42
|
-
}),
|
|
43
|
-
output: Flags.string({
|
|
44
|
-
char: 'o',
|
|
45
|
-
default: 'summary',
|
|
46
|
-
description: 'Output format',
|
|
47
|
-
options: ['summary', 'json'],
|
|
48
|
-
required: false,
|
|
49
|
-
}),
|
|
50
|
-
'static-host': Flags.string({
|
|
51
|
-
char: 'H',
|
|
52
|
-
description: 'Static host name',
|
|
53
|
-
required: true,
|
|
54
|
-
}),
|
|
55
|
-
workspace: Flags.string({
|
|
56
|
-
char: 'w',
|
|
57
|
-
description: 'Workspace ID (optional if set in profile)',
|
|
58
|
-
required: false,
|
|
59
|
-
}),
|
|
60
|
-
};
|
|
61
|
-
async run() {
|
|
62
|
-
const { args, flags } = await this.parse(EphemeralStaticHostBuildGet);
|
|
63
|
-
const { profile, profileName } = this.resolveProfile(flags);
|
|
64
|
-
const tenantName = args.tenant_name;
|
|
65
|
-
const staticHost = flags['static-host'];
|
|
66
|
-
// Determine workspace_id from flag or profile
|
|
67
|
-
let workspaceId;
|
|
68
|
-
if (flags.workspace) {
|
|
69
|
-
workspaceId = flags.workspace;
|
|
70
|
-
}
|
|
71
|
-
else if (profile.workspace) {
|
|
72
|
-
workspaceId = profile.workspace;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
this.error(`Workspace ID is required. Either:\n` +
|
|
76
|
-
` 1. Provide it as a flag: xano ephemeral static_host build get <tenant_name> --static-host <static_host> --build_id <id> -w <workspace_id>\n` +
|
|
77
|
-
` 2. Set it in your profile using: xano profile:edit ${profileName} -w <workspace_id>`);
|
|
78
|
-
}
|
|
79
|
-
// Construct the API URL
|
|
80
|
-
const apiUrl = `${profile.instance_origin}/api:meta/workspace/${workspaceId}/tenant/${tenantName}/static_host/${staticHost}/build/${flags.build_id}`;
|
|
81
|
-
// Fetch build from the API
|
|
82
|
-
try {
|
|
83
|
-
const response = await this.verboseFetch(apiUrl, {
|
|
84
|
-
headers: {
|
|
85
|
-
'accept': 'application/json',
|
|
86
|
-
'Authorization': `Bearer ${profile.access_token}`,
|
|
87
|
-
},
|
|
88
|
-
method: 'GET',
|
|
89
|
-
}, flags.verbose, profile.access_token);
|
|
90
|
-
if (!response.ok) {
|
|
91
|
-
const errorText = await response.text();
|
|
92
|
-
this.error(`API request failed with status ${response.status}: ${response.statusText}\n${errorText}`);
|
|
93
|
-
}
|
|
94
|
-
const build = await response.json();
|
|
95
|
-
// Validate response
|
|
96
|
-
if (!build || typeof build !== 'object') {
|
|
97
|
-
this.error('Unexpected API response format');
|
|
98
|
-
}
|
|
99
|
-
// Output results
|
|
100
|
-
if (flags.output === 'json') {
|
|
101
|
-
this.log(JSON.stringify(build, null, 2));
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
// summary format
|
|
105
|
-
this.log('Build Details:');
|
|
106
|
-
this.log(`ID: ${build.id}`);
|
|
107
|
-
this.log(`Name: ${build.name}`);
|
|
108
|
-
if (build.description) {
|
|
109
|
-
this.log(`Description: ${build.description}`);
|
|
110
|
-
}
|
|
111
|
-
if (build.status) {
|
|
112
|
-
this.log(`Status: ${build.status}`);
|
|
113
|
-
}
|
|
114
|
-
if (typeof build.file_count === 'number') {
|
|
115
|
-
this.log(`Files: ${build.file_count}`);
|
|
116
|
-
}
|
|
117
|
-
if (typeof build.file_bytes === 'number') {
|
|
118
|
-
this.log(`Size: ${build.file_bytes} bytes`);
|
|
119
|
-
}
|
|
120
|
-
if (build.created_at) {
|
|
121
|
-
this.log(`Created: ${build.created_at}`);
|
|
122
|
-
}
|
|
123
|
-
if (build.updated_at) {
|
|
124
|
-
this.log(`Updated: ${build.updated_at}`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
if (error instanceof Error) {
|
|
130
|
-
this.error(`Failed to fetch build: ${error.message}`);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.error(`Failed to fetch build: ${String(error)}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
2
|
-
export default class EphemeralStaticHostBuildList extends BaseCommand {
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
6
|
-
static description: string;
|
|
7
|
-
static examples: string[];
|
|
8
|
-
static flags: {
|
|
9
|
-
'static-host': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
workspace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
page: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
-
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
-
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
-
};
|
|
17
|
-
run(): Promise<void>;
|
|
18
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
3
|
-
import { buildPagingJson, buildPagingParams, formatPagingFooter, normalizeListResponse, pagingFlags } from '../../../../../utils/paging.js';
|
|
4
|
-
export default class EphemeralStaticHostBuildList extends BaseCommand {
|
|
5
|
-
static args = {
|
|
6
|
-
tenant_name: Args.string({
|
|
7
|
-
description: 'Ephemeral tenant name',
|
|
8
|
-
required: true,
|
|
9
|
-
}),
|
|
10
|
-
};
|
|
11
|
-
static description = 'List all builds for a static host of an ephemeral tenant';
|
|
12
|
-
static examples = [
|
|
13
|
-
`$ xano ephemeral static_host build list e4f2-9ab1-xyz1 --static-host default -w 40
|
|
14
|
-
Available builds:
|
|
15
|
-
- v1.0.0 (ID: 1) - Status: completed
|
|
16
|
-
- v1.0.1 (ID: 2) - Status: pending
|
|
17
|
-
`,
|
|
18
|
-
`$ xano ephemeral static_host build list e4f2-9ab1-xyz1 -H myhost --profile production
|
|
19
|
-
Available builds:
|
|
20
|
-
- production (ID: 1) - Status: completed
|
|
21
|
-
- staging (ID: 2) - Status: completed
|
|
22
|
-
`,
|
|
23
|
-
`$ xano ephemeral static_host build list e4f2-9ab1-xyz1 -H default -w 40 --output json
|
|
24
|
-
{
|
|
25
|
-
"count": 1,
|
|
26
|
-
"page": 1,
|
|
27
|
-
"total": 12,
|
|
28
|
-
"items": [
|
|
29
|
-
{
|
|
30
|
-
"id": 52
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
}
|
|
34
|
-
`,
|
|
35
|
-
`$ xano ephemeral static_host build list e4f2-9ab1-xyz1 -H default -p staging -o json --page 2
|
|
36
|
-
[
|
|
37
|
-
{
|
|
38
|
-
"id": 3,
|
|
39
|
-
"name": "v1.0.2"
|
|
40
|
-
}
|
|
41
|
-
]
|
|
42
|
-
`,
|
|
43
|
-
];
|
|
44
|
-
static flags = {
|
|
45
|
-
...BaseCommand.baseFlags,
|
|
46
|
-
output: Flags.string({
|
|
47
|
-
char: 'o',
|
|
48
|
-
default: 'summary',
|
|
49
|
-
description: 'Output format',
|
|
50
|
-
options: ['summary', 'json'],
|
|
51
|
-
required: false,
|
|
52
|
-
}),
|
|
53
|
-
...pagingFlags('page-only-envelope', { fixedPerPage: 100 }),
|
|
54
|
-
'static-host': Flags.string({
|
|
55
|
-
char: 'H',
|
|
56
|
-
description: 'Static host name',
|
|
57
|
-
required: true,
|
|
58
|
-
}),
|
|
59
|
-
workspace: Flags.string({
|
|
60
|
-
char: 'w',
|
|
61
|
-
description: 'Workspace ID (optional if set in profile)',
|
|
62
|
-
required: false,
|
|
63
|
-
}),
|
|
64
|
-
};
|
|
65
|
-
async run() {
|
|
66
|
-
const { args, flags } = await this.parse(EphemeralStaticHostBuildList);
|
|
67
|
-
const { profile, profileName } = this.resolveProfile(flags);
|
|
68
|
-
const tenantName = args.tenant_name;
|
|
69
|
-
const staticHost = flags['static-host'];
|
|
70
|
-
// Determine workspace_id from flag or profile
|
|
71
|
-
let workspaceId;
|
|
72
|
-
if (flags.workspace) {
|
|
73
|
-
workspaceId = flags.workspace;
|
|
74
|
-
}
|
|
75
|
-
else if (profile.workspace) {
|
|
76
|
-
workspaceId = profile.workspace;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
this.error(`Workspace ID is required. Either:\n` +
|
|
80
|
-
` 1. Provide it as a flag: xano ephemeral static_host build list <tenant_name> --static-host <static_host> -w <workspace_id>\n` +
|
|
81
|
-
` 2. Set it in your profile using: xano profile:edit ${profileName} -w <workspace_id>`);
|
|
82
|
-
}
|
|
83
|
-
// Build query parameters
|
|
84
|
-
const queryParams = new URLSearchParams(buildPagingParams(flags, 'page-only-envelope'));
|
|
85
|
-
// Construct the API URL
|
|
86
|
-
const apiUrl = `${profile.instance_origin}/api:meta/workspace/${workspaceId}/tenant/${tenantName}/static_host/${staticHost}/build?${queryParams.toString()}`;
|
|
87
|
-
// Fetch builds from the API
|
|
88
|
-
try {
|
|
89
|
-
const response = await this.verboseFetch(apiUrl, {
|
|
90
|
-
headers: {
|
|
91
|
-
'accept': 'application/json',
|
|
92
|
-
'Authorization': `Bearer ${profile.access_token}`,
|
|
93
|
-
},
|
|
94
|
-
method: 'GET',
|
|
95
|
-
}, flags.verbose, profile.access_token);
|
|
96
|
-
if (!response.ok) {
|
|
97
|
-
const errorText = await response.text();
|
|
98
|
-
this.error(`API request failed with status ${response.status}: ${response.statusText}\n${errorText}`);
|
|
99
|
-
}
|
|
100
|
-
const list = normalizeListResponse(await response.json(), ['builds']);
|
|
101
|
-
const builds = list.items;
|
|
102
|
-
// Output results
|
|
103
|
-
if (flags.output === 'json') {
|
|
104
|
-
this.log(JSON.stringify(buildPagingJson(list, { page: flags.page, tier: 'page-only-envelope' }), null, 2));
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// summary format
|
|
108
|
-
if (builds.length === 0) {
|
|
109
|
-
this.log('No builds found');
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.log('Available builds:');
|
|
113
|
-
for (const build of builds) {
|
|
114
|
-
if (build.id === undefined) {
|
|
115
|
-
this.log(` - ${build.name}`);
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const statusInfo = build.status ? ` - Status: ${build.status}` : '';
|
|
119
|
-
this.log(` - ${build.name} (ID: ${build.id})${statusInfo}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const footer = formatPagingFooter(list, { noun: 'build', page: flags.page, tier: 'page-only-envelope' });
|
|
124
|
-
if (footer)
|
|
125
|
-
this.log(footer);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
if (error instanceof Error) {
|
|
130
|
-
this.error(`Failed to fetch builds: ${error.message}`);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.error(`Failed to fetch builds: ${String(error)}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import BaseCommand from '../../../../../base-command.js';
|
|
2
|
-
export interface StaticHostEnv {
|
|
3
|
-
canonical?: null | string;
|
|
4
|
-
}
|
|
5
|
-
export interface StaticHostSummary {
|
|
6
|
-
[k: string]: unknown;
|
|
7
|
-
dev?: StaticHostEnv;
|
|
8
|
-
name: string;
|
|
9
|
-
prod?: StaticHostEnv;
|
|
10
|
-
}
|
|
11
|
-
export interface BuildSummary {
|
|
12
|
-
canonical?: string;
|
|
13
|
-
id: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Find the deployed `canonical` for a static host's env from a list of hosts.
|
|
17
|
-
* Returns null when the host isn't present or nothing is deployed to that env.
|
|
18
|
-
*/
|
|
19
|
-
export declare function extractEnvCanonical(hosts: StaticHostSummary[], staticHost: string, env: string): null | string;
|
|
20
|
-
/** Find the build whose unique `canonical` matches, or null if none do. */
|
|
21
|
-
export declare function findBuildByCanonical(builds: BuildSummary[], canonical: string): BuildSummary | null;
|
|
22
|
-
export default class EphemeralStaticHostBuildPull extends BaseCommand {
|
|
23
|
-
static args: {
|
|
24
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
25
|
-
};
|
|
26
|
-
static description: string;
|
|
27
|
-
static examples: string[];
|
|
28
|
-
static flags: {
|
|
29
|
-
build_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
30
|
-
directory: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
31
|
-
env: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
32
|
-
latest: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
33
|
-
source: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
34
|
-
'static-host': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
35
|
-
workspace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
36
|
-
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
37
|
-
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
38
|
-
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
39
|
-
};
|
|
40
|
-
run(): Promise<void>;
|
|
41
|
-
private parseFileDocument;
|
|
42
|
-
/**
|
|
43
|
-
* Resolve the build ID currently deployed to a static host's dev/prod env.
|
|
44
|
-
*
|
|
45
|
-
* The deployed env stores the `canonical` of the build it was created from
|
|
46
|
-
* (static_host.{env}.canonical). Each build carries that same unique
|
|
47
|
-
* `canonical`, so we match the env's canonical against the build list to
|
|
48
|
-
* recover the build ID — a shortcut for "list builds, find the deployed one,
|
|
49
|
-
* then pull it".
|
|
50
|
-
*/
|
|
51
|
-
private resolveEnvBuild;
|
|
52
|
-
private resolveLatestBuild;
|
|
53
|
-
}
|