Skip to content

Commit a294691

Browse files
authored
feat: support configure egg.revert in package.json (#58)
BREAKING CHANGE: drop Node.js 14 support
1 parent 880ad19 commit a294691

File tree

15 files changed

+419
-318
lines changed

15 files changed

+419
-318
lines changed

.github/workflows/nodejs.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ on:
1212
jobs:
1313
Job:
1414
name: Node.js
15-
uses: artusjs/github-actions/.github/workflows/node-test.yml@v1
15+
uses: node-modules/github-actions/.github/workflows/node-test.yml@master
1616
with:
1717
os: 'ubuntu-latest, macos-latest, windows-latest'
18-
version: '14, 16, 18'
18+
version: '16, 18, 20'

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99
jobs:
1010
release:
1111
name: Node.js
12-
uses: artusjs/github-actions/.github/workflows/node-release.yml@v1
12+
uses: eggjs/github-actions/.github/workflows/node-release.yml@master
1313
secrets:
1414
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
1515
GIT_TOKEN: ${{ secrets.GIT_TOKEN }}

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ run/
99
test/fixtures/ts/app/controller/home.js
1010
test/fixtures/ts-pkg/app/controller/home.js
1111
!test/fixtures/**/node_modules
12+
package-lock.json

lib/cmd/start.js

+42-18
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class StartCommand extends Command {
7676
return 'Start server at prod mode';
7777
}
7878

79-
* run(context) {
79+
async run(context) {
8080
context.execArgvObj = context.execArgvObj || {};
8181
const { argv, env, cwd, execArgvObj } = context;
8282
const HOME = homedir();
@@ -91,12 +91,12 @@ class StartCommand extends Command {
9191

9292
const isDaemon = argv.daemon;
9393

94-
argv.framework = yield this.getFrameworkPath({
94+
argv.framework = await this.getFrameworkPath({
9595
framework: argv.framework,
9696
baseDir,
9797
});
9898

99-
this.frameworkName = yield this.getFrameworkName(argv.framework);
99+
this.frameworkName = await this.getFrameworkName(argv.framework);
100100

101101
const pkgInfo = require(path.join(baseDir, 'package.json'));
102102
argv.title = argv.title || `egg-server-${pkgInfo.name}`;
@@ -121,7 +121,7 @@ class StartCommand extends Command {
121121
// for alinode
122122
env.ENABLE_NODE_LOG = 'YES';
123123
env.NODE_LOG_DIR = env.NODE_LOG_DIR || path.join(logDir, 'alinode');
124-
yield mkdirp(env.NODE_LOG_DIR);
124+
await mkdirp(env.NODE_LOG_DIR);
125125

126126
// cli argv -> process.env.EGG_SERVER_ENV -> `undefined` then egg will use `prod`
127127
if (argv.env) {
@@ -132,6 +132,14 @@ class StartCommand extends Command {
132132
// additional execArgv
133133
execArgvObj.deprecation = false; // --no-deprecation
134134
execArgvObj.traceWarnings = true; // --trace-warnings
135+
const eggInfo = pkgInfo.egg || {};
136+
if (eggInfo.revert) {
137+
context.execArgvObj['security-revert'] = context.execArgvObj['security-revert'] || [];
138+
const reverts = Array.isArray(eggInfo.revert) ? eggInfo.revert : [ eggInfo.revert ];
139+
for (const revert of reverts) {
140+
context.execArgvObj['security-revert'].push(revert);
141+
}
142+
}
135143

136144
const command = argv.node || 'node';
137145

@@ -154,7 +162,10 @@ class StartCommand extends Command {
154162
// whether run in the background.
155163
if (isDaemon) {
156164
this.logger.info(`Save log file to ${logDir}`);
157-
const [ stdout, stderr ] = yield [ getRotatelog(argv.stdout), getRotatelog(argv.stderr) ];
165+
const [ stdout, stderr ] = await Promise.all([
166+
getRotatelog(argv.stdout),
167+
getRotatelog(argv.stderr),
168+
]);
158169
options.stdio = [ 'ignore', stdout, stderr, 'ipc' ];
159170
options.detached = true;
160171

@@ -173,7 +184,7 @@ class StartCommand extends Command {
173184
});
174185

175186
// check start status
176-
yield this.checkStatus(argv);
187+
await this.checkStatus(argv);
177188
} else {
178189
options.stdio = [ 'inherit', 'inherit', 'inherit', 'ipc' ];
179190
debug('Run spawn `%s %s`', command, eggArgs.join(' '));
@@ -194,11 +205,24 @@ class StartCommand extends Command {
194205
}
195206
}
196207

197-
* getFrameworkPath(params) {
208+
async getFrameworkPath(params) {
198209
return utils.getFrameworkPath(params);
199210
}
200211

201-
* getFrameworkName(framework) {
212+
async getFrameworkName(framework) {
213+
const pkgPath = path.join(framework, 'package.json');
214+
let name = 'egg';
215+
try {
216+
const pkg = require(pkgPath);
217+
/* istanbul ignore else */
218+
if (pkg.name) name = pkg.name;
219+
} catch (_) {
220+
/* istanbul next */
221+
}
222+
return name;
223+
}
224+
225+
async getRevert(framework) {
202226
const pkgPath = path.join(framework, 'package.json');
203227
let name = 'egg';
204228
try {
@@ -211,14 +235,14 @@ class StartCommand extends Command {
211235
return name;
212236
}
213237

214-
* checkStatus({ stderr, timeout, 'ignore-stderr': ignoreStdErr }) {
238+
async checkStatus({ stderr, timeout, 'ignore-stderr': ignoreStdErr }) {
215239
let count = 0;
216240
let hasError = false;
217241
let isSuccess = true;
218242
timeout = timeout / 1000;
219243
while (!this.isReady) {
220244
try {
221-
const stat = yield fs.stat(stderr);
245+
const stat = await fs.stat(stderr);
222246
if (stat && stat.size > 0) {
223247
hasError = true;
224248
break;
@@ -233,15 +257,15 @@ class StartCommand extends Command {
233257
break;
234258
}
235259

236-
yield sleep(1000);
260+
await sleep(1000);
237261
this.logger.log('Wait Start: %d...', ++count);
238262
}
239263

240264
if (hasError) {
241265
try {
242266
const args = [ '-n', '100', stderr ];
243267
this.logger.error('tail %s', args.join(' '));
244-
const [ stdout ] = yield execFile('tail', args);
268+
const [ stdout ] = await execFile('tail', args);
245269
this.logger.error('Got error when startup: ');
246270
this.logger.error(stdout);
247271
} catch (err) {
@@ -254,23 +278,23 @@ class StartCommand extends Command {
254278

255279
if (!isSuccess) {
256280
this.child.kill('SIGTERM');
257-
yield sleep(1000);
281+
await sleep(1000);
258282
this.exit(1);
259283
}
260284
}
261285
}
262286

263-
function* getRotatelog(logfile) {
264-
yield mkdirp(path.dirname(logfile));
287+
async function getRotatelog(logfile) {
288+
await mkdirp(path.dirname(logfile));
265289

266-
if (yield fs.exists(logfile)) {
290+
if (await fs.exists(logfile)) {
267291
// format style: .20150602.193100
268292
const timestamp = moment().format('.YYYYMMDD.HHmmss');
269293
// Note: rename last log to next start time, not when last log file created
270-
yield fs.rename(logfile, logfile + timestamp);
294+
await fs.rename(logfile, logfile + timestamp);
271295
}
272296

273-
return yield fs.open(logfile, 'a');
297+
return await fs.open(logfile, 'a');
274298
}
275299

276300
function stringify(obj, ignore) {

lib/cmd/stop.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ class StopCommand extends Command {
2929
return 'Stop server';
3030
}
3131

32-
* run(context) {
32+
async run(context) {
3333
const { argv } = context;
3434

3535
this.logger.info(`stopping egg application ${argv.title ? `with --title=${argv.title}` : ''}`);
3636

3737
// node /Users/tz/Workspaces/eggjs/egg-scripts/lib/start-cluster {"title":"egg-server","workers":4,"port":7001,"baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg"}
38-
let processList = yield this.helper.findNodeProcess(item => {
38+
let processList = await this.helper.findNodeProcess(item => {
3939
const cmd = item.cmd;
4040
return argv.title ?
4141
cmd.includes('start-cluster') && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :
@@ -47,15 +47,15 @@ class StopCommand extends Command {
4747
this.logger.info('got master pid %j', pids);
4848
this.helper.kill(pids);
4949
// wait for 5s to confirm whether any worker process did not kill by master
50-
yield sleep(argv.timeout || '5s');
50+
await sleep(argv.timeout || '5s');
5151
} else {
5252
this.logger.warn('can\'t detect any running egg process');
5353
}
5454

5555

5656
// node --debug-port=5856 /Users/tz/Workspaces/eggjs/test/showcase/node_modules/[email protected]@egg-cluster/lib/agent_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
5757
// node /Users/tz/Workspaces/eggjs/test/showcase/node_modules/[email protected]@egg-cluster/lib/app_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
58-
processList = yield this.helper.findNodeProcess(item => {
58+
processList = await this.helper.findNodeProcess(item => {
5959
const cmd = item.cmd;
6060
return argv.title ?
6161
(cmd.includes(osRelated.appWorkerPath) || cmd.includes(osRelated.agentWorkerPath)) && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :

lib/helper.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ const runScript = require('runscript');
44
const isWin = process.platform === 'win32';
55
const REGEX = isWin ? /^(.*)\s+(\d+)\s*$/ : /^\s*(\d+)\s+(.*)/;
66

7-
exports.findNodeProcess = function* (filterFn) {
7+
exports.findNodeProcess = async function(filterFn) {
88
const command = isWin ?
99
'wmic Path win32_process Where "Name = \'node.exe\'" Get CommandLine,ProcessId' :
1010
// command, cmd are alias of args, not POSIX standard, so we use args
1111
'ps -wweo "pid,args"';
12-
const stdio = yield runScript(command, { stdio: 'pipe' });
12+
const stdio = await runScript(command, { stdio: 'pipe' });
1313
const processList = stdio.stdout.toString().split('\n')
1414
.reduce((arr, line) => {
1515
if (!!line && !line.includes('/bin/sh') && line.includes('node')) {

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"dependencies": {
1111
"await-event": "^2.1.0",
12-
"common-bin": "^2.8.0",
12+
"common-bin": "^3.0.1",
1313
"debug": "^4.1.0",
1414
"egg-utils": "^2.4.1",
1515
"moment": "^2.23.0",
@@ -36,7 +36,7 @@
3636
"node": ">=6.0.0"
3737
},
3838
"ci": {
39-
"version": "14, 16, 18"
39+
"version": "16, 18, 20"
4040
},
4141
"scripts": {
4242
"contributor": "git-contributor",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict';
2+
3+
exports.keys = '123456';
4+
5+
exports.logger = {
6+
level: 'WARN',
7+
consoleLevel: 'WARN',
8+
};

test/fixtures/egg-revert/node_modules/custom-framework/index.js

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/egg-revert/node_modules/custom-framework/package.json

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/egg-revert/package.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "example",
3+
"version": "1.0.0",
4+
"dependencies": {
5+
"egg": "^1.0.0"
6+
},
7+
"egg": {
8+
"framework": "custom-framework",
9+
"revert": "CVE-2023-46809"
10+
}
11+
}

0 commit comments

Comments
 (0)