agentk-old-node
Advanced tools
Comparing version 1.5.7 to 1.6.0
@@ -201,6 +201,5 @@ #!/bin/sh | ||
help: "generate documentation", | ||
args: "[<output directory>] [--format=<html|md>]", | ||
args: "[<output directory>]", | ||
"desc": "generate documentation for all module files in src/module. \n\n\x1b[36mOPTIONS\x1b[0m\n\n" + | ||
" \x1b[32moutput directory\x1b[0m: output directory for generated files, defaults to \x1b[36m./doc/\n" + | ||
" \x1b[32m--format=<html|md>\x1b[0m: output format of generated files, defaults to md", | ||
" \x1b[32moutput directory\x1b[0m: output directory for generated files, defaults to \x1b[36m./doc/\n", | ||
func: function (outDir) { | ||
@@ -211,12 +210,5 @@ outDir = path.resolve(outDir || 'doc'); | ||
co.run(function () { | ||
let module = co.yield(load(path.join(__dirname, '../src/module/doc.js'))); | ||
let module = co.yield(load(path.join(__dirname, '../src/doc.js'))); | ||
module.doc(outDir, properties.format || 'md'); | ||
}).done(); | ||
}, | ||
completion: function () { | ||
let lastArg = arguments[arguments.length - 1]; | ||
if (!lastArg) return; | ||
let buf = completion('', lastArg, '--format=html'); | ||
buf = completion(buf, lastArg, '--format=md'); | ||
return buf; | ||
} | ||
@@ -319,5 +311,4 @@ }, | ||
} | ||
let ret; | ||
if (args.length === 4) { | ||
if (process.argv.length === 6) { | ||
ret = commands.help.completion(arg2 || '', true); | ||
@@ -324,0 +315,0 @@ } else { |
{ | ||
"name": "agentk-old-node", | ||
"version": "1.5.7", | ||
"version": "1.6.0", | ||
"description": "synchronous web service framework", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -11,7 +11,6 @@ # AgentK: 全新的Node.JS集成开发运行框架 | ||
了解更多请参考 [wiki](https://github.com/kyriosli/agentk/wiki) | ||
了解更多请参考 [wiki](/fed/agentk/wikis/home) | ||
### 快速上手 | ||
参考 [wiki](https://github.com/kyriosli/agentk/wiki/getting_started) | ||
参考 [wiki](/fed/agentk/wikis/getting_started) |
130
src/co.js
@@ -17,53 +17,18 @@ "use strict"; | ||
const $slice = Array.prototype.slice; | ||
exports.run = function (cb, arg) { | ||
return new Promise(function (resolve, reject) { | ||
let fiber = new Fiber(cb); | ||
return runIterator(fiber_to_iterator(cb, this, $slice.call(arguments, 1))); | ||
}; | ||
sched(arg); | ||
function sched(args) { | ||
let result; | ||
try { | ||
result = fiber.run(args); | ||
} catch (e) { | ||
cleanup(); | ||
return reject(e); | ||
} | ||
onresult(result); | ||
} | ||
exports.wrap = function (cb) { | ||
return function runFiber() { | ||
return runIterator(fiber_to_iterator(cb, this, arguments)) | ||
} | ||
}; | ||
function onerr(err) { | ||
let result; | ||
try { | ||
result = fiber.throwInto(err); | ||
} catch (e) { | ||
cleanup(); | ||
return reject(e); | ||
} | ||
onresult(result); | ||
} | ||
exports.runIterator = runIterator; | ||
function onresult(result) { | ||
if (!fiber.started) { | ||
cleanup(); | ||
resolve(result); | ||
return; | ||
} | ||
result.then(sched, onerr); | ||
} | ||
function cleanup() { | ||
let resources = fiber.resources; | ||
if (resources) { | ||
fiber.resources = null; | ||
for (let handle of resources) { | ||
handle._close(); | ||
} | ||
} | ||
fiber = null; | ||
} | ||
}); | ||
}; | ||
exports.promise = function (cb) { | ||
return exports.yield(new Promise(cb)); | ||
return Fiber.yield(new Promise(cb)); | ||
}; | ||
@@ -93,3 +58,3 @@ | ||
exports.sleep = function (timeout) { | ||
exports.yield(new Promise(function (resolve) { | ||
Fiber.yield(new Promise(function (resolve) { | ||
setTimeout(resolve, timeout); | ||
@@ -114,2 +79,71 @@ })) | ||
} | ||
}; | ||
}; | ||
function fiber_to_iterator(cb, self, args) { | ||
let fiber = new Fiber(function () { | ||
try { | ||
return cb.apply(self, args); | ||
} finally { | ||
fiber = null | ||
} | ||
}); | ||
return { | ||
next: function (arg) { | ||
return makeResult(fiber.run(arg)); | ||
}, throw: function (err) { | ||
return makeResult(fiber.throwInto(err)) | ||
} | ||
}; | ||
function makeResult(result) { | ||
return {done: !fiber, value: result} | ||
} | ||
} | ||
function cleanup(fiber) { // cleanup | ||
let resources = fiber.resources; | ||
if (resources) { | ||
fiber.resources = null; | ||
for (let handle of resources) { | ||
handle._close(); | ||
} | ||
} | ||
} | ||
function runIterator(iterator) { | ||
return new Promise(function (resolve, reject) { | ||
sched(); | ||
function sched(args) { | ||
let result; | ||
try { | ||
result = iterator.next(args); | ||
} catch (e) { | ||
cleanup(iterator); | ||
return reject(e); | ||
} | ||
onresult(result); | ||
} | ||
function onerr(err) { | ||
let result; | ||
try { | ||
result = iterator.throw(err); | ||
} catch (e) { | ||
cleanup(iterator); | ||
return reject(e); | ||
} | ||
onresult(result); | ||
} | ||
function onresult(result) { | ||
if (result.done) { | ||
cleanup(iterator); | ||
resolve(result.value); | ||
return; | ||
} | ||
result.value.then(sched, onerr); | ||
} | ||
}); | ||
} |
@@ -5,3 +5,6 @@ // | ||
const parseOptions = { | ||
ecmaVersion: 7, | ||
sourceType: 'module', | ||
locations: true, | ||
plugins: {asyncawait: true}, | ||
loc: true | ||
@@ -15,3 +18,5 @@ }, transformOptions = require('./javascript/transform_options'), buildOptions = { | ||
const esprima = require('./javascript/esprima'); | ||
const acorn = require('./javascript/acorn'), parse = acorn.parse; | ||
require('./javascript/acorn-es7-plugin')(acorn); | ||
const build = require('./javascript/builder'); | ||
@@ -27,3 +32,3 @@ const transform = require('./javascript/transformer'); | ||
global.include = function (name) { | ||
return include(name).then(function (module) { | ||
return includeAsync(name).then(function (module) { | ||
return module[loadProgress] | ||
@@ -60,3 +65,3 @@ }) | ||
*/ | ||
function include(name) { | ||
function includeAsync(name) { | ||
if (!/\.(\w+)$/.test(name)) { | ||
@@ -77,3 +82,7 @@ name += '.js'; | ||
} | ||
let basename = path.basename(name); | ||
let basename = path.basename(name), supername = path.basename(name.slice(0, -basename.length)); | ||
if (supername !== 'module') { // file not found | ||
return definedModules[name] = Promise.reject(new Error('ENOENT, no such file or directory \'' + name + '\'')); | ||
} | ||
return definedModules[name] = require('./module_server').download(basename).then(function (buffer) { | ||
@@ -137,3 +146,4 @@ ensureParentDir(name); | ||
function compile(buffer, option) { | ||
let ast = esprima.parse(buffer, parseOptions); | ||
let ast = parse(buffer, parseOptions); | ||
transformOptions.dir = option.dir; | ||
let transformed = option.transformed = transform(ast, transformOptions); | ||
@@ -173,7 +183,7 @@ return build(transformed.ast, buildOptions); | ||
return _load(path, option) | ||
}, function (name) { | ||
return co.yield(include(path.resolve(__dirname, name))) | ||
}, __filename, __dirname, moduleDefault, loadProgress); | ||
}, function _import(name) { | ||
return co.yield(includeAsync(path.resolve(__dirname, name))) | ||
}, includeAsync, __filename, __dirname, moduleDefault, loadProgress); | ||
return module; | ||
}); | ||
} |
"use strict"; | ||
const Syntax = require('./esprima').Syntax; | ||
const Syntax = require('./Syntax'); | ||
const newlines = '\n'.repeat(128), whitespaces = ' '.repeat(128); | ||
@@ -5,0 +5,0 @@ |
"use strict"; | ||
const _path = require('path'); | ||
let handle_string_template, handle_class, handle_destruct, handle_function_default_param, handle_function_rest_param; | ||
let current_dirname; | ||
const Syntax = require('./esprima').Syntax; | ||
const Syntax = require('./Syntax'); | ||
const params = ['module', 'co', 'require', 'include', '__filename', '__dirname', 'moduleDefault', 'loadProgress'].map(id), | ||
const params = ['module', 'co', 'require', 'include', 'includeAsync', '__filename', '__dirname', 'moduleDefault', 'loadProgress'].map(id), | ||
useStrict = expr(raw('"use strict"')), | ||
@@ -29,2 +32,3 @@ VarType = {kind: 'var'}, | ||
handle_destruct = options.Destruct; | ||
current_dirname = options.dir; | ||
@@ -43,3 +47,5 @@ iterate(ast.body); | ||
ImportDeclaration: function (stmt, idx, arr) { | ||
const $include = call(id('include'), [stmt.source]); | ||
const $include = call(id('co.yield'), [ | ||
call(id('includeAsync'), [raw(JSON.stringify(_path.resolve(current_dirname, stmt.source.value)))]) | ||
]); | ||
if (!stmt.specifiers.length) { // import only | ||
@@ -400,2 +406,6 @@ arr[idx] = expr(call(member({ | ||
}, | ||
AwaitExpression: function (expr) { | ||
handle('argument', expr); | ||
expr.type = Syntax.YieldExpression; | ||
}, | ||
Identifier: function (id) { | ||
@@ -727,3 +737,2 @@ context.onIdentifier(id) | ||
const scope = makeScopeContext(); | ||
const params = obj.params, | ||
@@ -763,3 +772,3 @@ defaults = obj.defaults, | ||
if (defaults.length) { | ||
if (defaults && defaults.length) { | ||
let i = 0; | ||
@@ -796,2 +805,19 @@ while (!defaults[i]) i++; | ||
extra_decls.length && pushExtraDecls('var', extra_decls, obj, true); | ||
if (obj.async) { | ||
if (obj.body.type === Syntax.BlockStatement) { | ||
obj.body = { | ||
type: Syntax.BlockStatement, | ||
body: [{ | ||
type: Syntax.ReturnStatement, | ||
argument: call(id('co.runIterator'), [call(member({ | ||
type: Syntax.FunctionExpression, | ||
generator: true, | ||
params: obj.params, | ||
body: obj.body | ||
}, 'apply'), [$this, $arguments])]) | ||
}] | ||
} | ||
} | ||
} | ||
} | ||
@@ -798,0 +824,0 @@ |
@@ -16,3 +16,3 @@ "use strict"; | ||
if (!server) { | ||
server = 'https://raw.githubusercontent.com/kyriosli/agentk-modules'; | ||
server = 'http://gitlab.corp.qunar.com/fed/agentk-modules/raw'; | ||
} | ||
@@ -38,3 +38,3 @@ | ||
if (tres.statusCode !== 200) { | ||
return reject(new Error("file not found on remote server")); | ||
return reject(new Error(suffix + ": file not found on remote server")); | ||
} | ||
@@ -41,0 +41,0 @@ let bufs = [], totalLen = 0; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
44
15
597808
52
10753
16