@xano/cli 0.0.95-beta.1 → 0.0.95-beta.10
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 +22 -9
- package/dist/base-command.d.ts +25 -0
- package/dist/base-command.js +37 -0
- package/dist/commands/auth/index.js +1 -1
- package/dist/commands/profile/create/index.js +2 -2
- package/dist/commands/profile/edit/index.js +2 -2
- package/dist/commands/profile/me/index.js +21 -2
- package/dist/commands/profile/wizard/index.js +3 -3
- package/dist/commands/profile/workspace/set/index.js +1 -1
- package/dist/commands/release/deploy/index.d.ts +17 -0
- package/dist/commands/release/deploy/index.js +107 -0
- package/dist/commands/{ephemeral → sandbox}/env/delete/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/env/delete/index.js +16 -34
- package/dist/commands/{ephemeral → sandbox}/env/get/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/env/get/index.js +11 -29
- package/dist/commands/{ephemeral → sandbox}/env/get_all/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/env/get_all/index.js +15 -33
- package/dist/commands/{ephemeral → sandbox}/env/list/index.d.ts +1 -4
- package/dist/commands/sandbox/env/list/index.js +65 -0
- package/dist/commands/{ephemeral → sandbox}/env/set/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/env/set/index.js +12 -30
- package/dist/commands/{ephemeral → sandbox}/env/set_all/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/env/set_all/index.js +15 -33
- package/dist/commands/{ephemeral → sandbox}/get/index.d.ts +1 -4
- package/dist/commands/sandbox/get/index.js +61 -0
- package/dist/commands/sandbox/impersonate/index.d.ts +5 -0
- package/dist/commands/sandbox/impersonate/index.js +5 -0
- package/dist/commands/{ephemeral → sandbox}/license/get/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/license/get/index.js +15 -33
- package/dist/commands/{ephemeral → sandbox}/license/set/index.d.ts +1 -4
- package/dist/commands/{ephemeral → sandbox}/license/set/index.js +16 -34
- package/dist/commands/{ephemeral → sandbox}/pull/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/pull/index.js +9 -26
- package/dist/commands/{ephemeral → sandbox}/push/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/push/index.js +11 -28
- package/dist/commands/{ephemeral/delete → sandbox/reset}/index.d.ts +1 -5
- package/dist/commands/sandbox/reset/index.js +69 -0
- package/dist/commands/{ephemeral/impersonate → sandbox/review}/index.d.ts +1 -4
- package/dist/commands/{ephemeral/impersonate → sandbox/review}/index.js +13 -31
- package/dist/commands/{ephemeral/unit_test/run_all → sandbox/unit_test/list}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/unit_test/list/index.js +8 -24
- package/dist/commands/{ephemeral → sandbox}/unit_test/run/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/unit_test/run/index.js +7 -23
- package/dist/commands/{ephemeral/unit_test/list → sandbox/unit_test/run_all}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/unit_test/run_all/index.js +7 -23
- package/dist/commands/{ephemeral/workflow_test/get → sandbox/workflow_test/delete}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/workflow_test/delete/index.js +7 -23
- package/dist/commands/{ephemeral/workflow_test/run → sandbox/workflow_test/get}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/workflow_test/get/index.js +6 -25
- package/dist/commands/{ephemeral/workflow_test/run_all → sandbox/workflow_test/list}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/workflow_test/list/index.js +9 -25
- package/dist/commands/{ephemeral/workflow_test/delete → sandbox/workflow_test/run}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/workflow_test/run/index.js +7 -23
- package/dist/commands/{ephemeral/workflow_test/list → sandbox/workflow_test/run_all}/index.d.ts +1 -2
- package/dist/commands/{ephemeral → sandbox}/workflow_test/run_all/index.js +7 -23
- package/dist/commands/tenant/create/index.d.ts +2 -1
- package/dist/commands/tenant/create/index.js +23 -6
- package/dist/commands/tenant/get/index.js +2 -2
- package/dist/commands/tenant/list/index.js +2 -2
- package/dist/commands/tenant/push/index.js +0 -34
- package/dist/commands/workspace/edit/index.d.ts +1 -0
- package/dist/commands/workspace/edit/index.js +16 -6
- package/dist/commands/workspace/get/index.js +9 -7
- package/dist/commands/workspace/list/index.d.ts +1 -0
- package/dist/commands/workspace/list/index.js +14 -7
- package/dist/commands/workspace/push/index.js +30 -2
- package/oclif.manifest.json +1985 -2354
- package/package.json +8 -8
- package/dist/commands/ephemeral/access/index.d.ts +0 -15
- package/dist/commands/ephemeral/access/index.js +0 -78
- package/dist/commands/ephemeral/create/index.d.ts +0 -17
- package/dist/commands/ephemeral/create/index.js +0 -102
- package/dist/commands/ephemeral/delete/index.js +0 -99
- package/dist/commands/ephemeral/env/list/index.js +0 -83
- package/dist/commands/ephemeral/get/index.js +0 -102
- package/dist/commands/ephemeral/list/index.d.ts +0 -15
- package/dist/commands/ephemeral/list/index.js +0 -109
- package/dist/commands/ephemeral/shared/index.d.ts +0 -15
- package/dist/commands/ephemeral/shared/index.js +0 -108
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import BaseCommand from '../../../../base-command.js';
|
|
3
|
+
export default class SandboxEnvList extends BaseCommand {
|
|
4
|
+
static description = 'List environment variable keys for a sandbox environment';
|
|
5
|
+
static examples = [
|
|
6
|
+
`$ xano sandbox env list
|
|
7
|
+
Environment variables for sandbox environment:
|
|
8
|
+
- DATABASE_URL
|
|
9
|
+
- API_KEY
|
|
10
|
+
`,
|
|
11
|
+
`$ xano sandbox env list -o json`,
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...BaseCommand.baseFlags,
|
|
15
|
+
output: Flags.string({
|
|
16
|
+
char: 'o',
|
|
17
|
+
default: 'summary',
|
|
18
|
+
description: 'Output format',
|
|
19
|
+
options: ['summary', 'json'],
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
async run() {
|
|
24
|
+
const { flags } = await this.parse(SandboxEnvList);
|
|
25
|
+
const { profile } = this.resolveProfile(flags);
|
|
26
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/env_key`;
|
|
27
|
+
try {
|
|
28
|
+
const response = await this.verboseFetch(apiUrl, {
|
|
29
|
+
headers: {
|
|
30
|
+
accept: 'application/json',
|
|
31
|
+
Authorization: `Bearer ${profile.access_token}`,
|
|
32
|
+
},
|
|
33
|
+
method: 'GET',
|
|
34
|
+
}, flags.verbose, profile.access_token);
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const errorText = await response.text();
|
|
37
|
+
this.error(`API request failed with status ${response.status}: ${response.statusText}\n${errorText}`);
|
|
38
|
+
}
|
|
39
|
+
const data = (await response.json());
|
|
40
|
+
if (flags.output === 'json') {
|
|
41
|
+
this.log(JSON.stringify(data, null, 2));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const envVars = data.env || [];
|
|
45
|
+
if (envVars.length === 0) {
|
|
46
|
+
this.log(`No environment variables found for sandbox environment`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.log(`Environment variables for sandbox environment:`);
|
|
50
|
+
for (const envVar of envVars) {
|
|
51
|
+
this.log(` - ${envVar.name}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
this.error(`Failed to list sandbox environment variables: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.error(`Failed to list sandbox environment variables: ${String(error)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../../base-command.js';
|
|
2
|
-
export default class
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
2
|
+
export default class SandboxEnvSet extends BaseCommand {
|
|
6
3
|
static description: string;
|
|
7
4
|
static examples: string[];
|
|
8
5
|
static flags: {
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
2
|
import BaseCommand from '../../../../base-command.js';
|
|
3
|
-
export default class
|
|
4
|
-
static
|
|
5
|
-
tenant_name: Args.string({
|
|
6
|
-
description: 'Ephemeral tenant name',
|
|
7
|
-
required: true,
|
|
8
|
-
}),
|
|
9
|
-
};
|
|
10
|
-
static description = 'Set (create or update) an environment variable for an ephemeral tenant';
|
|
3
|
+
export default class SandboxEnvSet extends BaseCommand {
|
|
4
|
+
static description = 'Set (create or update) an environment variable for a sandbox environment';
|
|
11
5
|
static examples = [
|
|
12
|
-
`$ xano
|
|
13
|
-
Environment variable 'DATABASE_URL' set
|
|
6
|
+
`$ xano sandbox env set --name DATABASE_URL --value postgres://localhost:5432/mydb
|
|
7
|
+
Environment variable 'DATABASE_URL' set
|
|
14
8
|
`,
|
|
15
|
-
`$ xano
|
|
9
|
+
`$ xano sandbox env set --name DATABASE_URL --value postgres://localhost:5432/mydb -o json`,
|
|
16
10
|
];
|
|
17
11
|
static flags = {
|
|
18
12
|
...BaseCommand.baseFlags,
|
|
@@ -34,22 +28,10 @@ Environment variable 'DATABASE_URL' set for ephemeral tenant my-tenant
|
|
|
34
28
|
}),
|
|
35
29
|
};
|
|
36
30
|
async run() {
|
|
37
|
-
const {
|
|
38
|
-
const
|
|
39
|
-
const credentials = this.loadCredentialsFile();
|
|
40
|
-
if (!credentials || !(profileName in credentials.profiles)) {
|
|
41
|
-
this.error(`Profile '${profileName}' not found.\n` + `Create a profile using 'xano profile create'`);
|
|
42
|
-
}
|
|
43
|
-
const profile = credentials.profiles[profileName];
|
|
44
|
-
if (!profile.instance_origin) {
|
|
45
|
-
this.error(`Profile '${profileName}' is missing instance_origin`);
|
|
46
|
-
}
|
|
47
|
-
if (!profile.access_token) {
|
|
48
|
-
this.error(`Profile '${profileName}' is missing access_token`);
|
|
49
|
-
}
|
|
50
|
-
const tenantName = args.tenant_name;
|
|
31
|
+
const { flags } = await this.parse(SandboxEnvSet);
|
|
32
|
+
const { profile } = this.resolveProfile(flags);
|
|
51
33
|
const envName = flags.name;
|
|
52
|
-
const apiUrl = `${profile.instance_origin}/api:meta/
|
|
34
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/env/${envName}`;
|
|
53
35
|
const body = {
|
|
54
36
|
env: {
|
|
55
37
|
name: envName,
|
|
@@ -75,15 +57,15 @@ Environment variable 'DATABASE_URL' set for ephemeral tenant my-tenant
|
|
|
75
57
|
this.log(JSON.stringify(result, null, 2));
|
|
76
58
|
}
|
|
77
59
|
else {
|
|
78
|
-
this.log(`Environment variable '${envName}' set for
|
|
60
|
+
this.log(`Environment variable '${envName}' set for sandbox environment`);
|
|
79
61
|
}
|
|
80
62
|
}
|
|
81
63
|
catch (error) {
|
|
82
64
|
if (error instanceof Error) {
|
|
83
|
-
this.error(`Failed to set
|
|
65
|
+
this.error(`Failed to set sandbox environment variable: ${error.message}`);
|
|
84
66
|
}
|
|
85
67
|
else {
|
|
86
|
-
this.error(`Failed to set
|
|
68
|
+
this.error(`Failed to set sandbox environment variable: ${String(error)}`);
|
|
87
69
|
}
|
|
88
70
|
}
|
|
89
71
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../../base-command.js';
|
|
2
|
-
export default class
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
2
|
+
export default class SandboxEnvSetAll extends BaseCommand {
|
|
6
3
|
static description: string;
|
|
7
4
|
static examples: string[];
|
|
8
5
|
static flags: {
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
2
|
import * as yaml from 'js-yaml';
|
|
3
3
|
import * as fs from 'node:fs';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import BaseCommand from '../../../../base-command.js';
|
|
6
|
-
export default class
|
|
7
|
-
static
|
|
8
|
-
tenant_name: Args.string({
|
|
9
|
-
description: 'Ephemeral tenant name',
|
|
10
|
-
required: true,
|
|
11
|
-
}),
|
|
12
|
-
};
|
|
13
|
-
static description = 'Set all environment variables for an ephemeral tenant from a YAML file (replaces all existing)';
|
|
6
|
+
export default class SandboxEnvSetAll extends BaseCommand {
|
|
7
|
+
static description = 'Set all environment variables for a sandbox environment from a YAML file (replaces all existing)';
|
|
14
8
|
static examples = [
|
|
15
|
-
`$ xano
|
|
16
|
-
Reads from
|
|
9
|
+
`$ xano sandbox env set_all
|
|
10
|
+
Reads from env_<tenant>.yaml
|
|
17
11
|
`,
|
|
18
|
-
`$ xano
|
|
19
|
-
`$ xano
|
|
12
|
+
`$ xano sandbox env set_all --file ./my-env.yaml`,
|
|
13
|
+
`$ xano sandbox env set_all -o json`,
|
|
20
14
|
];
|
|
21
15
|
static flags = {
|
|
22
16
|
...BaseCommand.baseFlags,
|
|
@@ -27,7 +21,7 @@ Reads from env_my-tenant.yaml
|
|
|
27
21
|
}),
|
|
28
22
|
file: Flags.string({
|
|
29
23
|
char: 'f',
|
|
30
|
-
description: 'Path to env file (default: env_<
|
|
24
|
+
description: 'Path to env file (default: env_<sandbox_name>.yaml)',
|
|
31
25
|
required: false,
|
|
32
26
|
}),
|
|
33
27
|
output: Flags.string({
|
|
@@ -39,9 +33,9 @@ Reads from env_my-tenant.yaml
|
|
|
39
33
|
}),
|
|
40
34
|
};
|
|
41
35
|
async run() {
|
|
42
|
-
const {
|
|
43
|
-
const
|
|
44
|
-
const sourceFilePath = path.resolve(flags.file || `
|
|
36
|
+
const { flags } = await this.parse(SandboxEnvSetAll);
|
|
37
|
+
const { profile } = this.resolveProfile(flags);
|
|
38
|
+
const sourceFilePath = path.resolve(flags.file || `env.yaml`);
|
|
45
39
|
if (!fs.existsSync(sourceFilePath)) {
|
|
46
40
|
this.error(`File not found: ${sourceFilePath}`);
|
|
47
41
|
}
|
|
@@ -51,19 +45,7 @@ Reads from env_my-tenant.yaml
|
|
|
51
45
|
this.error('Invalid env file format. Expected a YAML map of key: value pairs.');
|
|
52
46
|
}
|
|
53
47
|
const envs = Object.entries(envMap).map(([name, value]) => ({ name, value: String(value) }));
|
|
54
|
-
const
|
|
55
|
-
const credentials = this.loadCredentialsFile();
|
|
56
|
-
if (!credentials || !(profileName in credentials.profiles)) {
|
|
57
|
-
this.error(`Profile '${profileName}' not found.\n` + `Create a profile using 'xano profile create'`);
|
|
58
|
-
}
|
|
59
|
-
const profile = credentials.profiles[profileName];
|
|
60
|
-
if (!profile.instance_origin) {
|
|
61
|
-
this.error(`Profile '${profileName}' is missing instance_origin`);
|
|
62
|
-
}
|
|
63
|
-
if (!profile.access_token) {
|
|
64
|
-
this.error(`Profile '${profileName}' is missing access_token`);
|
|
65
|
-
}
|
|
66
|
-
const apiUrl = `${profile.instance_origin}/api:meta/ephemeral/tenant/${tenantName}/env_all`;
|
|
48
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/env_all`;
|
|
67
49
|
try {
|
|
68
50
|
const response = await this.verboseFetch(apiUrl, {
|
|
69
51
|
body: JSON.stringify({ envs }),
|
|
@@ -83,7 +65,7 @@ Reads from env_my-tenant.yaml
|
|
|
83
65
|
this.log(JSON.stringify(result, null, 2));
|
|
84
66
|
}
|
|
85
67
|
else {
|
|
86
|
-
this.log(`All environment variables updated for
|
|
68
|
+
this.log(`All environment variables updated for sandbox environment (${envs.length} variables)`);
|
|
87
69
|
}
|
|
88
70
|
if (flags.clean && fs.existsSync(sourceFilePath)) {
|
|
89
71
|
fs.unlinkSync(sourceFilePath);
|
|
@@ -92,10 +74,10 @@ Reads from env_my-tenant.yaml
|
|
|
92
74
|
}
|
|
93
75
|
catch (error) {
|
|
94
76
|
if (error instanceof Error) {
|
|
95
|
-
this.error(`Failed to set
|
|
77
|
+
this.error(`Failed to set sandbox environment variables: ${error.message}`);
|
|
96
78
|
}
|
|
97
79
|
else {
|
|
98
|
-
this.error(`Failed to set
|
|
80
|
+
this.error(`Failed to set sandbox environment variables: ${String(error)}`);
|
|
99
81
|
}
|
|
100
82
|
}
|
|
101
83
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../base-command.js';
|
|
2
|
-
export default class
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
2
|
+
export default class SandboxGet extends BaseCommand {
|
|
6
3
|
static description: string;
|
|
7
4
|
static examples: string[];
|
|
8
5
|
static flags: {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import BaseCommand from '../../../base-command.js';
|
|
3
|
+
export default class SandboxGet extends BaseCommand {
|
|
4
|
+
static description = 'Get your sandbox environment (creates one if it does not exist)';
|
|
5
|
+
static examples = [
|
|
6
|
+
`$ xano sandbox get
|
|
7
|
+
Sandbox Environment: (tc24-abcd-x1y2)
|
|
8
|
+
State: ok
|
|
9
|
+
License: tier1
|
|
10
|
+
`,
|
|
11
|
+
`$ xano sandbox get -o json`,
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...BaseCommand.baseFlags,
|
|
15
|
+
output: Flags.string({
|
|
16
|
+
char: 'o',
|
|
17
|
+
default: 'summary',
|
|
18
|
+
description: 'Output format',
|
|
19
|
+
options: ['summary', 'json'],
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
async run() {
|
|
24
|
+
const { flags } = await this.parse(SandboxGet);
|
|
25
|
+
const { profile } = this.resolveProfile(flags);
|
|
26
|
+
try {
|
|
27
|
+
const tenant = await this.getOrCreateSandbox(profile, flags.verbose);
|
|
28
|
+
if (flags.output === 'json') {
|
|
29
|
+
this.log(JSON.stringify(tenant, null, 2));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.log(`Sandbox Environment: ${tenant.display || tenant.name} (${tenant.name})`);
|
|
33
|
+
if (tenant.state)
|
|
34
|
+
this.log(` State: ${tenant.state}`);
|
|
35
|
+
if (tenant.xano_domain)
|
|
36
|
+
this.log(` Domain: ${tenant.xano_domain}`);
|
|
37
|
+
if (tenant.sandbox_expires_at) {
|
|
38
|
+
const expiresAt = new Date(tenant.sandbox_expires_at);
|
|
39
|
+
if (!isNaN(expiresAt.getTime())) {
|
|
40
|
+
const msLeft = expiresAt.getTime() - Date.now();
|
|
41
|
+
if (msLeft > 0) {
|
|
42
|
+
const minsLeft = Math.ceil(msLeft / 60_000);
|
|
43
|
+
this.log(` Session expires: ${expiresAt.toLocaleString()} (${minsLeft} min remaining)`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.log(` Session expires: ${expiresAt.toLocaleString()} (expired)`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof Error) {
|
|
54
|
+
this.error(`Failed to get sandbox environment: ${error.message}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.error(`Failed to get sandbox environment: ${String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../../base-command.js';
|
|
2
|
-
export default class
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
2
|
+
export default class SandboxLicenseGet extends BaseCommand {
|
|
6
3
|
static description: string;
|
|
7
4
|
static examples: string[];
|
|
8
5
|
static flags: {
|
|
@@ -1,28 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import BaseCommand from '../../../../base-command.js';
|
|
5
|
-
export default class
|
|
6
|
-
static
|
|
7
|
-
tenant_name: Args.string({
|
|
8
|
-
description: 'Ephemeral tenant name',
|
|
9
|
-
required: true,
|
|
10
|
-
}),
|
|
11
|
-
};
|
|
12
|
-
static description = 'Get the license for an ephemeral tenant';
|
|
5
|
+
export default class SandboxLicenseGet extends BaseCommand {
|
|
6
|
+
static description = 'Get the license for a sandbox environment';
|
|
13
7
|
static examples = [
|
|
14
|
-
`$ xano
|
|
15
|
-
License saved to
|
|
8
|
+
`$ xano sandbox license get
|
|
9
|
+
License saved to license_<tenant>.yaml
|
|
16
10
|
`,
|
|
17
|
-
`$ xano
|
|
18
|
-
`$ xano
|
|
19
|
-
`$ xano
|
|
11
|
+
`$ xano sandbox license get --file ./my-license.yaml`,
|
|
12
|
+
`$ xano sandbox license get --view`,
|
|
13
|
+
`$ xano sandbox license get -o json`,
|
|
20
14
|
];
|
|
21
15
|
static flags = {
|
|
22
16
|
...BaseCommand.baseFlags,
|
|
23
17
|
file: Flags.string({
|
|
24
18
|
char: 'f',
|
|
25
|
-
description: 'Output file path (default: license_<
|
|
19
|
+
description: 'Output file path (default: license_<sandbox_name>.yaml)',
|
|
26
20
|
required: false,
|
|
27
21
|
}),
|
|
28
22
|
output: Flags.string({
|
|
@@ -39,21 +33,9 @@ License saved to license_my-tenant.yaml
|
|
|
39
33
|
}),
|
|
40
34
|
};
|
|
41
35
|
async run() {
|
|
42
|
-
const {
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
if (!credentials || !(profileName in credentials.profiles)) {
|
|
46
|
-
this.error(`Profile '${profileName}' not found.\n` + `Create a profile using 'xano profile create'`);
|
|
47
|
-
}
|
|
48
|
-
const profile = credentials.profiles[profileName];
|
|
49
|
-
if (!profile.instance_origin) {
|
|
50
|
-
this.error(`Profile '${profileName}' is missing instance_origin`);
|
|
51
|
-
}
|
|
52
|
-
if (!profile.access_token) {
|
|
53
|
-
this.error(`Profile '${profileName}' is missing access_token`);
|
|
54
|
-
}
|
|
55
|
-
const tenantName = args.tenant_name;
|
|
56
|
-
const apiUrl = `${profile.instance_origin}/api:meta/ephemeral/tenant/${tenantName}/license`;
|
|
36
|
+
const { flags } = await this.parse(SandboxLicenseGet);
|
|
37
|
+
const { profile } = this.resolveProfile(flags);
|
|
38
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/license`;
|
|
57
39
|
try {
|
|
58
40
|
const response = await this.verboseFetch(apiUrl, {
|
|
59
41
|
headers: {
|
|
@@ -77,17 +59,17 @@ License saved to license_my-tenant.yaml
|
|
|
77
59
|
}
|
|
78
60
|
}
|
|
79
61
|
else {
|
|
80
|
-
const filePath = path.resolve(flags.file || `
|
|
62
|
+
const filePath = path.resolve(flags.file || `license.yaml`);
|
|
81
63
|
fs.writeFileSync(filePath, licenseContent, 'utf8');
|
|
82
64
|
this.log(`License saved to ${filePath}`);
|
|
83
65
|
}
|
|
84
66
|
}
|
|
85
67
|
catch (error) {
|
|
86
68
|
if (error instanceof Error) {
|
|
87
|
-
this.error(`Failed to get
|
|
69
|
+
this.error(`Failed to get sandbox environment license: ${error.message}`);
|
|
88
70
|
}
|
|
89
71
|
else {
|
|
90
|
-
this.error(`Failed to get
|
|
72
|
+
this.error(`Failed to get sandbox environment license: ${String(error)}`);
|
|
91
73
|
}
|
|
92
74
|
}
|
|
93
75
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../../base-command.js';
|
|
2
|
-
export default class
|
|
3
|
-
static args: {
|
|
4
|
-
tenant_name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
-
};
|
|
2
|
+
export default class SandboxLicenseSet extends BaseCommand {
|
|
6
3
|
static description: string;
|
|
7
4
|
static examples: string[];
|
|
8
5
|
static flags: {
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import BaseCommand from '../../../../base-command.js';
|
|
5
|
-
export default class
|
|
6
|
-
static
|
|
7
|
-
tenant_name: Args.string({
|
|
8
|
-
description: 'Ephemeral tenant name',
|
|
9
|
-
required: true,
|
|
10
|
-
}),
|
|
11
|
-
};
|
|
12
|
-
static description = 'Set/update the license for an ephemeral tenant';
|
|
5
|
+
export default class SandboxLicenseSet extends BaseCommand {
|
|
6
|
+
static description = 'Set/update the license for a sandbox environment';
|
|
13
7
|
static examples = [
|
|
14
|
-
`$ xano
|
|
15
|
-
Reads from
|
|
8
|
+
`$ xano sandbox license set
|
|
9
|
+
Reads from license_<tenant>.yaml
|
|
16
10
|
`,
|
|
17
|
-
`$ xano
|
|
18
|
-
`$ xano
|
|
19
|
-
`$ xano
|
|
11
|
+
`$ xano sandbox license set --file ./license.yaml`,
|
|
12
|
+
`$ xano sandbox license set --value 'key: value'`,
|
|
13
|
+
`$ xano sandbox license set -o json`,
|
|
20
14
|
];
|
|
21
15
|
static flags = {
|
|
22
16
|
...BaseCommand.baseFlags,
|
|
@@ -28,7 +22,7 @@ Reads from license_my-tenant.yaml
|
|
|
28
22
|
}),
|
|
29
23
|
file: Flags.string({
|
|
30
24
|
char: 'f',
|
|
31
|
-
description: 'Path to license file (default: license_<
|
|
25
|
+
description: 'Path to license file (default: license_<sandbox_name>.yaml)',
|
|
32
26
|
exclusive: ['value'],
|
|
33
27
|
required: false,
|
|
34
28
|
}),
|
|
@@ -46,33 +40,21 @@ Reads from license_my-tenant.yaml
|
|
|
46
40
|
}),
|
|
47
41
|
};
|
|
48
42
|
async run() {
|
|
49
|
-
const {
|
|
50
|
-
const
|
|
43
|
+
const { flags } = await this.parse(SandboxLicenseSet);
|
|
44
|
+
const { profile } = this.resolveProfile(flags);
|
|
51
45
|
let licenseValue;
|
|
52
46
|
let sourceFilePath;
|
|
53
47
|
if (flags.value) {
|
|
54
48
|
licenseValue = flags.value;
|
|
55
49
|
}
|
|
56
50
|
else {
|
|
57
|
-
sourceFilePath = path.resolve(flags.file || `
|
|
51
|
+
sourceFilePath = path.resolve(flags.file || `license.yaml`);
|
|
58
52
|
if (!fs.existsSync(sourceFilePath)) {
|
|
59
53
|
this.error(`File not found: ${sourceFilePath}`);
|
|
60
54
|
}
|
|
61
55
|
licenseValue = fs.readFileSync(sourceFilePath, 'utf8');
|
|
62
56
|
}
|
|
63
|
-
const
|
|
64
|
-
const credentials = this.loadCredentialsFile();
|
|
65
|
-
if (!credentials || !(profileName in credentials.profiles)) {
|
|
66
|
-
this.error(`Profile '${profileName}' not found.\n` + `Create a profile using 'xano profile create'`);
|
|
67
|
-
}
|
|
68
|
-
const profile = credentials.profiles[profileName];
|
|
69
|
-
if (!profile.instance_origin) {
|
|
70
|
-
this.error(`Profile '${profileName}' is missing instance_origin`);
|
|
71
|
-
}
|
|
72
|
-
if (!profile.access_token) {
|
|
73
|
-
this.error(`Profile '${profileName}' is missing access_token`);
|
|
74
|
-
}
|
|
75
|
-
const apiUrl = `${profile.instance_origin}/api:meta/ephemeral/tenant/${tenantName}/license`;
|
|
57
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/license`;
|
|
76
58
|
try {
|
|
77
59
|
const response = await this.verboseFetch(apiUrl, {
|
|
78
60
|
body: JSON.stringify({ value: licenseValue }),
|
|
@@ -92,7 +74,7 @@ Reads from license_my-tenant.yaml
|
|
|
92
74
|
this.log(JSON.stringify(result, null, 2));
|
|
93
75
|
}
|
|
94
76
|
else {
|
|
95
|
-
this.log(`
|
|
77
|
+
this.log(`Sandbox environment license updated successfully`);
|
|
96
78
|
}
|
|
97
79
|
if (flags.clean && sourceFilePath && fs.existsSync(sourceFilePath)) {
|
|
98
80
|
fs.unlinkSync(sourceFilePath);
|
|
@@ -101,10 +83,10 @@ Reads from license_my-tenant.yaml
|
|
|
101
83
|
}
|
|
102
84
|
catch (error) {
|
|
103
85
|
if (error instanceof Error) {
|
|
104
|
-
this.error(`Failed to set
|
|
86
|
+
this.error(`Failed to set sandbox environment license: ${error.message}`);
|
|
105
87
|
}
|
|
106
88
|
else {
|
|
107
|
-
this.error(`Failed to set
|
|
89
|
+
this.error(`Failed to set sandbox environment license: ${String(error)}`);
|
|
108
90
|
}
|
|
109
91
|
}
|
|
110
92
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../base-command.js';
|
|
2
|
-
export default class
|
|
2
|
+
export default class SandboxPull extends BaseCommand {
|
|
3
3
|
static args: {
|
|
4
4
|
directory: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
5
|
};
|
|
@@ -9,7 +9,6 @@ export default class EphemeralPull extends BaseCommand {
|
|
|
9
9
|
draft: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
10
|
env: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
11
|
records: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
-
tenant: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
12
|
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
13
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
14
|
};
|
|
@@ -4,19 +4,19 @@ import BaseCommand from '../../../base-command.js';
|
|
|
4
4
|
import { buildApiGroupFolderResolver, parseDocument } from '../../../utils/document-parser.js';
|
|
5
5
|
import * as fs from 'node:fs';
|
|
6
6
|
import * as path from 'node:path';
|
|
7
|
-
export default class
|
|
7
|
+
export default class SandboxPull extends BaseCommand {
|
|
8
8
|
static args = {
|
|
9
9
|
directory: Args.string({
|
|
10
10
|
description: 'Output directory for pulled documents',
|
|
11
11
|
required: true,
|
|
12
12
|
}),
|
|
13
13
|
};
|
|
14
|
-
static description = 'Pull
|
|
14
|
+
static description = 'Pull documents from your sandbox environment and split into individual files';
|
|
15
15
|
static examples = [
|
|
16
|
-
`$ xano
|
|
17
|
-
Pulled 42 documents from
|
|
16
|
+
`$ xano sandbox pull ./my-sandbox
|
|
17
|
+
Pulled 42 documents from sandbox environment to ./my-sandbox
|
|
18
18
|
`,
|
|
19
|
-
`$ xano
|
|
19
|
+
`$ xano sandbox pull ./backup --env --records`,
|
|
20
20
|
];
|
|
21
21
|
static flags = {
|
|
22
22
|
...BaseCommand.baseFlags,
|
|
@@ -35,33 +35,16 @@ Pulled 42 documents from ephemeral tenant my-tenant to ./my-tenant
|
|
|
35
35
|
description: 'Include records',
|
|
36
36
|
required: false,
|
|
37
37
|
}),
|
|
38
|
-
tenant: Flags.string({
|
|
39
|
-
char: 't',
|
|
40
|
-
description: 'Ephemeral tenant name to pull from',
|
|
41
|
-
required: true,
|
|
42
|
-
}),
|
|
43
38
|
};
|
|
44
39
|
async run() {
|
|
45
|
-
const { args, flags } = await this.parse(
|
|
46
|
-
const
|
|
47
|
-
const credentials = this.loadCredentialsFile();
|
|
48
|
-
if (!credentials || !(profileName in credentials.profiles)) {
|
|
49
|
-
this.error(`Profile '${profileName}' not found.\n` + `Create a profile using 'xano profile create'`);
|
|
50
|
-
}
|
|
51
|
-
const profile = credentials.profiles[profileName];
|
|
52
|
-
if (!profile.instance_origin) {
|
|
53
|
-
this.error(`Profile '${profileName}' is missing instance_origin`);
|
|
54
|
-
}
|
|
55
|
-
if (!profile.access_token) {
|
|
56
|
-
this.error(`Profile '${profileName}' is missing access_token`);
|
|
57
|
-
}
|
|
58
|
-
const tenantName = flags.tenant;
|
|
40
|
+
const { args, flags } = await this.parse(SandboxPull);
|
|
41
|
+
const { profile } = this.resolveProfile(flags);
|
|
59
42
|
const queryParams = new URLSearchParams({
|
|
60
43
|
env: flags.env.toString(),
|
|
61
44
|
include_draft: flags.draft.toString(),
|
|
62
45
|
records: flags.records.toString(),
|
|
63
46
|
});
|
|
64
|
-
const apiUrl = `${profile.instance_origin}/api:meta/
|
|
47
|
+
const apiUrl = `${profile.instance_origin}/api:meta/sandbox/multidoc?${queryParams.toString()}`;
|
|
65
48
|
let responseText;
|
|
66
49
|
try {
|
|
67
50
|
const response = await this.verboseFetch(apiUrl, {
|
|
@@ -189,7 +172,7 @@ Pulled 42 documents from ephemeral tenant my-tenant to ./my-tenant
|
|
|
189
172
|
fs.writeFileSync(filePath, doc.content, 'utf8');
|
|
190
173
|
writtenCount++;
|
|
191
174
|
}
|
|
192
|
-
this.log(`Pulled ${writtenCount} documents from
|
|
175
|
+
this.log(`Pulled ${writtenCount} documents from sandbox environment to ${args.directory}`);
|
|
193
176
|
}
|
|
194
177
|
sanitizeFilename(name) {
|
|
195
178
|
return snakeCase(name.replaceAll('"', ''));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import BaseCommand from '../../../base-command.js';
|
|
2
|
-
export default class
|
|
2
|
+
export default class SandboxPush extends BaseCommand {
|
|
3
3
|
static args: {
|
|
4
4
|
directory: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
5
|
};
|
|
@@ -8,7 +8,6 @@ export default class EphemeralPush extends BaseCommand {
|
|
|
8
8
|
static flags: {
|
|
9
9
|
env: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
10
|
records: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
-
tenant: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
11
|
transaction: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
12
|
truncate: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
13
|
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|