@sentio/cli 2.0.0-rc.1 → 2.0.0-rc.3
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/lib/build.js +28 -32
- package/lib/build.js.map +1 -1
- package/lib/cli.js +25 -28
- package/lib/cli.js.map +1 -1
- package/lib/commands/login-server.js +31 -36
- package/lib/commands/login-server.js.map +1 -1
- package/lib/commands/run-create.js +23 -28
- package/lib/commands/run-create.js.map +1 -1
- package/lib/commands/run-login.js +28 -33
- package/lib/commands/run-login.js.map +1 -1
- package/lib/commands/run-upload.d.ts +1 -1
- package/lib/commands/run-upload.js +62 -68
- package/lib/commands/run-upload.js.map +1 -1
- package/lib/commands/run-version.js +9 -14
- package/lib/commands/run-version.js.map +1 -1
- package/lib/config.js +4 -11
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/key.js +18 -24
- package/lib/key.js.map +1 -1
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +20 -14
- package/lib/utils.js.map +1 -1
- package/package.json +12 -12
- package/src/build.ts +13 -11
- package/src/cli.ts +6 -6
- package/src/commands/login-server.ts +12 -12
- package/src/commands/run-login.ts +4 -4
- package/src/commands/run-upload.ts +16 -13
- package/src/commands/run-version.ts +1 -1
- package/src/index.ts +1 -0
- package/src/utils.ts +18 -3
- package/templates/aptos/jest.config.ts +8 -0
- package/templates/aptos/package.json +1 -0
- package/templates/aptos/src/processor.ts +3 -3
- package/templates/aptos/tsconfig.json +3 -2
- package/templates/evm/jest.config.ts +8 -0
- package/templates/evm/package.json +1 -0
- package/templates/evm/src/processor.ts +3 -3
- package/templates/evm/tsconfig.json +3 -2
- package/templates/raw/jest.config.ts +8 -0
- package/templates/raw/package.json +1 -0
- package/templates/raw/tsconfig.json +3 -2
- package/templates/solana/jest.config.ts +8 -0
- package/templates/solana/package.json +1 -0
- package/templates/solana/src/processor.ts +1 -1
- package/templates/solana/tsconfig.json +3 -2
- package/lib/webpack.config.js +0 -50
- package/src/webpack.config.js +0 -50
- package/templates/aptos/jest.config.js +0 -7
- package/templates/evm/jest.config.js +0 -7
- package/templates/raw/jest.config.js +0 -7
- package/templates/raw/yarn.lock +0 -4095
- package/templates/solana/jest.config.js +0 -7
- package/templates/solana/yarn.lock +0 -4918
package/lib/build.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const child_process_1 = require("child_process");
|
|
9
|
-
async function buildProcessor(onlyGen) {
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { exec } from 'child_process';
|
|
5
|
+
import * as process from 'process';
|
|
6
|
+
import { getPackageRoot } from './utils.js';
|
|
7
|
+
export async function buildProcessor(onlyGen) {
|
|
10
8
|
if (!onlyGen) {
|
|
11
9
|
await installDeps();
|
|
12
10
|
}
|
|
@@ -17,29 +15,28 @@ async function buildProcessor(onlyGen) {
|
|
|
17
15
|
if (!onlyGen) {
|
|
18
16
|
let WEBPACK_CONFIG;
|
|
19
17
|
try {
|
|
20
|
-
WEBPACK_CONFIG =
|
|
18
|
+
WEBPACK_CONFIG = path.resolve(getPackageRoot('@sentio/sdk'), 'lib/tsup.config.ts');
|
|
21
19
|
}
|
|
22
20
|
catch (e) {
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
console.error(chalk.red("Wrong CLI version for sdk, can't find tsup.config.ts"));
|
|
22
|
+
process.exit(1);
|
|
25
23
|
}
|
|
26
24
|
await execStep('yarn tsc -p .', 'Compile');
|
|
27
|
-
await execStep('yarn
|
|
25
|
+
await execStep('yarn tsup --config=' + WEBPACK_CONFIG, 'Packaging');
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
|
-
exports.buildProcessor = buildProcessor;
|
|
31
28
|
async function buildProcessorForTarget(onlyGen) {
|
|
32
|
-
await codeGenEthersProcessor(
|
|
29
|
+
await codeGenEthersProcessor(path.join('abis', 'evm'));
|
|
33
30
|
try {
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
|
|
31
|
+
// @ts-ignore dynamic import
|
|
32
|
+
const codegen = await import('@sentio/sdk-solana/codegen');
|
|
33
|
+
codegen.codeGenSolanaProcessor(path.join('abis', 'solana'));
|
|
37
34
|
}
|
|
38
35
|
catch (e) { }
|
|
39
36
|
try {
|
|
40
|
-
//
|
|
41
|
-
const
|
|
42
|
-
|
|
37
|
+
// @ts-ignore dynamic import
|
|
38
|
+
const codegen = await import('@sentio/sdk-aptos/codegen');
|
|
39
|
+
codegen.codeGenAptosProcessor(path.join('abis', 'aptos'));
|
|
43
40
|
}
|
|
44
41
|
catch (e) { }
|
|
45
42
|
if (onlyGen) {
|
|
@@ -49,12 +46,12 @@ async function buildProcessorForTarget(onlyGen) {
|
|
|
49
46
|
async function installDeps() {
|
|
50
47
|
await execStep('yarn install --ignore-scripts', 'Yarn Install');
|
|
51
48
|
}
|
|
52
|
-
async function codeGenEthersProcessor(abisDir, ETHERS_TARGET =
|
|
53
|
-
if (!
|
|
49
|
+
export async function codeGenEthersProcessor(abisDir, ETHERS_TARGET = path.resolve(getPackageRoot('@sentio/sdk'), 'lib/target-ethers-sentio/index.cjs'), outDir = 'src/types/internal') {
|
|
50
|
+
if (!fs.existsSync(abisDir)) {
|
|
54
51
|
return;
|
|
55
52
|
}
|
|
56
53
|
let haveJson = false;
|
|
57
|
-
const files =
|
|
54
|
+
const files = fs.readdirSync(abisDir);
|
|
58
55
|
for (const file of files) {
|
|
59
56
|
if (file.toLowerCase().endsWith('.json')) {
|
|
60
57
|
haveJson = true;
|
|
@@ -64,16 +61,15 @@ async function codeGenEthersProcessor(abisDir, ETHERS_TARGET = path_1.default.di
|
|
|
64
61
|
if (!haveJson) {
|
|
65
62
|
return;
|
|
66
63
|
}
|
|
67
|
-
console.log(
|
|
64
|
+
console.log(chalk.green('Generated Types for EVM'));
|
|
68
65
|
// TODO this will fail during postinstall, need to locate real typechain path
|
|
69
|
-
await execStep('yarn typechain --target ' + ETHERS_TARGET + ` --out-dir ${outDir} ${
|
|
66
|
+
await execStep('yarn typechain --target ' + ETHERS_TARGET + ` --out-dir ${outDir} ${path.join(abisDir, '*.json')}`, 'Type definitions gen');
|
|
70
67
|
}
|
|
71
|
-
exports.codeGenEthersProcessor = codeGenEthersProcessor;
|
|
72
68
|
async function execStep(cmd, stepName) {
|
|
73
|
-
const child =
|
|
74
|
-
console.log(
|
|
69
|
+
const child = exec(cmd);
|
|
70
|
+
console.log(chalk.blue(stepName + ' begin'));
|
|
75
71
|
if (!child.stdout || !child.stderr) {
|
|
76
|
-
console.error(
|
|
72
|
+
console.error(chalk.red(stepName + ' failed'));
|
|
77
73
|
process.exit(1);
|
|
78
74
|
}
|
|
79
75
|
child.stdout.pipe(process.stdout);
|
|
@@ -82,10 +78,10 @@ async function execStep(cmd, stepName) {
|
|
|
82
78
|
child.on('close', resolve);
|
|
83
79
|
});
|
|
84
80
|
if (child.exitCode) {
|
|
85
|
-
console.error(
|
|
81
|
+
console.error(chalk.red(stepName + ' failed'));
|
|
86
82
|
process.exit(child.exitCode);
|
|
87
83
|
}
|
|
88
|
-
console.log(
|
|
84
|
+
console.log(chalk.blue(stepName + ' success'));
|
|
89
85
|
console.log();
|
|
90
86
|
}
|
|
91
87
|
//# sourceMappingURL=build.js.map
|
package/lib/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport path from 'path'\nimport fs from 'fs'\nimport { exec } from 'child_process'\nimport * as process from 'process'\nimport { getPackageRoot } from './utils.js'\n\nexport async function buildProcessor(onlyGen: boolean) {\n if (!onlyGen) {\n await installDeps()\n }\n\n // targets.forEach(async (target) => await buildProcessorForTarget(onlyGen, target))\n // for (const target) {\n await buildProcessorForTarget(onlyGen)\n // }\n\n if (!onlyGen) {\n let WEBPACK_CONFIG: string\n try {\n WEBPACK_CONFIG = path.resolve(getPackageRoot('@sentio/sdk'), 'lib/tsup.config.ts')\n } catch (e) {\n console.error(chalk.red(\"Wrong CLI version for sdk, can't find tsup.config.ts\"))\n process.exit(1)\n }\n await execStep('yarn tsc -p .', 'Compile')\n await execStep('yarn tsup --config=' + WEBPACK_CONFIG, 'Packaging')\n }\n}\n\nasync function buildProcessorForTarget(onlyGen: boolean) {\n await codeGenEthersProcessor(path.join('abis', 'evm'))\n\n try {\n // @ts-ignore dynamic import\n const codegen = await import('@sentio/sdk-solana/codegen')\n codegen.codeGenSolanaProcessor(path.join('abis', 'solana'))\n } catch (e) {}\n\n try {\n // @ts-ignore dynamic import\n const codegen = await import('@sentio/sdk-aptos/codegen')\n codegen.codeGenAptosProcessor(path.join('abis', 'aptos'))\n } catch (e) {}\n\n if (onlyGen) {\n return\n }\n}\n\nasync function installDeps() {\n await execStep('yarn install --ignore-scripts', 'Yarn Install')\n}\n\nexport async function codeGenEthersProcessor(\n abisDir: string,\n ETHERS_TARGET = path.resolve(getPackageRoot('@sentio/sdk'), 'lib/target-ethers-sentio/index.cjs'),\n outDir = 'src/types/internal'\n) {\n if (!fs.existsSync(abisDir)) {\n return\n }\n\n let haveJson = false\n const files = fs.readdirSync(abisDir)\n for (const file of files) {\n if (file.toLowerCase().endsWith('.json')) {\n haveJson = true\n break\n }\n }\n if (!haveJson) {\n return\n }\n\n console.log(chalk.green('Generated Types for EVM'))\n\n // TODO this will fail during postinstall, need to locate real typechain path\n await execStep(\n 'yarn typechain --target ' + ETHERS_TARGET + ` --out-dir ${outDir} ${path.join(abisDir, '*.json')}`,\n 'Type definitions gen'\n )\n}\n\nasync function execStep(cmd: string, stepName: string) {\n const child = exec(cmd)\n console.log(chalk.blue(stepName + ' begin'))\n\n if (!child.stdout || !child.stderr) {\n console.error(chalk.red(stepName + ' failed'))\n process.exit(1)\n }\n\n child.stdout.pipe(process.stdout)\n child.stderr.pipe(process.stderr)\n\n await new Promise((resolve) => {\n child.on('close', resolve)\n })\n\n if (child.exitCode) {\n console.error(chalk.red(stepName + ' failed'))\n process.exit(child.exitCode)\n }\n console.log(chalk.blue(stepName + ' success'))\n console.log()\n}\n"]}
|
package/lib/cli.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const run_version_1 = require("./commands/run-version");
|
|
14
|
-
const run_login_1 = require("./commands/run-login");
|
|
15
|
-
const run_upload_1 = require("./commands/run-upload");
|
|
2
|
+
import commandLineArgs from 'command-line-args';
|
|
3
|
+
import commandLineUsage from 'command-line-usage';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import yaml from 'js-yaml';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { buildProcessor } from './build.js';
|
|
9
|
+
import { runCreate } from './commands/run-create.js';
|
|
10
|
+
import { runVersion } from './commands/run-version.js';
|
|
11
|
+
import { runLogin } from './commands/run-login.js';
|
|
12
|
+
import { runUpload } from './commands/run-upload.js';
|
|
16
13
|
const mainDefinitions = [{ name: 'command', defaultOption: true }];
|
|
17
|
-
const mainOptions = (
|
|
14
|
+
const mainOptions = commandLineArgs(mainDefinitions, {
|
|
18
15
|
stopAtFirstUnknown: true,
|
|
19
16
|
});
|
|
20
17
|
const argv = mainOptions._unknown || [];
|
|
@@ -22,13 +19,13 @@ if (!mainOptions.command) {
|
|
|
22
19
|
usage();
|
|
23
20
|
}
|
|
24
21
|
if (mainOptions.command === 'login') {
|
|
25
|
-
|
|
22
|
+
runLogin(argv);
|
|
26
23
|
}
|
|
27
24
|
else if (mainOptions.command === 'create') {
|
|
28
|
-
|
|
25
|
+
runCreate(argv);
|
|
29
26
|
}
|
|
30
27
|
else if (mainOptions.command === 'version') {
|
|
31
|
-
|
|
28
|
+
runVersion(argv);
|
|
32
29
|
}
|
|
33
30
|
else {
|
|
34
31
|
// For all the commands that need read project configs
|
|
@@ -37,20 +34,20 @@ else {
|
|
|
37
34
|
let processorConfig = { host: '', project: '', build: true, debug: false };
|
|
38
35
|
// Fist step, read from project yaml file
|
|
39
36
|
try {
|
|
40
|
-
console.log(
|
|
37
|
+
console.log(chalk.blue('Loading Process config'));
|
|
41
38
|
// TODO correctly located sentio.yaml
|
|
42
39
|
const pwd = process.cwd();
|
|
43
|
-
const packageJson =
|
|
44
|
-
if (!
|
|
40
|
+
const packageJson = path.join(pwd, 'package.json');
|
|
41
|
+
if (!fs.existsSync(packageJson)) {
|
|
45
42
|
console.error('package.json not found, please run this command in the root of your project');
|
|
46
43
|
process.exit(1);
|
|
47
44
|
}
|
|
48
|
-
const yamlPath =
|
|
49
|
-
if (!
|
|
45
|
+
const yamlPath = path.join(pwd, 'sentio.yaml');
|
|
46
|
+
if (!fs.existsSync(yamlPath)) {
|
|
50
47
|
console.error('sentio.yaml not found, please create one according to: TODO docs');
|
|
51
48
|
process.exit(1);
|
|
52
49
|
}
|
|
53
|
-
processorConfig =
|
|
50
|
+
processorConfig = yaml.load(fs.readFileSync('sentio.yaml', 'utf8'));
|
|
54
51
|
if (!processorConfig.project === undefined) {
|
|
55
52
|
console.error('Config yaml must have contain a valid project identifier');
|
|
56
53
|
process.exit(1);
|
|
@@ -81,20 +78,20 @@ else {
|
|
|
81
78
|
process.exit(1);
|
|
82
79
|
}
|
|
83
80
|
if (mainOptions.command === 'upload') {
|
|
84
|
-
|
|
81
|
+
runUpload(processorConfig, argv);
|
|
85
82
|
}
|
|
86
83
|
else if (mainOptions.command === 'build') {
|
|
87
|
-
|
|
84
|
+
buildProcessor(false);
|
|
88
85
|
}
|
|
89
86
|
else if (mainOptions.command === 'gen') {
|
|
90
|
-
|
|
87
|
+
buildProcessor(true);
|
|
91
88
|
}
|
|
92
89
|
else {
|
|
93
90
|
usage();
|
|
94
91
|
}
|
|
95
92
|
}
|
|
96
93
|
function usage() {
|
|
97
|
-
const usage = (
|
|
94
|
+
const usage = commandLineUsage([
|
|
98
95
|
{
|
|
99
96
|
header: 'Sentio',
|
|
100
97
|
content: 'Login & Manage your project files to Sentio.',
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport fs from 'fs'\nimport path from 'path'\n\nimport yaml from 'js-yaml'\nimport { SentioProjectConfig } from './config.js'\nimport chalk from 'chalk'\nimport { buildProcessor } from './build.js'\nimport { runCreate } from './commands/run-create.js'\nimport { runVersion } from './commands/run-version.js'\nimport { runLogin } from './commands/run-login.js'\nimport { runUpload } from './commands/run-upload.js'\n\nconst mainDefinitions = [{ name: 'command', defaultOption: true }]\nconst mainOptions = commandLineArgs(mainDefinitions, {\n stopAtFirstUnknown: true,\n})\nconst argv = mainOptions._unknown || []\n\nif (!mainOptions.command) {\n usage()\n}\n\nif (mainOptions.command === 'login') {\n runLogin(argv)\n} else if (mainOptions.command === 'create') {\n runCreate(argv)\n} else if (mainOptions.command === 'version') {\n runVersion(argv)\n} else {\n // For all the commands that need read project configs\n // TODO move them to their own modules\n\n // Process configs\n let processorConfig: SentioProjectConfig = { host: '', project: '', build: true, debug: false }\n // Fist step, read from project yaml file\n try {\n console.log(chalk.blue('Loading Process config'))\n // TODO correctly located sentio.yaml\n const pwd = process.cwd()\n const packageJson = path.join(pwd, 'package.json')\n if (!fs.existsSync(packageJson)) {\n console.error('package.json not found, please run this command in the root of your project')\n process.exit(1)\n }\n\n const yamlPath = path.join(pwd, 'sentio.yaml')\n if (!fs.existsSync(yamlPath)) {\n console.error('sentio.yaml not found, please create one according to: TODO docs')\n process.exit(1)\n }\n\n processorConfig = yaml.load(fs.readFileSync('sentio.yaml', 'utf8')) as SentioProjectConfig\n if (!processorConfig.project === undefined) {\n console.error('Config yaml must have contain a valid project identifier')\n process.exit(1)\n }\n if (processorConfig.build === undefined) {\n processorConfig.build = true\n }\n if (!processorConfig.host) {\n processorConfig.host = 'prod'\n }\n if (processorConfig.debug === undefined) {\n processorConfig.debug = false\n }\n\n // if (!processorConfig.source) {\n // processorConfig.source = 'src/processor.ts'\n // }\n // if (!processorConfig.targets) {\n // console.warn('targets is not defined, use EVM as the default target')\n // processorConfig.targets = []\n // }\n // if (processorConfig.targets.length === 0) {\n // // By default evm\n // processorConfig.targets.push({ chain: EVM })\n // }\n } catch (e) {\n console.error(e)\n process.exit(1)\n }\n\n if (mainOptions.command === 'upload') {\n runUpload(processorConfig, argv)\n } else if (mainOptions.command === 'build') {\n buildProcessor(false)\n } else if (mainOptions.command === 'gen') {\n buildProcessor(true)\n } else {\n usage()\n }\n}\n\nfunction usage() {\n const usage = commandLineUsage([\n {\n header: 'Sentio',\n content: 'Login & Manage your project files to Sentio.',\n },\n {\n header: 'Usage',\n content: [\n 'sentio <command> --help\\t\\tshow detail usage of specific command',\n 'sentio login\\t\\t\\t\\tlogin to sentio',\n 'sentio create\\t\\t\\t\\tcreate a template project',\n 'sentio upload\\t\\t\\t\\tbuild and upload processor to sentio',\n 'sentio gen\\t\\t\\t\\tgenerate abi',\n 'sentio build\\t\\t\\t\\tgenerate abi and build',\n 'sentio version\\t\\t\\tcurrent cli version',\n ],\n },\n ])\n console.log(usage)\n process.exit(1)\n}\n"]}
|
|
@@ -1,31 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
12
|
-
const os_1 = tslib_1.__importDefault(require("os"));
|
|
13
|
-
const crypto = tslib_1.__importStar(require("crypto"));
|
|
14
|
-
const app = (0, express_1.default)();
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { getAuthConfig, getFinalizedHost } from '../config.js';
|
|
3
|
+
import url, { URL } from 'url';
|
|
4
|
+
import fetch from 'node-fetch';
|
|
5
|
+
import { getCliVersion } from '../utils.js';
|
|
6
|
+
import { WriteKey } from '../key.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import * as crypto from 'crypto';
|
|
10
|
+
const app = express();
|
|
15
11
|
let server;
|
|
16
12
|
let authParams;
|
|
17
|
-
function startServer(params) {
|
|
13
|
+
export function startServer(params) {
|
|
18
14
|
authParams = params;
|
|
19
15
|
server = app.listen(params.serverPort);
|
|
20
16
|
}
|
|
21
|
-
exports.startServer = startServer;
|
|
22
17
|
app.get('/callback', async (req, res) => {
|
|
23
18
|
const fail = function (...args) {
|
|
24
|
-
console.error(
|
|
19
|
+
console.error(chalk.red(args));
|
|
25
20
|
res.end(args.toString());
|
|
26
21
|
server.close();
|
|
27
22
|
};
|
|
28
|
-
const host =
|
|
23
|
+
const host = getFinalizedHost(authParams.sentioHost);
|
|
29
24
|
const code = req.query.code;
|
|
30
25
|
if (!code || code.length == 0) {
|
|
31
26
|
fail('Failed to get authorization code');
|
|
@@ -37,8 +32,8 @@ app.get('/callback', async (req, res) => {
|
|
|
37
32
|
fail(`Failed to get access token: ${tokenResRaw.status} ${tokenResRaw.statusText}`);
|
|
38
33
|
return;
|
|
39
34
|
}
|
|
40
|
-
const tokenRes = await tokenResRaw.json();
|
|
41
|
-
const accessToken = tokenRes
|
|
35
|
+
const tokenRes = (await tokenResRaw.json());
|
|
36
|
+
const accessToken = tokenRes.access_token;
|
|
42
37
|
// check if the account is ready
|
|
43
38
|
const userResRaw = await getUser(host, accessToken);
|
|
44
39
|
if (!userResRaw.ok) {
|
|
@@ -50,35 +45,35 @@ app.get('/callback', async (req, res) => {
|
|
|
50
45
|
}
|
|
51
46
|
return;
|
|
52
47
|
}
|
|
53
|
-
const userRes = await userResRaw.json();
|
|
48
|
+
const userRes = (await userResRaw.json());
|
|
54
49
|
if (!userRes.emailVerified) {
|
|
55
50
|
fail('Your account is not verified, please verify your email first');
|
|
56
51
|
return;
|
|
57
52
|
}
|
|
58
53
|
// create API key
|
|
59
|
-
const apiKeyName = `${
|
|
54
|
+
const apiKeyName = `${os.hostname()}-${crypto.randomBytes(4).toString('hex')}`;
|
|
60
55
|
const createApiKeyResRaw = await createApiKey(host, apiKeyName, 'sdk_generated', accessToken);
|
|
61
56
|
if (!createApiKeyResRaw.ok) {
|
|
62
57
|
fail(`Failed to create API key: ${createApiKeyResRaw.status} ${createApiKeyResRaw.statusText}`);
|
|
63
58
|
return;
|
|
64
59
|
}
|
|
65
|
-
const createApiKeyRes = await createApiKeyResRaw.json();
|
|
66
|
-
const apiKey = createApiKeyRes
|
|
67
|
-
|
|
68
|
-
res.end(
|
|
69
|
-
console.log(
|
|
60
|
+
const createApiKeyRes = (await createApiKeyResRaw.json());
|
|
61
|
+
const apiKey = createApiKeyRes.key;
|
|
62
|
+
WriteKey(host, apiKey);
|
|
63
|
+
res.end('Login success, please go back to CLI to continue');
|
|
64
|
+
console.log(chalk.green('Login success, new API key: ' + apiKey));
|
|
70
65
|
server.close();
|
|
71
66
|
});
|
|
72
67
|
async function getToken(host, code) {
|
|
73
|
-
const authConf =
|
|
74
|
-
const params = new
|
|
68
|
+
const authConf = getAuthConfig(host);
|
|
69
|
+
const params = new url.URLSearchParams({
|
|
75
70
|
grant_type: 'authorization_code',
|
|
76
71
|
client_id: authConf.clientId,
|
|
77
72
|
code_verifier: authParams.codeVerifier,
|
|
78
73
|
code: code,
|
|
79
74
|
redirect_uri: `http://localhost:${authParams.serverPort}/callback`,
|
|
80
75
|
});
|
|
81
|
-
return (
|
|
76
|
+
return fetch(`${authConf.domain}/oauth/token`, {
|
|
82
77
|
method: 'POST',
|
|
83
78
|
headers: {
|
|
84
79
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
@@ -87,12 +82,12 @@ async function getToken(host, code) {
|
|
|
87
82
|
});
|
|
88
83
|
}
|
|
89
84
|
async function createApiKey(host, name, source, accessToken) {
|
|
90
|
-
const createApiKeyUrl = new
|
|
91
|
-
return (
|
|
85
|
+
const createApiKeyUrl = new URL('/api/v1/keys', host);
|
|
86
|
+
return fetch(createApiKeyUrl.href, {
|
|
92
87
|
method: 'POST',
|
|
93
88
|
headers: {
|
|
94
89
|
Authorization: 'Bearer ' + accessToken,
|
|
95
|
-
version:
|
|
90
|
+
version: getCliVersion(),
|
|
96
91
|
},
|
|
97
92
|
body: JSON.stringify({
|
|
98
93
|
name: name,
|
|
@@ -102,12 +97,12 @@ async function createApiKey(host, name, source, accessToken) {
|
|
|
102
97
|
});
|
|
103
98
|
}
|
|
104
99
|
async function getUser(host, accessToken) {
|
|
105
|
-
const getUserUrl = new
|
|
106
|
-
return (
|
|
100
|
+
const getUserUrl = new URL('/api/v1/users', host);
|
|
101
|
+
return fetch(getUserUrl.href, {
|
|
107
102
|
method: 'GET',
|
|
108
103
|
headers: {
|
|
109
104
|
Authorization: 'Bearer ' + accessToken,
|
|
110
|
-
version:
|
|
105
|
+
version: getCliVersion(),
|
|
111
106
|
},
|
|
112
107
|
});
|
|
113
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-server.js","sourceRoot":"","sources":["../../src/commands/login-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login-server.js","sourceRoot":"","sources":["../../src/commands/login-server.ts"],"names":[],"mappings":"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","sourcesContent":["import express from 'express'\nimport { getAuthConfig, getFinalizedHost } from '../config.js'\nimport url, { URL } from 'url'\nimport fetch from 'node-fetch'\nimport { getCliVersion } from '../utils.js'\nimport { WriteKey } from '../key.js'\nimport chalk from 'chalk'\nimport http from 'http'\nimport os from 'os'\nimport * as crypto from 'crypto'\n\ninterface AuthParams {\n serverPort: number\n sentioHost: string\n codeVerifier: string\n}\n\nconst app = express()\n\nlet server: http.Server\nlet authParams: AuthParams\n\nexport function startServer(params: AuthParams) {\n authParams = params\n server = app.listen(params.serverPort)\n}\n\napp.get('/callback', async (req, res) => {\n const fail = function (...args: any[]) {\n console.error(chalk.red(args))\n res.end(args.toString())\n server.close()\n }\n\n const host = getFinalizedHost(authParams.sentioHost)\n const code = req.query.code\n if (!code || (code as string).length == 0) {\n fail('Failed to get authorization code')\n return\n }\n\n // exchange token\n const tokenResRaw = await getToken(host, code as string)\n if (!tokenResRaw.ok) {\n fail(`Failed to get access token: ${tokenResRaw.status} ${tokenResRaw.statusText}`)\n return\n }\n const tokenRes = (await tokenResRaw.json()) as { access_token: string }\n const accessToken = tokenRes.access_token\n\n // check if the account is ready\n const userResRaw = await getUser(host, accessToken)\n if (!userResRaw.ok) {\n if (userResRaw.status == 401) {\n fail('The account does not exist, please sign up on sentio first')\n } else {\n fail(`Failed to get user info: ${userResRaw.status} ${userResRaw.statusText}`)\n }\n return\n }\n const userRes = (await userResRaw.json()) as { emailVerified: boolean }\n if (!userRes.emailVerified) {\n fail('Your account is not verified, please verify your email first')\n return\n }\n\n // create API key\n const apiKeyName = `${os.hostname()}-${crypto.randomBytes(4).toString('hex')}`\n const createApiKeyResRaw = await createApiKey(host, apiKeyName, 'sdk_generated', accessToken)\n if (!createApiKeyResRaw.ok) {\n fail(`Failed to create API key: ${createApiKeyResRaw.status} ${createApiKeyResRaw.statusText}`)\n return\n }\n const createApiKeyRes = (await createApiKeyResRaw.json()) as { key: string }\n const apiKey = createApiKeyRes.key\n WriteKey(host, apiKey)\n\n res.end('Login success, please go back to CLI to continue')\n console.log(chalk.green('Login success, new API key: ' + apiKey))\n\n server.close()\n})\n\nasync function getToken(host: string, code: string) {\n const authConf = getAuthConfig(host)\n const params = new url.URLSearchParams({\n grant_type: 'authorization_code',\n client_id: authConf.clientId,\n code_verifier: authParams.codeVerifier,\n code: code,\n redirect_uri: `http://localhost:${authParams.serverPort}/callback`,\n })\n return fetch(`${authConf.domain}/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n })\n}\n\nasync function createApiKey(host: string, name: string, source: string, accessToken: string) {\n const createApiKeyUrl = new URL('/api/v1/keys', host)\n return fetch(createApiKeyUrl.href, {\n method: 'POST',\n headers: {\n Authorization: 'Bearer ' + accessToken,\n version: getCliVersion(),\n },\n body: JSON.stringify({\n name: name,\n scopes: ['write:project'],\n source: source,\n }),\n })\n}\n\nasync function getUser(host: string, accessToken: string) {\n const getUserUrl = new URL('/api/v1/users', host)\n return fetch(getUserUrl.href, {\n method: 'GET',\n headers: {\n Authorization: 'Bearer ' + accessToken,\n version: getCliVersion(),\n },\n })\n}\n"]}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
9
|
-
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
10
|
-
const latest_version_1 = tslib_1.__importDefault(require("latest-version"));
|
|
11
|
-
async function runCreate(argv) {
|
|
1
|
+
import commandLineArgs from 'command-line-args';
|
|
2
|
+
import commandLineUsage from 'command-line-usage';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import latestVersion from 'latest-version';
|
|
7
|
+
export async function runCreate(argv) {
|
|
12
8
|
const optionDefinitions = [
|
|
13
9
|
{
|
|
14
10
|
name: 'help',
|
|
@@ -43,8 +39,8 @@ async function runCreate(argv) {
|
|
|
43
39
|
defaultValue: 'evm',
|
|
44
40
|
},
|
|
45
41
|
];
|
|
46
|
-
const options = (
|
|
47
|
-
const usage = (
|
|
42
|
+
const options = commandLineArgs(optionDefinitions, { argv });
|
|
43
|
+
const usage = commandLineUsage([
|
|
48
44
|
{
|
|
49
45
|
header: 'Create a template project',
|
|
50
46
|
content: 'sentio create <name>',
|
|
@@ -69,19 +65,19 @@ async function runCreate(argv) {
|
|
|
69
65
|
case 'solana':
|
|
70
66
|
break;
|
|
71
67
|
default:
|
|
72
|
-
console.error(
|
|
68
|
+
console.error(chalk.red('non supported chain-type for template creation, use --help for more information.'));
|
|
73
69
|
console.log(usage);
|
|
74
70
|
process.exit(1);
|
|
75
71
|
}
|
|
76
|
-
const templateFolder =
|
|
72
|
+
const templateFolder = path.resolve(__dirname, '../../templates', chainType);
|
|
77
73
|
const projectName = options.name || 'default';
|
|
78
74
|
const rootDir = options.directory || process.cwd();
|
|
79
|
-
const dstFolder =
|
|
80
|
-
if (
|
|
81
|
-
console.error(
|
|
75
|
+
const dstFolder = path.resolve(rootDir, projectName);
|
|
76
|
+
if (fs.existsSync(dstFolder)) {
|
|
77
|
+
console.error(chalk.red("can't create project '" + projectName + "', directory already existed"));
|
|
82
78
|
process.exit(1);
|
|
83
79
|
}
|
|
84
|
-
|
|
80
|
+
fs.copySync(templateFolder, dstFolder, {
|
|
85
81
|
filter: (src, _) => {
|
|
86
82
|
// TODO read from .gitignore to be more reliable
|
|
87
83
|
if (src.endsWith('types') ||
|
|
@@ -96,11 +92,11 @@ async function runCreate(argv) {
|
|
|
96
92
|
overwrite: false,
|
|
97
93
|
});
|
|
98
94
|
if (options.name) {
|
|
99
|
-
const sentioYamlPath =
|
|
100
|
-
|
|
101
|
-
const packageJsonPath =
|
|
102
|
-
const packageJson = JSON.parse(
|
|
103
|
-
const sdkVersion = '^' + (await (
|
|
95
|
+
const sentioYamlPath = path.resolve(dstFolder, 'sentio.yaml');
|
|
96
|
+
fs.writeFileSync(sentioYamlPath, 'project: ' + projectName + '\n', { flag: 'w+' });
|
|
97
|
+
const packageJsonPath = path.resolve(dstFolder, 'package.json');
|
|
98
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
99
|
+
const sdkVersion = '^' + (await latestVersion('@sentio/sdk'));
|
|
104
100
|
packageJson.dependencies['@sentio/sdk'] = sdkVersion;
|
|
105
101
|
switch (chainType) {
|
|
106
102
|
case 'aptos':
|
|
@@ -111,7 +107,7 @@ async function runCreate(argv) {
|
|
|
111
107
|
break;
|
|
112
108
|
default:
|
|
113
109
|
}
|
|
114
|
-
const cliVersion = '^' + (await (
|
|
110
|
+
const cliVersion = '^' + (await latestVersion('@sentio/cli'));
|
|
115
111
|
packageJson.devDependencies['@sentio/cli'] = cliVersion;
|
|
116
112
|
packageJson.name = projectName;
|
|
117
113
|
if (options.subproject) {
|
|
@@ -122,10 +118,9 @@ async function runCreate(argv) {
|
|
|
122
118
|
}
|
|
123
119
|
// Don't add directly to avoid deps issue
|
|
124
120
|
packageJson.scripts.postinstall = 'sentio gen';
|
|
125
|
-
|
|
121
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
126
122
|
}
|
|
127
|
-
console.log(
|
|
123
|
+
console.log(chalk.green("successfully create project '" + projectName + "'"));
|
|
128
124
|
}
|
|
129
125
|
}
|
|
130
|
-
exports.runCreate = runCreate;
|
|
131
126
|
//# sourceMappingURL=run-create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-create.js","sourceRoot":"","sources":["../../src/commands/run-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-create.js","sourceRoot":"","sources":["../../src/commands/run-create.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport path from 'path'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\nimport latestVersion from 'latest-version'\n\nexport async function runCreate(argv: string[]) {\n const optionDefinitions = [\n {\n name: 'help',\n alias: 'h',\n type: Boolean,\n description: 'Display this usage guide.',\n },\n {\n name: 'name',\n alias: 'n',\n defaultOption: true,\n type: String,\n description: 'Project name',\n },\n {\n name: 'subproject',\n alias: 'p',\n type: Boolean,\n description:\n 'If this is a subproject in mono-repo setup, in this case sdk version is controlled in parent package.json.',\n },\n {\n name: 'directory',\n alias: 'd',\n description: '(Optional) The root direct new project will be created, default current working dir',\n type: String,\n },\n {\n name: 'chain-type',\n alias: 'c',\n description:\n 'The type of project you want to create, can be evm, aptos, solana, raw (if you want to start from scratch and support multiple types of chains)',\n type: String,\n defaultValue: 'evm',\n },\n ]\n\n const options = commandLineArgs(optionDefinitions, { argv })\n const usage = commandLineUsage([\n {\n header: 'Create a template project',\n content: 'sentio create <name>',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n\n if (options.help || !options.name) {\n console.log(usage)\n } else {\n const chainType: string = options['chain-type'].toLowerCase()\n switch (chainType) {\n case 'evm':\n break\n case 'aptos':\n break\n case 'raw':\n break\n case 'solana':\n break\n default:\n console.error(chalk.red('non supported chain-type for template creation, use --help for more information.'))\n console.log(usage)\n process.exit(1)\n }\n const templateFolder = path.resolve(__dirname, '../../templates', chainType)\n const projectName = options.name || 'default'\n\n const rootDir = options.directory || process.cwd()\n const dstFolder = path.resolve(rootDir, projectName)\n if (fs.existsSync(dstFolder)) {\n console.error(chalk.red(\"can't create project '\" + projectName + \"', directory already existed\"))\n process.exit(1)\n }\n\n fs.copySync(templateFolder, dstFolder, {\n filter: (src, _) => {\n // TODO read from .gitignore to be more reliable\n if (\n src.endsWith('types') ||\n src.endsWith('dist') ||\n src.endsWith('node_modules') ||\n src.endsWith('.lock') ||\n src.endsWith('dist')\n ) {\n return false\n }\n return true\n },\n overwrite: false,\n })\n if (options.name) {\n const sentioYamlPath = path.resolve(dstFolder, 'sentio.yaml')\n fs.writeFileSync(sentioYamlPath, 'project: ' + projectName + '\\n', { flag: 'w+' })\n\n const packageJsonPath = path.resolve(dstFolder, 'package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))\n\n const sdkVersion = '^' + (await latestVersion('@sentio/sdk'))\n packageJson.dependencies['@sentio/sdk'] = sdkVersion\n\n switch (chainType) {\n case 'aptos':\n packageJson.dependencies['@sentio/sdk-aptos'] = sdkVersion\n break\n case 'solana':\n packageJson.dependencies['@sentio/sdk-solana'] = sdkVersion\n break\n default:\n }\n\n const cliVersion = '^' + (await latestVersion('@sentio/cli'))\n packageJson.devDependencies['@sentio/cli'] = cliVersion\n packageJson.name = projectName\n\n if (options.subproject) {\n delete packageJson.dependencies['@sentio/sdk']\n delete packageJson.devDependencies['@sentio/cli']\n delete packageJson.dependencies['@sentio/sdk-aptos']\n delete packageJson.dependencies['@sentio/sdk-solana']\n }\n\n // Don't add directly to avoid deps issue\n packageJson.scripts.postinstall = 'sentio gen'\n\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))\n }\n console.log(chalk.green(\"successfully create project '\" + projectName + \"'\"))\n }\n}\n"]}
|