@sentio/cli 1.37.5-rc.7 → 2.0.0-rc.2
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 +42 -32
- package/lib/build.js.map +1 -1
- package/lib/cli.js +25 -96
- package/lib/cli.js.map +1 -1
- package/lib/commands/login-server.js +41 -65
- package/lib/commands/login-server.js.map +1 -1
- package/lib/commands/run-create.js +35 -30
- package/lib/commands/run-create.js.map +1 -1
- package/lib/commands/run-login.js +28 -58
- package/lib/commands/run-login.js.map +1 -1
- package/lib/commands/run-upload.d.ts +3 -0
- package/lib/commands/run-upload.js +254 -0
- package/lib/commands/run-upload.js.map +1 -0
- package/lib/commands/run-version.js +9 -39
- package/lib/commands/run-version.js.map +1 -1
- package/lib/config.js +4 -11
- package/lib/config.js.map +1 -1
- package/lib/key.js +18 -26
- package/lib/key.js.map +1 -1
- package/lib/utils.js +7 -15
- package/lib/utils.js.map +1 -1
- package/package.json +11 -18
- package/src/build.ts +29 -9
- package/src/cli.ts +7 -72
- package/src/commands/login-server.ts +25 -17
- package/src/commands/run-create.ts +14 -0
- package/src/commands/run-login.ts +4 -4
- package/src/{upload.ts → commands/run-upload.ts} +94 -19
- package/src/commands/run-version.ts +1 -1
- package/templates/aptos/jest.config.ts +8 -0
- package/templates/aptos/package.json +3 -2
- package/templates/aptos/src/processor.ts +3 -3
- package/templates/aptos/tsconfig.json +4 -3
- package/templates/evm/jest.config.ts +8 -0
- package/templates/evm/package.json +2 -1
- package/templates/evm/src/processor.ts +3 -3
- package/templates/evm/tsconfig.json +4 -3
- package/templates/raw/jest.config.ts +8 -0
- package/templates/raw/package.json +2 -1
- package/templates/raw/tsconfig.json +4 -3
- package/templates/solana/jest.config.ts +8 -0
- package/templates/solana/package.json +3 -2
- package/templates/solana/src/processor.ts +1 -1
- package/templates/solana/tsconfig.json +4 -3
- package/LICENSE +0 -55
- package/lib/upload.d.ts +0 -2
- package/lib/upload.js +0 -189
- package/lib/upload.js.map +0 -1
- 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
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const command_line_usage_1 = __importDefault(require("command-line-usage"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
const latest_version_1 = __importDefault(require("latest-version"));
|
|
13
|
-
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) {
|
|
14
8
|
const optionDefinitions = [
|
|
15
9
|
{
|
|
16
10
|
name: 'help',
|
|
@@ -25,6 +19,12 @@ async function runCreate(argv) {
|
|
|
25
19
|
type: String,
|
|
26
20
|
description: 'Project name',
|
|
27
21
|
},
|
|
22
|
+
{
|
|
23
|
+
name: 'subproject',
|
|
24
|
+
alias: 'p',
|
|
25
|
+
type: Boolean,
|
|
26
|
+
description: 'If this is a subproject in mono-repo setup, in this case sdk version is controlled in parent package.json.',
|
|
27
|
+
},
|
|
28
28
|
{
|
|
29
29
|
name: 'directory',
|
|
30
30
|
alias: 'd',
|
|
@@ -39,8 +39,8 @@ async function runCreate(argv) {
|
|
|
39
39
|
defaultValue: 'evm',
|
|
40
40
|
},
|
|
41
41
|
];
|
|
42
|
-
const options = (
|
|
43
|
-
const usage = (
|
|
42
|
+
const options = commandLineArgs(optionDefinitions, { argv });
|
|
43
|
+
const usage = commandLineUsage([
|
|
44
44
|
{
|
|
45
45
|
header: 'Create a template project',
|
|
46
46
|
content: 'sentio create <name>',
|
|
@@ -65,19 +65,19 @@ async function runCreate(argv) {
|
|
|
65
65
|
case 'solana':
|
|
66
66
|
break;
|
|
67
67
|
default:
|
|
68
|
-
console.error(
|
|
68
|
+
console.error(chalk.red('non supported chain-type for template creation, use --help for more information.'));
|
|
69
69
|
console.log(usage);
|
|
70
70
|
process.exit(1);
|
|
71
71
|
}
|
|
72
|
-
const templateFolder =
|
|
72
|
+
const templateFolder = path.resolve(__dirname, '../../templates', chainType);
|
|
73
73
|
const projectName = options.name || 'default';
|
|
74
74
|
const rootDir = options.directory || process.cwd();
|
|
75
|
-
const dstFolder =
|
|
76
|
-
if (
|
|
77
|
-
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"));
|
|
78
78
|
process.exit(1);
|
|
79
79
|
}
|
|
80
|
-
|
|
80
|
+
fs.copySync(templateFolder, dstFolder, {
|
|
81
81
|
filter: (src, _) => {
|
|
82
82
|
// TODO read from .gitignore to be more reliable
|
|
83
83
|
if (src.endsWith('types') ||
|
|
@@ -92,11 +92,11 @@ async function runCreate(argv) {
|
|
|
92
92
|
overwrite: false,
|
|
93
93
|
});
|
|
94
94
|
if (options.name) {
|
|
95
|
-
const sentioYamlPath =
|
|
96
|
-
|
|
97
|
-
const packageJsonPath =
|
|
98
|
-
const packageJson = JSON.parse(
|
|
99
|
-
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'));
|
|
100
100
|
packageJson.dependencies['@sentio/sdk'] = sdkVersion;
|
|
101
101
|
switch (chainType) {
|
|
102
102
|
case 'aptos':
|
|
@@ -107,15 +107,20 @@ async function runCreate(argv) {
|
|
|
107
107
|
break;
|
|
108
108
|
default:
|
|
109
109
|
}
|
|
110
|
-
const cliVersion = '^' + (await (
|
|
110
|
+
const cliVersion = '^' + (await latestVersion('@sentio/cli'));
|
|
111
111
|
packageJson.devDependencies['@sentio/cli'] = cliVersion;
|
|
112
112
|
packageJson.name = projectName;
|
|
113
|
+
if (options.subproject) {
|
|
114
|
+
delete packageJson.dependencies['@sentio/sdk'];
|
|
115
|
+
delete packageJson.devDependencies['@sentio/cli'];
|
|
116
|
+
delete packageJson.dependencies['@sentio/sdk-aptos'];
|
|
117
|
+
delete packageJson.dependencies['@sentio/sdk-solana'];
|
|
118
|
+
}
|
|
113
119
|
// Don't add directly to avoid deps issue
|
|
114
120
|
packageJson.scripts.postinstall = 'sentio gen';
|
|
115
|
-
|
|
121
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
116
122
|
}
|
|
117
|
-
console.log(
|
|
123
|
+
console.log(chalk.green("successfully create project '" + projectName + "'"));
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
|
-
exports.runCreate = runCreate;
|
|
121
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"]}
|
|
@@ -1,44 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.runLogin = void 0;
|
|
30
|
-
const command_line_args_1 = __importDefault(require("command-line-args"));
|
|
31
|
-
const command_line_usage_1 = __importDefault(require("command-line-usage"));
|
|
32
|
-
const config_1 = require("../config");
|
|
33
|
-
const login_server_1 = require("./login-server");
|
|
34
|
-
const url_1 = __importStar(require("url"));
|
|
35
|
-
const crypto = __importStar(require("crypto"));
|
|
36
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
37
|
-
const key_1 = require("../key");
|
|
38
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
39
|
-
const open_1 = __importDefault(require("open"));
|
|
1
|
+
import commandLineArgs from 'command-line-args';
|
|
2
|
+
import commandLineUsage from 'command-line-usage';
|
|
3
|
+
import { getAuthConfig, getFinalizedHost } from '../config.js';
|
|
4
|
+
import { startServer } from './login-server.js';
|
|
5
|
+
import url, { URL } from 'url';
|
|
6
|
+
import * as crypto from 'crypto';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { WriteKey } from '../key.js';
|
|
9
|
+
import fetch from 'node-fetch';
|
|
10
|
+
import open from 'open';
|
|
40
11
|
const port = 20000;
|
|
41
|
-
function runLogin(argv) {
|
|
12
|
+
export function runLogin(argv) {
|
|
42
13
|
const optionDefinitions = [
|
|
43
14
|
{
|
|
44
15
|
name: 'help',
|
|
@@ -57,10 +28,10 @@ function runLogin(argv) {
|
|
|
57
28
|
description: '(Optional) Your API key',
|
|
58
29
|
},
|
|
59
30
|
];
|
|
60
|
-
const options = (
|
|
61
|
-
const host =
|
|
31
|
+
const options = commandLineArgs(optionDefinitions, { argv });
|
|
32
|
+
const host = getFinalizedHost(options.host);
|
|
62
33
|
if (options.help) {
|
|
63
|
-
const usage = (
|
|
34
|
+
const usage = commandLineUsage([
|
|
64
35
|
{
|
|
65
36
|
header: 'Login to Sentio',
|
|
66
37
|
content: 'sentio login',
|
|
@@ -73,15 +44,15 @@ function runLogin(argv) {
|
|
|
73
44
|
console.log(usage);
|
|
74
45
|
}
|
|
75
46
|
else if (options['api-key']) {
|
|
76
|
-
console.log(
|
|
47
|
+
console.log(chalk.blue('login to ' + host));
|
|
77
48
|
const apiKey = options['api-key'];
|
|
78
49
|
checkKey(host, apiKey).then((res) => {
|
|
79
50
|
if (res.status == 200) {
|
|
80
|
-
|
|
81
|
-
console.log(
|
|
51
|
+
WriteKey(host, apiKey);
|
|
52
|
+
console.log(chalk.green('login success'));
|
|
82
53
|
}
|
|
83
54
|
else {
|
|
84
|
-
console.error(
|
|
55
|
+
console.error(chalk.red('login failed, code:', res.status, res.statusText));
|
|
85
56
|
}
|
|
86
57
|
});
|
|
87
58
|
}
|
|
@@ -89,13 +60,13 @@ function runLogin(argv) {
|
|
|
89
60
|
// https://auth0.com/docs/get-started/authentication-and-authorization-flow/call-your-api-using-the-authorization-code-flow-with-pkce
|
|
90
61
|
const verifier = base64URLEncode(crypto.randomBytes(32));
|
|
91
62
|
const challenge = base64URLEncode(sha256(verifier));
|
|
92
|
-
const conf =
|
|
63
|
+
const conf = getAuthConfig(host);
|
|
93
64
|
if (conf.domain === '') {
|
|
94
|
-
console.error(
|
|
65
|
+
console.error(chalk.red('invalid host, try login with an API key if it is a dev env'));
|
|
95
66
|
return;
|
|
96
67
|
}
|
|
97
|
-
const authURL = new
|
|
98
|
-
const params = new
|
|
68
|
+
const authURL = new URL(conf.domain + `/authorize?`);
|
|
69
|
+
const params = new url.URLSearchParams({
|
|
99
70
|
response_type: 'code',
|
|
100
71
|
code_challenge: challenge,
|
|
101
72
|
code_challenge_method: 'S256',
|
|
@@ -106,18 +77,17 @@ function runLogin(argv) {
|
|
|
106
77
|
});
|
|
107
78
|
authURL.search = params.toString();
|
|
108
79
|
console.log('Continue your authorization in the browser');
|
|
109
|
-
(
|
|
110
|
-
console.error(
|
|
111
|
-
console.error(
|
|
80
|
+
open(authURL.toString()).catch((reason) => {
|
|
81
|
+
console.error(chalk.red('Unable to open browser: ' + reason));
|
|
82
|
+
console.error(chalk.red('Open this url in your browser: ' + authURL.toString()));
|
|
112
83
|
});
|
|
113
|
-
|
|
84
|
+
startServer({
|
|
114
85
|
serverPort: port,
|
|
115
86
|
sentioHost: options.host,
|
|
116
87
|
codeVerifier: verifier,
|
|
117
88
|
});
|
|
118
89
|
}
|
|
119
90
|
}
|
|
120
|
-
exports.runLogin = runLogin;
|
|
121
91
|
function base64URLEncode(str) {
|
|
122
92
|
return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
123
93
|
}
|
|
@@ -125,8 +95,8 @@ function sha256(str) {
|
|
|
125
95
|
return crypto.createHash('sha256').update(str).digest();
|
|
126
96
|
}
|
|
127
97
|
async function checkKey(host, apiKey) {
|
|
128
|
-
const checkApiKeyUrl = new
|
|
129
|
-
return (
|
|
98
|
+
const checkApiKeyUrl = new URL('/api/v1/processors/check_key', host);
|
|
99
|
+
return fetch(checkApiKeyUrl.href, {
|
|
130
100
|
method: 'GET',
|
|
131
101
|
headers: {
|
|
132
102
|
'api-key': apiKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-login.js","sourceRoot":"","sources":["../../src/commands/run-login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-login.js","sourceRoot":"","sources":["../../src/commands/run-login.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport { getAuthConfig, getFinalizedHost } from '../config.js'\nimport { startServer } from './login-server.js'\nimport url, { URL } from 'url'\nimport * as crypto from 'crypto'\nimport chalk from 'chalk'\nimport { WriteKey } from '../key.js'\nimport fetch from 'node-fetch'\nimport open from 'open'\n\nconst port = 20000\n\nexport function runLogin(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: 'host',\n description: '(Optional) Override Sentio Host name',\n type: String,\n },\n {\n name: 'api-key',\n type: String,\n description: '(Optional) Your API key',\n },\n ]\n const options = commandLineArgs(optionDefinitions, { argv })\n\n const host = getFinalizedHost(options.host)\n if (options.help) {\n const usage = commandLineUsage([\n {\n header: 'Login to Sentio',\n content: 'sentio login',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n console.log(usage)\n } else if (options['api-key']) {\n console.log(chalk.blue('login to ' + host))\n const apiKey = options['api-key']\n checkKey(host, apiKey).then((res) => {\n if (res.status == 200) {\n WriteKey(host, apiKey)\n console.log(chalk.green('login success'))\n } else {\n console.error(chalk.red('login failed, code:', res.status, res.statusText))\n }\n })\n } else {\n // https://auth0.com/docs/get-started/authentication-and-authorization-flow/call-your-api-using-the-authorization-code-flow-with-pkce\n const verifier = base64URLEncode(crypto.randomBytes(32))\n const challenge = base64URLEncode(sha256(verifier))\n\n const conf = getAuthConfig(host)\n if (conf.domain === '') {\n console.error(chalk.red('invalid host, try login with an API key if it is a dev env'))\n return\n }\n const authURL = new URL(conf.domain + `/authorize?`)\n const params = new url.URLSearchParams({\n response_type: 'code',\n code_challenge: challenge,\n code_challenge_method: 'S256',\n client_id: conf.clientId,\n redirect_uri: `http://localhost:${port}/callback`,\n audience: conf.audience,\n prompt: 'login',\n })\n authURL.search = params.toString()\n\n console.log('Continue your authorization in the browser')\n open(authURL.toString()).catch((reason) => {\n console.error(chalk.red('Unable to open browser: ' + reason))\n console.error(chalk.red('Open this url in your browser: ' + authURL.toString()))\n })\n\n startServer({\n serverPort: port,\n sentioHost: options.host,\n codeVerifier: verifier,\n })\n }\n}\n\nfunction base64URLEncode(str: Buffer) {\n return str.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '')\n}\n\nfunction sha256(str: string) {\n return crypto.createHash('sha256').update(str).digest()\n}\n\nasync function checkKey(host: string, apiKey: string) {\n const checkApiKeyUrl = new URL('/api/v1/processors/check_key', host)\n return fetch(checkApiKeyUrl.href, {\n method: 'GET',\n headers: {\n 'api-key': apiKey,\n },\n })\n}\n"]}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import commandLineArgs from 'command-line-args';
|
|
2
|
+
import commandLineUsage from 'command-line-usage';
|
|
3
|
+
import { finalizeHost, FinalizeProjectName } from '../config.js';
|
|
4
|
+
import { URL } from 'url';
|
|
5
|
+
import fetch from 'node-fetch';
|
|
6
|
+
import { buildProcessor } from '../build.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { ReadKey } from '../key.js';
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import { createHash } from 'crypto';
|
|
12
|
+
import { execSync } from 'child_process';
|
|
13
|
+
import { getSdkVersion } from '../utils.js';
|
|
14
|
+
import readline from 'readline';
|
|
15
|
+
export async function runUpload(processorConfig, argv) {
|
|
16
|
+
const optionDefinitions = [
|
|
17
|
+
{
|
|
18
|
+
name: 'help',
|
|
19
|
+
alias: 'h',
|
|
20
|
+
type: Boolean,
|
|
21
|
+
description: 'Display this usage guide.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'api-key',
|
|
25
|
+
type: String,
|
|
26
|
+
description: '(Optional) Manually provide API key rather than use saved credential',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'host',
|
|
30
|
+
description: '(Optional) Override Sentio Host name',
|
|
31
|
+
type: String,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'owner',
|
|
35
|
+
description: '(Optional) Override Project owner',
|
|
36
|
+
type: String,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'nobuild',
|
|
40
|
+
description: '(Optional) Skip build & pack file before uploading, default false',
|
|
41
|
+
type: Boolean,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'debug',
|
|
45
|
+
description: '(Optional) Run driver in debug mode, default false',
|
|
46
|
+
type: Boolean,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
const options = commandLineArgs(optionDefinitions, { argv });
|
|
50
|
+
if (options.help) {
|
|
51
|
+
const usage = commandLineUsage([
|
|
52
|
+
{
|
|
53
|
+
header: 'Sentio upload',
|
|
54
|
+
content: 'sentio upload',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
header: 'Options',
|
|
58
|
+
optionList: optionDefinitions,
|
|
59
|
+
},
|
|
60
|
+
]);
|
|
61
|
+
console.log(usage);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (options.host) {
|
|
65
|
+
processorConfig.host = options.host;
|
|
66
|
+
}
|
|
67
|
+
if (options.nobuild) {
|
|
68
|
+
processorConfig.build = false;
|
|
69
|
+
}
|
|
70
|
+
if (options.debug) {
|
|
71
|
+
processorConfig.debug = true;
|
|
72
|
+
}
|
|
73
|
+
finalizeHost(processorConfig);
|
|
74
|
+
FinalizeProjectName(processorConfig, options.owner);
|
|
75
|
+
console.log(processorConfig);
|
|
76
|
+
let apiOverride = undefined;
|
|
77
|
+
if (options['api-key']) {
|
|
78
|
+
apiOverride = options['api-key'];
|
|
79
|
+
}
|
|
80
|
+
return uploadFile(processorConfig, apiOverride);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function createProject(options, apiKey) {
|
|
84
|
+
const url = new URL('/api/v1/projects', options.host);
|
|
85
|
+
const [ownerName, slug] = options.project.includes('/') ? options.project.split('/') : [undefined, options.project];
|
|
86
|
+
return fetch(url.href, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
'api-key': apiKey,
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify({ slug, ownerName, visibility: 'PRIVATE' }),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export async function uploadFile(options, apiKeyOverride) {
|
|
95
|
+
if (options.build) {
|
|
96
|
+
await buildProcessor(false);
|
|
97
|
+
}
|
|
98
|
+
console.log(chalk.blue('Prepare to upload'));
|
|
99
|
+
const PROCESSOR_FILE = path.join(process.cwd(), 'dist/lib.js');
|
|
100
|
+
const apiKey = apiKeyOverride || ReadKey(options.host);
|
|
101
|
+
const isProd = options.host === 'https://app.sentio.xyz';
|
|
102
|
+
if (!apiKey) {
|
|
103
|
+
const cmd = isProd ? 'sentio login' : 'sentio login --host=' + options.host;
|
|
104
|
+
console.error(chalk.red('No Credential found for', options.host, '. Please run `' + cmd + '`.'));
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
if (!fs.existsSync(PROCESSOR_FILE)) {
|
|
108
|
+
console.error(chalk.red('File not existed ', PROCESSOR_FILE, "don't use --nobuild"));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const stat = fs.statSync(PROCESSOR_FILE);
|
|
112
|
+
console.log('Packed processor file size', Math.floor(stat.size / 1024) + 'K, last modified', stat.mtime);
|
|
113
|
+
const content = fs.readFileSync(PROCESSOR_FILE);
|
|
114
|
+
const hash = createHash('sha256');
|
|
115
|
+
hash.update(content);
|
|
116
|
+
const digest = hash.digest('hex');
|
|
117
|
+
let triedCount = 0;
|
|
118
|
+
const upload = async () => {
|
|
119
|
+
let commitSha = '';
|
|
120
|
+
let gitUrl = '';
|
|
121
|
+
const sha256 = digest;
|
|
122
|
+
try {
|
|
123
|
+
commitSha = execSync('git rev-parse HEAD').toString().trim();
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
chalk.yellow(e);
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
gitUrl = execSync('git remote get-url origin').toString().trim();
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
// skip errors
|
|
133
|
+
}
|
|
134
|
+
console.log(chalk.blue(triedCount > 1 ? 'Retry uploading' : 'Uploading'));
|
|
135
|
+
// get gcs upload url
|
|
136
|
+
const initUploadResRaw = await initUpload(options.host, apiKey, options.project, getSdkVersion());
|
|
137
|
+
if (!initUploadResRaw.ok) {
|
|
138
|
+
// console.error(chalk.red('Failed to get upload url'))
|
|
139
|
+
console.error(chalk.red((await initUploadResRaw.json()).message));
|
|
140
|
+
if (initUploadResRaw.status === 404) {
|
|
141
|
+
// create project if not exist
|
|
142
|
+
const rl = readline.createInterface({
|
|
143
|
+
input: process.stdin,
|
|
144
|
+
output: process.stdout,
|
|
145
|
+
});
|
|
146
|
+
const prompt = async () => {
|
|
147
|
+
const answer = await new Promise((resolve) => rl.question(`Do you want to create it and continue the uploading process? (yes/no) `, resolve));
|
|
148
|
+
if (['y', 'yes'].includes(answer.toLowerCase())) {
|
|
149
|
+
rl.close();
|
|
150
|
+
const res = await createProject(options, apiKey);
|
|
151
|
+
if (!res.ok) {
|
|
152
|
+
console.error(chalk.red('Create Project Failed'));
|
|
153
|
+
console.error(chalk.red((await res.json()).message));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
console.log(chalk.green('Project created'));
|
|
157
|
+
await upload();
|
|
158
|
+
}
|
|
159
|
+
else if (['n', 'no'].includes(answer.toLowerCase())) {
|
|
160
|
+
rl.close();
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
await prompt();
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
await prompt();
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const initUploadRes = (await initUploadResRaw.json());
|
|
171
|
+
const uploadUrl = initUploadRes.url;
|
|
172
|
+
// do actual uploading
|
|
173
|
+
const file = fs.createReadStream(PROCESSOR_FILE);
|
|
174
|
+
const uploadResRaw = await fetch(uploadUrl, {
|
|
175
|
+
method: 'PUT',
|
|
176
|
+
headers: {
|
|
177
|
+
'Content-Type': 'application/octet-stream',
|
|
178
|
+
},
|
|
179
|
+
body: file,
|
|
180
|
+
});
|
|
181
|
+
if (!uploadResRaw.ok) {
|
|
182
|
+
console.error(chalk.red('Failed to upload'));
|
|
183
|
+
console.error(chalk.red(await uploadResRaw.text()));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// finish uploading
|
|
187
|
+
const finishUploadResRaw = await finishUpload(options.host, apiKey, options.project, getSdkVersion(), sha256, commitSha, gitUrl, options.debug);
|
|
188
|
+
if (!finishUploadResRaw.ok) {
|
|
189
|
+
console.error(chalk.red('Failed to finish uploading'));
|
|
190
|
+
console.error(chalk.red(await finishUploadResRaw.text()));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
console.log(chalk.green('Upload success: '));
|
|
194
|
+
console.log('\t', chalk.blue('sha256:'), digest);
|
|
195
|
+
if (commitSha) {
|
|
196
|
+
console.log('\t', chalk.blue('Git commit SHA:'), commitSha);
|
|
197
|
+
}
|
|
198
|
+
const { projectFullSlug, version } = (await finishUploadResRaw.json());
|
|
199
|
+
console.log('\t', chalk.blue('Check status:'), `${options.host}/${projectFullSlug}/datasource`);
|
|
200
|
+
console.log('\t', chalk.blue('Version:'), version);
|
|
201
|
+
};
|
|
202
|
+
let error;
|
|
203
|
+
const tryUploading = async () => {
|
|
204
|
+
if (triedCount++ >= 5) {
|
|
205
|
+
console.error(error);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
await upload();
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
if (e.constructor.name === 'FetchError' && e.type === 'system' && e.code === 'EPIPE') {
|
|
213
|
+
error = e;
|
|
214
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
215
|
+
await tryUploading();
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
console.error(e);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
await tryUploading();
|
|
223
|
+
}
|
|
224
|
+
async function initUpload(host, apiKey, projectSlug, sdkVersion) {
|
|
225
|
+
const initUploadUrl = new URL(`/api/v1/processors/init_upload`, host);
|
|
226
|
+
return fetch(initUploadUrl.href, {
|
|
227
|
+
method: 'POST',
|
|
228
|
+
headers: {
|
|
229
|
+
'api-key': apiKey,
|
|
230
|
+
},
|
|
231
|
+
body: JSON.stringify({
|
|
232
|
+
project_slug: projectSlug,
|
|
233
|
+
sdk_version: sdkVersion,
|
|
234
|
+
}),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
async function finishUpload(host, apiKey, projectSlug, sdkVersion, sha256, commitSha, gitUrl, debug) {
|
|
238
|
+
const finishUploadUrl = new URL(`/api/v1/processors/finish_upload`, host);
|
|
239
|
+
return fetch(finishUploadUrl.href, {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
headers: {
|
|
242
|
+
'api-key': apiKey,
|
|
243
|
+
},
|
|
244
|
+
body: JSON.stringify({
|
|
245
|
+
project_slug: projectSlug,
|
|
246
|
+
sdk_version: sdkVersion,
|
|
247
|
+
sha256: sha256,
|
|
248
|
+
commit_sha: commitSha,
|
|
249
|
+
git_url: gitUrl,
|
|
250
|
+
debug: debug,
|
|
251
|
+
}),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=run-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-upload.js","sourceRoot":"","sources":["../../src/commands/run-upload.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport { finalizeHost, FinalizeProjectName, SentioProjectConfig } from '../config.js'\nimport { URL } from 'url'\nimport fetch from 'node-fetch'\nimport { buildProcessor } from '../build.js'\nimport chalk from 'chalk'\nimport path from 'path'\nimport { ReadKey } from '../key.js'\nimport fs from 'fs'\nimport { createHash } from 'crypto'\nimport { execSync } from 'child_process'\nimport { getSdkVersion } from '../utils.js'\nimport readline from 'readline'\n\nexport async function runUpload(processorConfig: SentioProjectConfig, 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: 'api-key',\n type: String,\n description: '(Optional) Manually provide API key rather than use saved credential',\n },\n {\n name: 'host',\n description: '(Optional) Override Sentio Host name',\n type: String,\n },\n {\n name: 'owner',\n description: '(Optional) Override Project owner',\n type: String,\n },\n {\n name: 'nobuild',\n description: '(Optional) Skip build & pack file before uploading, default false',\n type: Boolean,\n },\n {\n name: 'debug',\n description: '(Optional) Run driver in debug mode, default false',\n type: Boolean,\n },\n ]\n const options = commandLineArgs(optionDefinitions, { argv })\n if (options.help) {\n const usage = commandLineUsage([\n {\n header: 'Sentio upload',\n content: 'sentio upload',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n console.log(usage)\n } else {\n if (options.host) {\n processorConfig.host = options.host\n }\n if (options.nobuild) {\n processorConfig.build = false\n }\n if (options.debug) {\n processorConfig.debug = true\n }\n finalizeHost(processorConfig)\n FinalizeProjectName(processorConfig, options.owner)\n console.log(processorConfig)\n\n let apiOverride = undefined\n if (options['api-key']) {\n apiOverride = options['api-key']\n }\n return uploadFile(processorConfig, apiOverride)\n }\n}\n\nasync function createProject(options: SentioProjectConfig, apiKey: string) {\n const url = new URL('/api/v1/projects', options.host)\n const [ownerName, slug] = options.project.includes('/') ? options.project.split('/') : [undefined, options.project]\n return fetch(url.href, {\n method: 'POST',\n headers: {\n 'api-key': apiKey,\n },\n body: JSON.stringify({ slug, ownerName, visibility: 'PRIVATE' }),\n })\n}\n\nexport async function uploadFile(options: SentioProjectConfig, apiKeyOverride: string) {\n if (options.build) {\n await buildProcessor(false)\n }\n\n console.log(chalk.blue('Prepare to upload'))\n\n const PROCESSOR_FILE = path.join(process.cwd(), 'dist/lib.js')\n\n const apiKey = apiKeyOverride || ReadKey(options.host)\n\n const isProd = options.host === 'https://app.sentio.xyz'\n if (!apiKey) {\n const cmd = isProd ? 'sentio login' : 'sentio login --host=' + options.host\n console.error(chalk.red('No Credential found for', options.host, '. Please run `' + cmd + '`.'))\n process.exit(1)\n }\n\n if (!fs.existsSync(PROCESSOR_FILE)) {\n console.error(chalk.red('File not existed ', PROCESSOR_FILE, \"don't use --nobuild\"))\n process.exit(1)\n }\n\n const stat = fs.statSync(PROCESSOR_FILE)\n console.log('Packed processor file size', Math.floor(stat.size / 1024) + 'K, last modified', stat.mtime)\n const content = fs.readFileSync(PROCESSOR_FILE)\n const hash = createHash('sha256')\n hash.update(content)\n const digest = hash.digest('hex')\n\n let triedCount = 0\n const upload = async () => {\n let commitSha = ''\n let gitUrl = ''\n const sha256 = digest\n try {\n commitSha = execSync('git rev-parse HEAD').toString().trim()\n } catch (e) {\n chalk.yellow(e)\n }\n try {\n gitUrl = execSync('git remote get-url origin').toString().trim()\n } catch (e) {\n // skip errors\n }\n console.log(chalk.blue(triedCount > 1 ? 'Retry uploading' : 'Uploading'))\n\n // get gcs upload url\n const initUploadResRaw = await initUpload(options.host, apiKey, options.project, getSdkVersion())\n if (!initUploadResRaw.ok) {\n // console.error(chalk.red('Failed to get upload url'))\n console.error(chalk.red(((await initUploadResRaw.json()) as { message: string }).message))\n\n if (initUploadResRaw.status === 404) {\n // create project if not exist\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n const prompt = async () => {\n const answer: string = await new Promise((resolve) =>\n rl.question(`Do you want to create it and continue the uploading process? (yes/no) `, resolve)\n )\n if (['y', 'yes'].includes(answer.toLowerCase())) {\n rl.close()\n const res = await createProject(options, apiKey)\n if (!res.ok) {\n console.error(chalk.red('Create Project Failed'))\n console.error(chalk.red(((await res.json()) as { message: string }).message))\n return\n }\n console.log(chalk.green('Project created'))\n await upload()\n } else if (['n', 'no'].includes(answer.toLowerCase())) {\n rl.close()\n } else {\n await prompt()\n }\n }\n await prompt()\n }\n return\n }\n const initUploadRes = (await initUploadResRaw.json()) as { url: string }\n const uploadUrl = initUploadRes.url\n\n // do actual uploading\n const file = fs.createReadStream(PROCESSOR_FILE)\n const uploadResRaw = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n },\n body: file,\n })\n if (!uploadResRaw.ok) {\n console.error(chalk.red('Failed to upload'))\n console.error(chalk.red(await uploadResRaw.text()))\n return\n }\n\n // finish uploading\n const finishUploadResRaw = await finishUpload(\n options.host,\n apiKey,\n options.project,\n getSdkVersion(),\n sha256,\n commitSha,\n gitUrl,\n options.debug\n )\n if (!finishUploadResRaw.ok) {\n console.error(chalk.red('Failed to finish uploading'))\n console.error(chalk.red(await finishUploadResRaw.text()))\n return\n }\n\n console.log(chalk.green('Upload success: '))\n console.log('\\t', chalk.blue('sha256:'), digest)\n if (commitSha) {\n console.log('\\t', chalk.blue('Git commit SHA:'), commitSha)\n }\n const { projectFullSlug, version } = (await finishUploadResRaw.json()) as {\n projectFullSlug: string\n version: string\n }\n console.log('\\t', chalk.blue('Check status:'), `${options.host}/${projectFullSlug}/datasource`)\n console.log('\\t', chalk.blue('Version:'), version)\n }\n\n let error: Error\n const tryUploading = async () => {\n if (triedCount++ >= 5) {\n console.error(error)\n return\n }\n try {\n await upload()\n } catch (e) {\n if (e.constructor.name === 'FetchError' && e.type === 'system' && e.code === 'EPIPE') {\n error = e\n await new Promise((resolve) => setTimeout(resolve, 1000))\n await tryUploading()\n } else {\n console.error(e)\n }\n }\n }\n\n await tryUploading()\n}\n\nasync function initUpload(host: string, apiKey: string, projectSlug: string, sdkVersion: string) {\n const initUploadUrl = new URL(`/api/v1/processors/init_upload`, host)\n return fetch(initUploadUrl.href, {\n method: 'POST',\n headers: {\n 'api-key': apiKey,\n },\n body: JSON.stringify({\n project_slug: projectSlug,\n sdk_version: sdkVersion,\n }),\n })\n}\n\nasync function finishUpload(\n host: string,\n apiKey: string,\n projectSlug: string,\n sdkVersion: string,\n sha256: string,\n commitSha: string,\n gitUrl: string,\n debug: boolean\n) {\n const finishUploadUrl = new URL(`/api/v1/processors/finish_upload`, host)\n return fetch(finishUploadUrl.href, {\n method: 'POST',\n headers: {\n 'api-key': apiKey,\n },\n body: JSON.stringify({\n project_slug: projectSlug,\n sdk_version: sdkVersion,\n sha256: sha256,\n commit_sha: commitSha,\n git_url: gitUrl,\n debug: debug,\n }),\n })\n}\n"]}
|