esa-cli 0.0.1-beta.1

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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/bin/enter.cjs +52 -0
  4. package/dist/README.md +175 -0
  5. package/dist/bin/enter.cjs +52 -0
  6. package/dist/cliconfig.toml +6 -0
  7. package/dist/commands/commit/index.js +147 -0
  8. package/dist/commands/commit/prodBuild.js +50 -0
  9. package/dist/commands/common/constant.js +54 -0
  10. package/dist/commands/config.js +51 -0
  11. package/dist/commands/deploy/helper.js +108 -0
  12. package/dist/commands/deploy/index.js +217 -0
  13. package/dist/commands/deployments/delete.js +92 -0
  14. package/dist/commands/deployments/index.js +27 -0
  15. package/dist/commands/deployments/list.js +89 -0
  16. package/dist/commands/dev/config/devBuild.js +26 -0
  17. package/dist/commands/dev/config/devEntry.js +71 -0
  18. package/dist/commands/dev/config/mock/cache.js +31 -0
  19. package/dist/commands/dev/config/mock/kv.js +87 -0
  20. package/dist/commands/dev/devPack.js +113 -0
  21. package/dist/commands/dev/doProcess.js +73 -0
  22. package/dist/commands/dev/index.js +240 -0
  23. package/dist/commands/dev/server.js +100 -0
  24. package/dist/commands/domain/add.js +72 -0
  25. package/dist/commands/domain/delete.js +74 -0
  26. package/dist/commands/domain/index.js +29 -0
  27. package/dist/commands/domain/list.js +51 -0
  28. package/dist/commands/init/index.js +149 -0
  29. package/dist/commands/lang.js +32 -0
  30. package/dist/commands/login/index.js +108 -0
  31. package/dist/commands/logout.js +44 -0
  32. package/dist/commands/route/add.js +115 -0
  33. package/dist/commands/route/delete.js +74 -0
  34. package/dist/commands/route/index.js +29 -0
  35. package/dist/commands/route/list.js +63 -0
  36. package/dist/commands/routine/delete.js +54 -0
  37. package/dist/commands/routine/index.js +27 -0
  38. package/dist/commands/routine/list.js +101 -0
  39. package/dist/commands/site/index.js +25 -0
  40. package/dist/commands/site/list.js +47 -0
  41. package/dist/commands/utils.js +139 -0
  42. package/dist/components/descriptionInput.js +38 -0
  43. package/dist/components/filterSelector.js +132 -0
  44. package/dist/components/mutiSelectTable.js +95 -0
  45. package/dist/components/selectInput.js +17 -0
  46. package/dist/components/selectItem.js +6 -0
  47. package/dist/components/yesNoPrompt.js +9 -0
  48. package/dist/docs/Commands_en.md +224 -0
  49. package/dist/docs/Commands_zh_CN.md +224 -0
  50. package/dist/docs/dev.png +0 -0
  51. package/dist/i18n/index.js +27 -0
  52. package/dist/i18n/locales.json +766 -0
  53. package/dist/index.js +80 -0
  54. package/dist/libs/apiService.js +914 -0
  55. package/dist/libs/git/index.js +52 -0
  56. package/dist/libs/interface.js +21 -0
  57. package/dist/libs/logger.js +149 -0
  58. package/dist/libs/request.js +98 -0
  59. package/dist/libs/templates/index.js +16 -0
  60. package/dist/package.json +93 -0
  61. package/dist/utils/checkDevPort.js +113 -0
  62. package/dist/utils/checkIsRoutineCreated.js +56 -0
  63. package/dist/utils/checkVersion.js +26 -0
  64. package/dist/utils/debounce.js +18 -0
  65. package/dist/utils/fileUtils/index.js +219 -0
  66. package/dist/utils/fileUtils/interface.js +1 -0
  67. package/dist/utils/install/install.ps1 +33 -0
  68. package/dist/utils/install/install.sh +53 -0
  69. package/dist/utils/installRuntime.js +80 -0
  70. package/dist/utils/openInBrowser.js +24 -0
  71. package/dist/utils/sleep.js +6 -0
  72. package/dist/zh_CN.md +177 -0
  73. package/package.json +93 -0
@@ -0,0 +1,52 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { execSync } from 'child_process';
11
+ import { exit } from 'process';
12
+ export function isInstalledGit() {
13
+ try {
14
+ execSync('git --version');
15
+ return true;
16
+ }
17
+ catch (error) {
18
+ return false;
19
+ }
20
+ }
21
+ export function isGitConfigured() {
22
+ try {
23
+ execSync('git config --get user.name');
24
+ execSync('git config --get user.email');
25
+ return true;
26
+ }
27
+ catch (error) {
28
+ return false;
29
+ }
30
+ }
31
+ export function cloneRepository(url, path) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ try {
34
+ execSync(`git clone ${url} ${path}`, { stdio: 'inherit' });
35
+ console.log('Repository cloned successfully.');
36
+ }
37
+ catch (error) {
38
+ console.error('Error occurred while cloning the repository:', error);
39
+ exit(0);
40
+ }
41
+ });
42
+ }
43
+ export function installGit(path) {
44
+ try {
45
+ execSync('git init', { stdio: 'inherit', cwd: path });
46
+ console.log('Git has been installed successfully.');
47
+ }
48
+ catch (error) {
49
+ console.error('Error occurred during Git installation:', error);
50
+ exit(0);
51
+ }
52
+ }
@@ -0,0 +1,21 @@
1
+ export var Environment;
2
+ (function (Environment) {
3
+ Environment["Production"] = "production";
4
+ Environment["Staging"] = "staging";
5
+ })(Environment || (Environment = {}));
6
+ export var PublishType;
7
+ (function (PublishType) {
8
+ PublishType["Staging"] = "staging";
9
+ PublishType["Production"] = "production";
10
+ PublishType["Canary"] = "canary";
11
+ })(PublishType || (PublishType = {}));
12
+ var BasicType;
13
+ (function (BasicType) {
14
+ BasicType["Basic"] = "basic";
15
+ })(BasicType || (BasicType = {}));
16
+ var UpgradeTargetTypes;
17
+ (function (UpgradeTargetTypes) {
18
+ UpgradeTargetTypes["Medium"] = "medium";
19
+ UpgradeTargetTypes["High"] = "high";
20
+ UpgradeTargetTypes["Enterprise"] = "enterprise";
21
+ })(UpgradeTargetTypes || (UpgradeTargetTypes = {}));
@@ -0,0 +1,149 @@
1
+ import chalk from 'chalk';
2
+ import { format, createLogger, transports } from 'winston';
3
+ import Table from 'cli-table3';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import ora from 'ora';
7
+ import { fileURLToPath } from 'url';
8
+ import t from '../i18n/index.js';
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ class Logger {
11
+ constructor() {
12
+ const { combine, timestamp, label, printf } = format;
13
+ const customFormat = printf(({ level, message, label: printLabel, timestamp: printTimestamp }) => {
14
+ let colorizedLevel;
15
+ switch (level) {
16
+ case 'error':
17
+ colorizedLevel = chalk.bgRed(' ERROR ');
18
+ return `❌ ${colorizedLevel} ${chalk.red(message)}`;
19
+ case 'verbose':
20
+ colorizedLevel = chalk.magenta(level);
21
+ break;
22
+ case 'debug':
23
+ colorizedLevel = chalk.grey(level);
24
+ break;
25
+ case 'silly':
26
+ colorizedLevel = chalk.white(level);
27
+ break;
28
+ default:
29
+ colorizedLevel = level;
30
+ }
31
+ return `${printTimestamp} [${chalk.green(printLabel)}] ${colorizedLevel}: ${message}`;
32
+ });
33
+ this.logger = createLogger({
34
+ level: 'info',
35
+ format: combine(label({ label: 'Esa' }), timestamp(), customFormat),
36
+ transports: [
37
+ new transports.Console(),
38
+ new transports.File({
39
+ filename: path.join(os.homedir(), '.asea-logs/esa-debug.log'),
40
+ level: 'error'
41
+ })
42
+ ]
43
+ });
44
+ this.spinner = ora('Loading...');
45
+ }
46
+ static getInstance() {
47
+ if (!Logger.instance) {
48
+ Logger.instance = new Logger();
49
+ // Object.freeze(Logger.instance);
50
+ }
51
+ return Logger.instance;
52
+ }
53
+ get ora() {
54
+ return this.spinner;
55
+ }
56
+ setLogLevel(level) {
57
+ this.logger.level = level;
58
+ }
59
+ log(message) {
60
+ console.log(message);
61
+ }
62
+ subLog(message) {
63
+ console.log(`\t${message}`);
64
+ }
65
+ success(message) {
66
+ console.log(`🎉 ${chalk.bgGreen(' SUCCESS ')} ${chalk.green(message)}`);
67
+ }
68
+ debug(message) {
69
+ this.logger.debug(message);
70
+ }
71
+ info(message) {
72
+ console.log(`💬 ${message}`);
73
+ }
74
+ ask(message) {
75
+ console.log(`❓ ${message}`);
76
+ }
77
+ point(message) {
78
+ console.log(`👉🏻 ${chalk.green(message)}`);
79
+ }
80
+ block() {
81
+ console.log(' ');
82
+ }
83
+ warn(message) {
84
+ console.log(`${chalk.bgYellow(' WARNING ')} ${chalk.yellow(message)}`);
85
+ }
86
+ error(message) {
87
+ this.logger.error(message);
88
+ }
89
+ subError(message) {
90
+ console.log(` ${chalk.red(message)}`);
91
+ }
92
+ http(message) {
93
+ this.logger.http(message);
94
+ }
95
+ url(message) {
96
+ console.log(`🔗 ${chalk.blue(message)}`);
97
+ }
98
+ verbose(message) {
99
+ this.logger.verbose(message);
100
+ }
101
+ silly(message) {
102
+ this.logger.silly(message);
103
+ }
104
+ announcement(message) {
105
+ // todo
106
+ console.log(message);
107
+ }
108
+ notInProject() {
109
+ const initCommand = chalk.green('esa init');
110
+ this.logger.error(t('common_not_edge_project', { initCommand }).d(`You are not in an esa project, Please run ${initCommand} to initialize a project, or enter an esa project.`));
111
+ }
112
+ pathEacces(localPath) {
113
+ this.block();
114
+ this.log(chalk.yellow(t('common_eacces_intro', { localPath }).d(`You do not have permission to ${localPath}, please use`)));
115
+ this.block();
116
+ this.log(chalk.green(`$ ${chalk.red('sudo')} esa <Command>`));
117
+ this.block();
118
+ this.subLog(chalk.yellow('OR'));
119
+ this.block();
120
+ this.log(chalk.green(`$ sudo chmod -R 777 ${localPath}`));
121
+ }
122
+ table(head, data) {
123
+ const table = new Table({
124
+ head
125
+ });
126
+ table.push(...data);
127
+ this.log(table.toString());
128
+ this.block();
129
+ }
130
+ tree(messages) {
131
+ if (messages.length === 0)
132
+ return;
133
+ if (messages.length === 1) {
134
+ console.log(`─ ${messages[0]}`);
135
+ return;
136
+ }
137
+ console.log(`╭─ ${messages[0]}`);
138
+ for (let i = 1; i < messages.length - 1; i++) {
139
+ console.log(`│`);
140
+ console.log(`├─ ${messages[i]}`);
141
+ }
142
+ if (messages.length > 1) {
143
+ console.log(`│`);
144
+ console.log(`╰─ ${messages[messages.length - 1]}`);
145
+ }
146
+ }
147
+ }
148
+ const logger = Logger.getInstance();
149
+ export default logger;
@@ -0,0 +1,98 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import fetch, { Headers } from 'node-fetch';
11
+ class HttpRequest {
12
+ constructor(defaultHeaders = {
13
+ 'Content-Type': 'application/json'
14
+ }, timeout = 15000, retryCount = 3) {
15
+ this.defaultHeaders = new Headers(defaultHeaders);
16
+ this.timeout = timeout;
17
+ this.retryCount = retryCount;
18
+ }
19
+ static getInstance(defaultHeaders, timeout, retryCount) {
20
+ if (!HttpRequest.instance) {
21
+ HttpRequest.instance = new HttpRequest(defaultHeaders, timeout, retryCount);
22
+ Object.freeze(HttpRequest.instance);
23
+ }
24
+ return HttpRequest.instance;
25
+ }
26
+ fetchWithTimeout(url_1) {
27
+ return __awaiter(this, arguments, void 0, function* (url, options = {}) {
28
+ const controller = new AbortController();
29
+ const id = setTimeout(() => controller.abort(), this.timeout);
30
+ options.signal = controller.signal;
31
+ try {
32
+ return yield fetch(url, options);
33
+ }
34
+ catch (error) {
35
+ throw new Error(`请求超时或失败: ${error.message}`);
36
+ }
37
+ finally {
38
+ clearTimeout(id);
39
+ }
40
+ });
41
+ }
42
+ fetchWithRetry(url_1) {
43
+ return __awaiter(this, arguments, void 0, function* (url, options = {}) {
44
+ for (let attempt = 1; attempt <= this.retryCount; attempt++) {
45
+ try {
46
+ const response = yield this.fetchWithTimeout(url, options);
47
+ if (response.ok) {
48
+ return response;
49
+ }
50
+ throw new Error(`服务器响应错误: ${response.status} ${response.statusText}`);
51
+ }
52
+ catch (error) {
53
+ if (attempt === this.retryCount) {
54
+ throw error;
55
+ }
56
+ }
57
+ }
58
+ throw new Error('达到最大重试次数');
59
+ });
60
+ }
61
+ get(url, headers) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ try {
64
+ const response = yield this.fetchWithRetry(url, {
65
+ method: 'GET',
66
+ headers: headers
67
+ ? new Headers(Object.assign(Object.assign({}, this.defaultHeaders), headers))
68
+ : this.defaultHeaders
69
+ });
70
+ return yield response.json();
71
+ }
72
+ catch (error) {
73
+ console.error(`GET请求错误: ${error.message}`);
74
+ throw error;
75
+ }
76
+ });
77
+ }
78
+ post(url, data, headers) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ try {
81
+ const response = yield this.fetchWithRetry(url, {
82
+ method: 'POST',
83
+ body: JSON.stringify(data),
84
+ headers: headers
85
+ ? new Headers(Object.assign(Object.assign({}, this.defaultHeaders), headers))
86
+ : this.defaultHeaders
87
+ });
88
+ return yield response.json();
89
+ }
90
+ catch (error) {
91
+ console.error(`POST请求错误: ${error.message}`);
92
+ throw error;
93
+ }
94
+ });
95
+ }
96
+ }
97
+ const request = HttpRequest.getInstance();
98
+ export default request;
@@ -0,0 +1,16 @@
1
+ import { getSummary } from '../../commands/common/constant.js';
2
+ import chalk from 'chalk';
3
+ export default class Template {
4
+ constructor(path, title) {
5
+ this.path = path;
6
+ this.title = title;
7
+ }
8
+ printSummary() {
9
+ const list = getSummary(this.title);
10
+ list.forEach((summary) => {
11
+ const title = chalk.bold(summary.title);
12
+ const command = chalk.green(summary.command);
13
+ console.log(`${title}: ${command}`);
14
+ });
15
+ }
16
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "esa-cli",
3
+ "version": "0.0.1-beta.1",
4
+ "description": "A CLI for operating Alibaba Cloud ESA EdgeRoutine (Edge Functions).",
5
+ "main": "bin/enter.cjs",
6
+ "type": "module",
7
+ "files": [
8
+ "dist/"
9
+ ],
10
+ "bin": {
11
+ "esa": "bin/enter.cjs"
12
+ },
13
+ "scripts": {
14
+ "build": "rm -rf ./dist && rm -rf ./build && node ./genLocale.cjs && tsc && node ./copy.cjs",
15
+ "watch": "tsc --watch",
16
+ "eslint": "eslint src/ --ext .js,.jsx,.ts,.tsx",
17
+ "lint-staged": "lint-staged",
18
+ "prepare": "npm run build",
19
+ "test": "vitest",
20
+ "coverage": "vitest --coverage",
21
+ "preuninstall": "rm -rf ~/.esa/config"
22
+ },
23
+ "keywords": [
24
+ "cli",
25
+ "edge",
26
+ "esa",
27
+ "alibaba",
28
+ "ali"
29
+ ],
30
+ "author": "Kinice",
31
+ "license": "MIT",
32
+ "devDependencies": {
33
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
34
+ "@types/cli-table": "^0.3.4",
35
+ "@types/cross-spawn": "^6.0.6",
36
+ "@types/fs-extra": "^11.0.4",
37
+ "@types/jest": "^29.5.12",
38
+ "@types/lodash": "^4.14.202",
39
+ "@types/node": "^20.8.10",
40
+ "@types/node-fetch": "^2.6.9",
41
+ "@types/portscanner": "^2.1.4",
42
+ "@types/react": "^18.2.47",
43
+ "@types/yargs": "^17.0.32",
44
+ "@typescript-eslint/parser": "^6.9.1",
45
+ "eslint": "^8.52.0",
46
+ "eslint-config-prettier": "^9.0.0",
47
+ "eslint-plugin-react": "^7.33.2",
48
+ "eslint-plugin-react-hooks": "^4.6.0",
49
+ "husky": "^8.0.3",
50
+ "lint-staged": "^15.0.2",
51
+ "prettier": "^3.0.3",
52
+ "react": "^18.2.0",
53
+ "react-dom": "^18.2.0",
54
+ "rimraf": "^6.0.1",
55
+ "tsc-files": "^1.1.4",
56
+ "typescript": "^5.2.2",
57
+ "vitest": "^2.0.4"
58
+ },
59
+ "dependencies": {
60
+ "@alicloud/openapi-client": "^0.4.7",
61
+ "@alife/esa-cli-test": "^0.0.1-beta.1",
62
+ "@babel/parser": "^7.24.4",
63
+ "@babel/traverse": "^7.24.1",
64
+ "@iarna/toml": "^2.2.5",
65
+ "@tqman/ink-table": "^0.0.0-development",
66
+ "@types/inquirer": "^9.0.7",
67
+ "@vitest/coverage-istanbul": "^2.0.4",
68
+ "chalk": "^5.3.0",
69
+ "chokidar": "^3.5.3",
70
+ "cli-table3": "^0.6.5",
71
+ "cross-spawn": "^7.0.3",
72
+ "esbuild": "^0.21.1",
73
+ "esbuild-plugin-less": "^1.3.8",
74
+ "form-data": "^4.0.0",
75
+ "fs-extra": "^11.2.0",
76
+ "ink": "^5.0.1",
77
+ "ink-select-input": "^6.0.0",
78
+ "ink-text-input": "^6.0.0",
79
+ "inquirer": "^9.2.15",
80
+ "js-base64": "^3.7.7",
81
+ "node-fetch": "^3.3.2",
82
+ "open": "^9.1.0",
83
+ "ora": "^7.0.1",
84
+ "os-locale": "^6.0.2",
85
+ "portscanner": "^2.2.0",
86
+ "winston": "^3.11.0",
87
+ "yargs": "^17.7.2"
88
+ },
89
+ "repository": {
90
+ "type": "git",
91
+ "url": "git+ssh://git@github.com/aliyun/alibabacloud-esa-cli.git"
92
+ }
93
+ }
@@ -0,0 +1,113 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import portscanner from 'portscanner';
11
+ import SelectItems from '../components/selectInput.js';
12
+ import inquirer from 'inquirer';
13
+ import logger from '../libs/logger.js';
14
+ import t from '../i18n/index.js';
15
+ import chalk from 'chalk';
16
+ export const checkPort = (port) => {
17
+ return new Promise((resolve) => {
18
+ portscanner.checkPortStatus(port, '127.0.0.1', (error, status) => {
19
+ if (error) {
20
+ resolve(false);
21
+ }
22
+ else if (status === 'open') {
23
+ resolve(false);
24
+ }
25
+ else {
26
+ resolve(true);
27
+ }
28
+ });
29
+ });
30
+ };
31
+ const ask = () => {
32
+ return new Promise((resolve) => {
33
+ SelectItems({
34
+ items: [
35
+ { label: 'Yes', value: 'yes' },
36
+ { label: 'No', value: 'no' }
37
+ ],
38
+ handleSelect: (item) => __awaiter(void 0, void 0, void 0, function* () {
39
+ resolve(item.value === 'yes');
40
+ })
41
+ });
42
+ });
43
+ };
44
+ const findAvailablePort = (startPort) => __awaiter(void 0, void 0, void 0, function* () {
45
+ return yield portscanner.findAPortNotInUse(startPort, 65535);
46
+ });
47
+ const echoNewInspectTip = () => {
48
+ logger.point(t('dev_inspect_tip1').d('You just provided a new inspection port'));
49
+ logger.point(t('dev_inspect_tip2').d('You need to open chrome://inspect'));
50
+ logger.point(t('dev_inspect_tip3').d('Click Configure.. button behind the Discover network targets'));
51
+ logger.point(t('dev_inspect_tip4').d('Config your new IP address and port in Target discovery settings'));
52
+ logger.point(t('dev_inspect_tip5').d('Now you can use Chrome inspect with new port 😉'));
53
+ logger.block();
54
+ };
55
+ const checkAndInputPort = (denoPort, inspectPort) => __awaiter(void 0, void 0, void 0, function* () {
56
+ let finalDenoPort = denoPort;
57
+ let finalInspectPort = inspectPort;
58
+ const isDenoPortAvailable = yield checkPort(denoPort);
59
+ const stringDenoPort = denoPort.toString();
60
+ const stringInspectPort = inspectPort.toString();
61
+ if (!isDenoPortAvailable) {
62
+ logger.error(t('dev_port_used', { stringDenoPort }).d(`Port ${stringDenoPort} already in use.`));
63
+ try {
64
+ const availablePort = yield findAvailablePort(denoPort);
65
+ finalDenoPort = (yield inquirer.prompt([
66
+ {
67
+ type: 'number',
68
+ name: 'port',
69
+ message: t('dev_port_ask_input').d('Input a new port:'),
70
+ default: availablePort
71
+ }
72
+ ])).port;
73
+ const isNewDenoPortAvailable = yield checkPort(finalDenoPort);
74
+ if (!isNewDenoPortAvailable) {
75
+ logger.error(t('dev_port_invalid').d('This port is invalid.'));
76
+ throw new Error('Specified port already in use.');
77
+ }
78
+ }
79
+ catch (_) {
80
+ const option = chalk.green('esa dev --port <port>');
81
+ logger.info(t('dev_port_used_advice', { option }).d(`You can use ${option} to specify another port.`));
82
+ throw new Error('Specified port already in use.');
83
+ }
84
+ }
85
+ const isInspectPortAvailable = yield checkPort(inspectPort);
86
+ if (!isInspectPortAvailable) {
87
+ logger.error(t('dev_inspect_port_used', { stringInspectPort }).d(`Inspect port ${stringInspectPort} already in use.`));
88
+ try {
89
+ const availablePort = yield findAvailablePort(inspectPort);
90
+ finalInspectPort = (yield inquirer.prompt([
91
+ {
92
+ type: 'number',
93
+ name: 'port',
94
+ message: t('dev_inspect_port_ask_input').d('Input a new Chrome inspect port:'),
95
+ default: availablePort
96
+ }
97
+ ])).port;
98
+ }
99
+ catch (_) {
100
+ const option = chalk.green('esa dev --inspect-port <port>');
101
+ logger.info(t('dev_port_used_advice', { option }).d(`You can use ${option} to specify another port.`));
102
+ throw new Error('Inspect port already in use.');
103
+ }
104
+ }
105
+ if (finalInspectPort !== inspectPort) {
106
+ echoNewInspectTip();
107
+ }
108
+ return {
109
+ denoPort: finalDenoPort,
110
+ inspectPort: finalInspectPort
111
+ };
112
+ });
113
+ export default checkAndInputPort;
@@ -0,0 +1,56 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import path from 'path';
11
+ import { createEdgeRoutine } from '../commands/commit/index.js';
12
+ import { displaySelectSpec } from '../commands/deploy/index.js';
13
+ import { ApiService } from '../libs/apiService.js';
14
+ import { readEdgeRoutineFile } from './fileUtils/index.js';
15
+ import logger from '../libs/logger.js';
16
+ import t from '../i18n/index.js';
17
+ import prodBuild from '../commands/commit/prodBuild.js';
18
+ import { exit } from 'process';
19
+ import chalk from 'chalk';
20
+ export function isRoutineExist(name) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const server = yield ApiService.getInstance();
23
+ const req = { Name: name };
24
+ const response = yield server.getRoutine(req, false);
25
+ return !!response;
26
+ });
27
+ }
28
+ export function validRoutine(name) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const isCreatedRoutine = yield isRoutineExist(name);
31
+ if (!isCreatedRoutine) {
32
+ logger.warn(`${t('routine_not_exist').d('Routine does not exist, please create a new one. Run command:')} ${chalk.greenBright('esa deploy')}`);
33
+ exit(0);
34
+ }
35
+ });
36
+ }
37
+ export function checkRoutineExist(name, entry) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ var _a;
40
+ const isCreatedRoutine = yield isRoutineExist(name);
41
+ if (!isCreatedRoutine) {
42
+ logger.log(t('first_deploy').d('This is the first time to deploy, we will create a new routine for you.'));
43
+ const entryFile = path.resolve(entry !== null && entry !== void 0 ? entry : '', 'src/index.js');
44
+ yield prodBuild(false, entryFile, entry);
45
+ const code = readEdgeRoutineFile(entry) || '';
46
+ const server = yield ApiService.getInstance();
47
+ const specList = yield server.listRoutineSpecs();
48
+ const spec = yield displaySelectSpec((_a = specList === null || specList === void 0 ? void 0 : specList.data.Specs) !== null && _a !== void 0 ? _a : []);
49
+ yield createEdgeRoutine({
50
+ name: name,
51
+ specName: spec,
52
+ code: code
53
+ });
54
+ }
55
+ });
56
+ }
@@ -0,0 +1,26 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { promises as fs } from 'fs';
11
+ import { getDirName } from '../utils/fileUtils/index.js';
12
+ import path from 'path';
13
+ export function handleCheckVersion() {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ const __dirname = getDirName(import.meta.url);
16
+ const packageJsonPath = path.join(__dirname, '..', 'package.json');
17
+ try {
18
+ const jsonString = yield fs.readFile(packageJsonPath, 'utf-8');
19
+ const packageJson = JSON.parse(jsonString);
20
+ console.log(`v${packageJson.version}`);
21
+ }
22
+ catch (error) {
23
+ console.error('Error reading version', error);
24
+ }
25
+ });
26
+ }
@@ -0,0 +1,18 @@
1
+ export default function debounce(func, wait, immediate = false) {
2
+ let timeoutId = null;
3
+ return (...args) => {
4
+ const later = () => {
5
+ timeoutId = null;
6
+ if (!immediate)
7
+ func(...args);
8
+ };
9
+ const shouldCallNow = immediate && timeoutId === null;
10
+ if (timeoutId !== null) {
11
+ clearTimeout(timeoutId);
12
+ }
13
+ timeoutId = setTimeout(later, wait);
14
+ if (shouldCallNow) {
15
+ func(...args);
16
+ }
17
+ };
18
+ }