superuser.app 0.0.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/LICENSE +20 -0
- package/README.md +296 -0
- package/commands/domains/add.js +102 -0
- package/commands/domains/list.js +71 -0
- package/commands/domains/remove.js +97 -0
- package/commands/domains/verify.js +130 -0
- package/commands/g/endpoint.js +32 -0
- package/commands/g/test.js +42 -0
- package/commands/init.js +220 -0
- package/commands/login.js +123 -0
- package/commands/me.js +54 -0
- package/commands/organizations/create.js +68 -0
- package/commands/profile.js +58 -0
- package/commands/register.js +127 -0
- package/commands/run.js +194 -0
- package/commands/serve.js +35 -0
- package/commands/test.js +68 -0
- package/commands/up.js +257 -0
- package/commands/update.js +84 -0
- package/commands/version.js +31 -0
- package/helpers/constants.js +3 -0
- package/helpers/draw_box.js +38 -0
- package/helpers/draw_table.js +144 -0
- package/helpers/file_writer.js +101 -0
- package/helpers/generate/endpoint/_index.js +44 -0
- package/helpers/generate/test/_index.js +112 -0
- package/helpers/load_package.js +62 -0
- package/helpers/local_server.js +72 -0
- package/helpers/settings_manager.js +108 -0
- package/helpers/verify_packages.js +85 -0
- package/index.js +7 -0
- package/package.json +31 -0
- package/src/endpoint/functions/index.js +35 -0
- package/src/init/__.env +1 -0
- package/src/init/__.env.production +1 -0
- package/src/init/__.env.staging +1 -0
- package/src/init/__.gitignore +6 -0
- package/src/init/functions/index.js +15 -0
- package/src/init/instant.package.json +3 -0
- package/src/init/package.json +16 -0
- package/src/init/serve.instant.js +52 -0
- package/src/init/test/run.js +45 -0
- package/src/init/test/tests/_index.js +53 -0
- package/src/test/blank.mjs +16 -0
- package/src/test/endpoint.mjs +20 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const io = require('io');
|
|
3
|
+
const colors = require('colors/safe');
|
|
4
|
+
const inquirer = require('inquirer');
|
|
5
|
+
|
|
6
|
+
const constants = require('../../helpers/constants.js');
|
|
7
|
+
const SettingsManager = require('../../helpers/settings_manager.js');
|
|
8
|
+
const DrawTable = require('../../helpers/draw_table.js');
|
|
9
|
+
|
|
10
|
+
class DomainsVerifyCommand extends Command {
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
super('domains', 'verify');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
help () {
|
|
17
|
+
return {
|
|
18
|
+
description: 'Verify any pending domains',
|
|
19
|
+
args: [],
|
|
20
|
+
flags: {},
|
|
21
|
+
vflags: {}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async run (params) {
|
|
26
|
+
|
|
27
|
+
const settings = SettingsManager.read(true);
|
|
28
|
+
const host = settings.activeProfile.host || constants.BASE_URL;
|
|
29
|
+
|
|
30
|
+
const verifyParams = {};
|
|
31
|
+
|
|
32
|
+
const result = await io.get(
|
|
33
|
+
`${host}/v1/custom_domains`,
|
|
34
|
+
settings.activeProfile.key,
|
|
35
|
+
null,
|
|
36
|
+
{verified: false, invalidated: false},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (result.statusCode !== 200) {
|
|
40
|
+
const message = result.data?.error?.message || `Invalid statusCode: ${result.statusCode}`;
|
|
41
|
+
throw new Error(message);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const customDomains = result.data.data;
|
|
45
|
+
|
|
46
|
+
if (!customDomains.length) {
|
|
47
|
+
console.log();
|
|
48
|
+
console.log(`Looks like all your domains are verified!`);
|
|
49
|
+
console.log();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const columns = [
|
|
54
|
+
'hostname',
|
|
55
|
+
'package',
|
|
56
|
+
'environment',
|
|
57
|
+
'verified_at'
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
const rows = customDomains.map(customDomain => {
|
|
61
|
+
const packageName = `${customDomain.package.is_private ? 'private/' : ''}@${customDomain.package.organization.name}/${customDomain.package.name}`;
|
|
62
|
+
const environment = customDomain.environment;
|
|
63
|
+
return {
|
|
64
|
+
hostname: customDomain.hostname,
|
|
65
|
+
package: packageName,
|
|
66
|
+
environment: environment,
|
|
67
|
+
verified_at: customDomain.verified_at
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
console.log();
|
|
72
|
+
const index = await DrawTable.selectIndexFromTable('Choose a domain to verify', columns, rows);
|
|
73
|
+
const customDomain = customDomains[index];
|
|
74
|
+
|
|
75
|
+
if (index === -1) {
|
|
76
|
+
console.log();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const tld = customDomain.hostname.split('.').slice(-2).join('.');
|
|
81
|
+
const subdomain = customDomain.hostname.split('.').length > 2
|
|
82
|
+
? customDomain.hostname.split('.').slice(0, -2).join('.')
|
|
83
|
+
: '@';
|
|
84
|
+
|
|
85
|
+
console.log();
|
|
86
|
+
console.log(`In order to verify ${colors.bold(customDomain.hostname)},`);
|
|
87
|
+
console.log(`you must add the following TXT record to the domain ${colors.bold(tld)}:`);
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(colors.bold('Type:'));
|
|
90
|
+
console.log('TXT');
|
|
91
|
+
console.log();
|
|
92
|
+
console.log(colors.bold('Name:'));
|
|
93
|
+
console.log(subdomain);
|
|
94
|
+
console.log();
|
|
95
|
+
console.log(colors.bold('Content:'));
|
|
96
|
+
console.log(customDomain.txt_record);
|
|
97
|
+
console.log();
|
|
98
|
+
|
|
99
|
+
const confirmResult = await inquirer.prompt({type: 'confirm', name: 'ok'});
|
|
100
|
+
if (!confirmResult.ok) {
|
|
101
|
+
throw new Error(`Aborted`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
verifyParams.hostname = rows[index].hostname;
|
|
105
|
+
verifyParams.name = rows[index].package;
|
|
106
|
+
verifyParams.environment = rows[index].environment;
|
|
107
|
+
|
|
108
|
+
const verifyResult = await io.post(
|
|
109
|
+
`${host}/v1/custom_domains/verify`,
|
|
110
|
+
settings.activeProfile.key,
|
|
111
|
+
null,
|
|
112
|
+
verifyParams
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
if (verifyResult.statusCode !== 200) {
|
|
116
|
+
const message = verifyResult.data?.error?.message || `Invalid statusCode: ${verifyResult.statusCode}`;
|
|
117
|
+
throw new Error(message);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
console.log();
|
|
121
|
+
console.log(`${colors.bold.green('Success!')} Domain ${colors.bold(verifyParams.hostname)} verified.`);
|
|
122
|
+
console.log();
|
|
123
|
+
|
|
124
|
+
return void 0;
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
module.exports = DomainsVerifyCommand;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const colors = require('colors/safe');
|
|
3
|
+
|
|
4
|
+
const loadPackage = require('../../helpers/load_package.js');
|
|
5
|
+
const generateEndpoint = require('../../helpers/generate/endpoint/_index.js');
|
|
6
|
+
|
|
7
|
+
class GenerateEndpointCommand extends Command {
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
super('g', 'endpoint');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
help () {
|
|
14
|
+
return {
|
|
15
|
+
description: 'Generates a new endpoint file in a directory of your choosing',
|
|
16
|
+
args: ['pathname'],
|
|
17
|
+
flags: {},
|
|
18
|
+
vflags: {}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async run (params) {
|
|
23
|
+
|
|
24
|
+
const InstantPackage = await loadPackage(params, true);
|
|
25
|
+
await generateEndpoint(InstantPackage, params);
|
|
26
|
+
return void 0;
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = GenerateEndpointCommand;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const colors = require('colors/safe');
|
|
3
|
+
|
|
4
|
+
const loadPackage = require('../../helpers/load_package.js');
|
|
5
|
+
const generateTest = require('../../helpers/generate/test/_index.js');
|
|
6
|
+
|
|
7
|
+
class GenerateTestCommand extends Command {
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
super('g', 'test');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
help () {
|
|
14
|
+
return {
|
|
15
|
+
description: 'Generates new test',
|
|
16
|
+
args: ['test_name'],
|
|
17
|
+
flags: {},
|
|
18
|
+
vflags: {
|
|
19
|
+
endpoint: 'Generate a test for an endpoint'
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async run (params) {
|
|
25
|
+
|
|
26
|
+
const InstantPackage = await loadPackage(params, true);
|
|
27
|
+
|
|
28
|
+
let specificity = [params.args[0], params.vflags.endpoint[0]];
|
|
29
|
+
let submitted = specificity.filter(v => v);
|
|
30
|
+
if (!submitted.length) {
|
|
31
|
+
throw new Error(`Must specify one of "test_name" or "--endpoint"`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
await generateTest(InstantPackage, params);
|
|
35
|
+
|
|
36
|
+
return void 0;
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = GenerateTestCommand;
|
package/commands/init.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const colors = require('colors/safe');
|
|
3
|
+
const inquirer = require('inquirer');
|
|
4
|
+
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const childProcess = require('child_process');
|
|
8
|
+
|
|
9
|
+
const loadPackage = require('../helpers/load_package.js');
|
|
10
|
+
const fileWriter = require('../helpers/file_writer.js');
|
|
11
|
+
const drawBox = require('../helpers/draw_box.js');
|
|
12
|
+
|
|
13
|
+
const writeInitFiles = (pathname, pkg) => {
|
|
14
|
+
const files = fileWriter.readRecursive(pathname);
|
|
15
|
+
for (const filename in files) {
|
|
16
|
+
if (filename === '/package.json') {
|
|
17
|
+
let json;
|
|
18
|
+
try {
|
|
19
|
+
json = JSON.parse(files[filename].toString());
|
|
20
|
+
} catch (e) {
|
|
21
|
+
throw new Error(`Invalid "package.json" in init files`);
|
|
22
|
+
}
|
|
23
|
+
const scripts = json.scripts || {};
|
|
24
|
+
const mainDeps = json.dependencies || {};
|
|
25
|
+
const devDeps = json.devDependencies || {};
|
|
26
|
+
for (const key in scripts) {
|
|
27
|
+
fileWriter.writeJSON('package.json', `scripts.${key}`, scripts[key]);
|
|
28
|
+
}
|
|
29
|
+
console.log();
|
|
30
|
+
for (const [ deps, devMode ] of [[mainDeps, false], [devDeps, true]]) {
|
|
31
|
+
const depList = [];
|
|
32
|
+
for (const name in deps) {
|
|
33
|
+
depList.push(`${name}@${deps[name]}`);
|
|
34
|
+
}
|
|
35
|
+
if (depList.length) {
|
|
36
|
+
console.log(colors.bold.black(`Installing:`) + ` "${depList.join('", "')}" ...`);
|
|
37
|
+
const installString = `npm i ${depList.join(' ')} --save${devMode ? `-dev` : ``}`;
|
|
38
|
+
childProcess.execSync(installString, {stdio: 'inherit'});
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
fileWriter.writeFile(filename, files[filename], false);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
fileWriter.writeLine('.gitignore', '.DS_Store');
|
|
47
|
+
fileWriter.writeLine('.gitignore', 'node_modules/');
|
|
48
|
+
fileWriter.writeLine('.gitignore', '.env');
|
|
49
|
+
fileWriter.writeLine('.gitignore', '.env.*');
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
class InitCommand extends Command {
|
|
53
|
+
|
|
54
|
+
constructor() {
|
|
55
|
+
super('init');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
help () {
|
|
59
|
+
return {
|
|
60
|
+
description: 'Initialize a new Superuser Package project',
|
|
61
|
+
args: [],
|
|
62
|
+
flags: {},
|
|
63
|
+
vflags: {
|
|
64
|
+
force: 'overwrites existing project'
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async run (params) {
|
|
70
|
+
|
|
71
|
+
const force = ('force' in params.vflags);
|
|
72
|
+
|
|
73
|
+
console.log();
|
|
74
|
+
console.log(
|
|
75
|
+
drawBox.center(
|
|
76
|
+
`blue`,
|
|
77
|
+
`Welcome to ${colors.bold.green('🤖 Superuser')}!`,
|
|
78
|
+
)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const pkgExists = fs.existsSync('package.json');
|
|
82
|
+
const functExists = fs.existsSync('superuser.json');
|
|
83
|
+
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(`🪄 You are about to initialize an ${colors.bold('Superuser Package')} in the current directory:`)
|
|
86
|
+
console.log(` 📂 ${colors.dim(process.cwd())}`);
|
|
87
|
+
console.log();
|
|
88
|
+
if ((pkgExists || functExists) && !force) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`You already have a project initialized here.\n` +
|
|
91
|
+
`If you want to overwrite it, use \`$ ibot init --force\``
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
console.log(`✨ We've detected you're starting from scratch`);
|
|
95
|
+
console.log();
|
|
96
|
+
let verifyResult = await inquirer.prompt([
|
|
97
|
+
{
|
|
98
|
+
name: 'verify',
|
|
99
|
+
type: 'confirm',
|
|
100
|
+
message: `Continue with initialization in this directory?`,
|
|
101
|
+
default: true
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
104
|
+
if (!verifyResult.verify) {
|
|
105
|
+
throw new Error(`Initialization aborted`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let InstantPackage = await loadPackage(params);
|
|
110
|
+
if (!InstantPackage) {
|
|
111
|
+
console.log();
|
|
112
|
+
console.log(colors.bold.black(`Installing:`) + ` "@instant.dev/api@latest" (dev) ...`);
|
|
113
|
+
if ('link' in params.vflags) {
|
|
114
|
+
childProcess.execSync(`npm link @instant.dev/api`, {stdio: 'inherit'});
|
|
115
|
+
} else {
|
|
116
|
+
childProcess.execSync(`npm i @instant.dev/api --save-dev`, {stdio: 'inherit'});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
let apiGatewayPackage;
|
|
121
|
+
try {
|
|
122
|
+
apiGatewayPackage = JSON.parse(
|
|
123
|
+
fs.readFileSync(
|
|
124
|
+
path.join(process.cwd(), 'node_modules', '@instant.dev/api', 'package.json')
|
|
125
|
+
).toString()
|
|
126
|
+
);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
throw new Error(`Could not load @instant.dev/api package`);
|
|
129
|
+
}
|
|
130
|
+
let apiGatewayName = apiGatewayPackage.name || '@instant.dev/api';
|
|
131
|
+
let apiGatewayVersion = apiGatewayPackage.version || 'latest';
|
|
132
|
+
|
|
133
|
+
const pkgString = pkgExists
|
|
134
|
+
? fs.readFileSync('package.json').toString()
|
|
135
|
+
: JSON.stringify({devDependencies: {[apiGatewayName]: `^${apiGatewayVersion}`}});
|
|
136
|
+
let pkg;
|
|
137
|
+
try {
|
|
138
|
+
pkg = JSON.parse(pkgString);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
console.error(e);
|
|
141
|
+
throw new Error(`Invalid JSON in "package.json"`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let pathList = process.cwd().split(path.sep);
|
|
145
|
+
let functName = pathList.pop();
|
|
146
|
+
let orgName = pathList.pop();
|
|
147
|
+
if (orgName.startsWith('@')) {
|
|
148
|
+
orgName = orgName.slice(1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
console.log();
|
|
152
|
+
console.log(`✨ Let's name your project.`);
|
|
153
|
+
console.log();
|
|
154
|
+
let result = await inquirer.prompt([
|
|
155
|
+
{
|
|
156
|
+
name: 'name',
|
|
157
|
+
type: 'input',
|
|
158
|
+
message: 'Enter a project name',
|
|
159
|
+
validate: s => {
|
|
160
|
+
if (!s.match(/@[a-z0-9\-]+\/[a-z0-9\-]+/i)) {
|
|
161
|
+
return `must follow format @user/project and can only contain alphanumeric or - characters`;
|
|
162
|
+
} else {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
default: [
|
|
167
|
+
'@' + orgName.replace(/[^a-z0-9\-]+/gi, '-'),
|
|
168
|
+
functName.replace(/[^a-z0-9\-]+/gi, '-')
|
|
169
|
+
].join('/')
|
|
170
|
+
}
|
|
171
|
+
]);
|
|
172
|
+
functName = result.name;
|
|
173
|
+
|
|
174
|
+
const filesRoot = path.join(__dirname, '..', 'src', 'init');
|
|
175
|
+
if (!fs.existsSync(filesRoot)) {
|
|
176
|
+
throw new Error(`No init template files found`);
|
|
177
|
+
}
|
|
178
|
+
writeInitFiles(filesRoot);
|
|
179
|
+
// Write package.json: make sure no publish to npm
|
|
180
|
+
fileWriter.writeJSON('package.json', 'private', true);
|
|
181
|
+
// Write superuser.json: default is public
|
|
182
|
+
fileWriter.writeJSON('superuser.json', 'name', functName);
|
|
183
|
+
|
|
184
|
+
// Now we reload InstantPackage to verify
|
|
185
|
+
InstantPackage = await loadPackage(null, true);
|
|
186
|
+
|
|
187
|
+
console.log();
|
|
188
|
+
console.log(`Project "${colors.bold.blue(functName)}" initialized successfully!`);
|
|
189
|
+
console.log();
|
|
190
|
+
console.log(
|
|
191
|
+
drawBox.left(
|
|
192
|
+
`green`,
|
|
193
|
+
``,
|
|
194
|
+
colors.bold.green(`Success:`) + ` Instant tool package initialized!`,
|
|
195
|
+
`Here are some helpful commands to get started:`,
|
|
196
|
+
``,
|
|
197
|
+
`(1) Create a set of endpoints for a path (create, read, update, destroy):`,
|
|
198
|
+
colors.grey.bold(` $ ibot g:endpoint path/to/endpoint\n`),
|
|
199
|
+
`(2) Run your dev server:`,
|
|
200
|
+
colors.grey.bold(` $ ibot serve`),
|
|
201
|
+
``,
|
|
202
|
+
`For more information about ${colors.bold(`Superuser`)}:`,
|
|
203
|
+
` Home => ${colors.bold.underline.blue('https://instant.chat')}`,
|
|
204
|
+
` GitHub => ${colors.bold.underline.blue('https://github.com/instantbots')}`,
|
|
205
|
+
` Discord => ${colors.bold.underline.blue('https://discord.gg/instant')}`,
|
|
206
|
+
` X => ${colors.bold.underline.blue('https://x.com/instantbots')}`,
|
|
207
|
+
``,
|
|
208
|
+
colors.green.bold(`Happy building! :)`),
|
|
209
|
+
``
|
|
210
|
+
)
|
|
211
|
+
);
|
|
212
|
+
console.log();
|
|
213
|
+
|
|
214
|
+
return void 0;
|
|
215
|
+
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = InitCommand;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const io = require('io');
|
|
3
|
+
const colors = require('colors/safe');
|
|
4
|
+
const inquirer = require('inquirer');
|
|
5
|
+
|
|
6
|
+
const SettingsManager = require('../helpers/settings_manager.js');
|
|
7
|
+
const constants = require('../helpers/constants.js');
|
|
8
|
+
|
|
9
|
+
class LoginCommand extends Command {
|
|
10
|
+
|
|
11
|
+
constructor() {
|
|
12
|
+
super('login');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
help () {
|
|
16
|
+
return {
|
|
17
|
+
description: 'Login to the Superuser Package Registry',
|
|
18
|
+
args: [],
|
|
19
|
+
flags: {},
|
|
20
|
+
vflags: {
|
|
21
|
+
email: 'E-mail to login with',
|
|
22
|
+
password: 'Password to login with'
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async run (params) {
|
|
28
|
+
|
|
29
|
+
let host = (params.flags.h || [])[0] || constants.BASE_URL;
|
|
30
|
+
if (!host.startsWith('http://') && !host.startsWith('https://')) {
|
|
31
|
+
host = host.startsWith('localhost')
|
|
32
|
+
? `http://${host}`
|
|
33
|
+
: `https://${host}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let email = ((params.vflags.email || [])[0] || '').trim();
|
|
37
|
+
let password = ((params.vflags.password || [])[0] || '').trim();
|
|
38
|
+
|
|
39
|
+
const inquireList = [];
|
|
40
|
+
const requestParams = {};
|
|
41
|
+
|
|
42
|
+
if (!email) {
|
|
43
|
+
inquireList.push({
|
|
44
|
+
name: 'username',
|
|
45
|
+
type: 'input',
|
|
46
|
+
message: `E-mail / username`
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
requestParams['username'] = email;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!password) {
|
|
53
|
+
inquireList.push({
|
|
54
|
+
name: 'password',
|
|
55
|
+
type: 'password',
|
|
56
|
+
message: `Password`
|
|
57
|
+
});
|
|
58
|
+
} else {
|
|
59
|
+
requestParams['password'] = password;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let loginResult = await inquirer.prompt(inquireList);
|
|
63
|
+
|
|
64
|
+
const sendParams = {
|
|
65
|
+
...requestParams,
|
|
66
|
+
...loginResult,
|
|
67
|
+
grant_type: 'password'
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
let result = await io.post(
|
|
71
|
+
`${host}/auth`,
|
|
72
|
+
null,
|
|
73
|
+
null,
|
|
74
|
+
sendParams
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
if (result.statusCode !== 200) {
|
|
78
|
+
const e = result.data.error;
|
|
79
|
+
const message = e.message;
|
|
80
|
+
const details = e.details || {};
|
|
81
|
+
const more = [];
|
|
82
|
+
if (Object.keys(details).length) {
|
|
83
|
+
for (const key in details) {
|
|
84
|
+
more.push(`- ${colors.bold(key)}: ${details[key].message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw new Error(
|
|
88
|
+
message +
|
|
89
|
+
(
|
|
90
|
+
more.length
|
|
91
|
+
? '\n\n' + more.join('\n')
|
|
92
|
+
: ''
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const user = result.data; // grab json {data:}
|
|
98
|
+
const token = user.accessTokens[0];
|
|
99
|
+
|
|
100
|
+
console.log();
|
|
101
|
+
console.log(colors.bold(`${colors.cyan(`Logged in`)} to ${colors.green('Superuser')} successfully!`));
|
|
102
|
+
console.log(`${colors.bold(`email`)}: ${user.email}`);
|
|
103
|
+
if (user.memberships && user.memberships.length) {
|
|
104
|
+
console.log(`${colors.bold(`username`)}: ${user.memberships[0].organization.name}`);
|
|
105
|
+
}
|
|
106
|
+
console.log(`${colors.bold(`login at`)}: ${token.created_at}`);
|
|
107
|
+
console.log();
|
|
108
|
+
|
|
109
|
+
const data = {email: user.email, key: token.key};
|
|
110
|
+
if (host !== constants.BASE_URL) {
|
|
111
|
+
data.host = host;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Write settings
|
|
115
|
+
SettingsManager.write(data);
|
|
116
|
+
|
|
117
|
+
return void 0;
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
module.exports = LoginCommand;
|
package/commands/me.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const io = require('io');
|
|
3
|
+
const colors = require('colors/safe');
|
|
4
|
+
|
|
5
|
+
const constants = require('../helpers/constants.js');
|
|
6
|
+
const SettingsManager = require('../helpers/settings_manager.js');
|
|
7
|
+
|
|
8
|
+
class MeCommand extends Command {
|
|
9
|
+
|
|
10
|
+
constructor() {
|
|
11
|
+
super('me');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
help () {
|
|
15
|
+
return {
|
|
16
|
+
description: 'Retrieve your currently logged in user data',
|
|
17
|
+
args: [],
|
|
18
|
+
flags: {},
|
|
19
|
+
vflags: {}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async run (params) {
|
|
24
|
+
|
|
25
|
+
const settings = SettingsManager.read(true);
|
|
26
|
+
const host = settings.activeProfile.host || constants.BASE_URL;
|
|
27
|
+
|
|
28
|
+
console.log();
|
|
29
|
+
console.log(`Retrieving data for ${colors.bold(settings.activeProfile.email)} via ${colors.bold(host)}`);
|
|
30
|
+
console.log();
|
|
31
|
+
|
|
32
|
+
const result = await io.get(
|
|
33
|
+
`${host}/users/me`,
|
|
34
|
+
settings.activeProfile.key,
|
|
35
|
+
null,
|
|
36
|
+
{},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (result.statusCode !== 200) {
|
|
40
|
+
const message = result.data?.error?.message || `Invalid statusCode: ${result.statusCode}`;
|
|
41
|
+
throw new Error(message);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const user = result.data;
|
|
45
|
+
|
|
46
|
+
console.log(JSON.stringify(user, null, 2));
|
|
47
|
+
|
|
48
|
+
return void 0;
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = MeCommand;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const { Command } = require('cmnd');
|
|
2
|
+
const colors = require('colors/safe');
|
|
3
|
+
const inquirer = require('inquirer');
|
|
4
|
+
const io = require('io');
|
|
5
|
+
|
|
6
|
+
const constants = require('../../helpers/constants.js');
|
|
7
|
+
const SettingsManager = require('../../helpers/settings_manager.js');
|
|
8
|
+
const loadPackage = require('../../helpers/load_package.js');
|
|
9
|
+
|
|
10
|
+
class CreateOrganizationsCommand extends Command {
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
super('organizations', 'create');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
help () {
|
|
17
|
+
return {
|
|
18
|
+
description: 'Creates a new organization for a user',
|
|
19
|
+
args: [],
|
|
20
|
+
flags: {},
|
|
21
|
+
vflags: {}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async run (params) {
|
|
26
|
+
|
|
27
|
+
const settings = SettingsManager.read(true);
|
|
28
|
+
const host = settings.activeProfile.host || constants.BASE_URL;
|
|
29
|
+
const InstantPackage = await loadPackage(params, true);
|
|
30
|
+
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(`Creating organization for ${colors.bold(settings.activeProfile.email)} on ${colors.bold(host)} ...`);
|
|
33
|
+
console.log();
|
|
34
|
+
|
|
35
|
+
let createParams = await inquirer.prompt([{
|
|
36
|
+
name: 'name',
|
|
37
|
+
message: `Organization name`
|
|
38
|
+
}]);
|
|
39
|
+
|
|
40
|
+
const name = createParams.name;
|
|
41
|
+
|
|
42
|
+
const createResult = await io.post(
|
|
43
|
+
`${host}/v1/organizations`,
|
|
44
|
+
settings.activeProfile.key,
|
|
45
|
+
null,
|
|
46
|
+
{
|
|
47
|
+
name: name,
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
if (createResult.statusCode !== 200) {
|
|
52
|
+
if (createResult.data && createResult.data.error && createResult.data.error.message) {
|
|
53
|
+
throw new Error(createResult.data.error.message);
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(`Invalid response from server: statusCode ${createResult.statusCode}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(`Organization ${colors.bold(name)} created!`);
|
|
61
|
+
console.log();
|
|
62
|
+
return void 0;
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
module.exports = CreateOrganizationsCommand;
|