From 166f71953858e6f93dd4b374d0e03bb7aaa1f5f4 Mon Sep 17 00:00:00 2001 From: bencode Date: Tue, 27 Apr 2021 21:46:37 +0800 Subject: [PATCH 01/22] feat: improve api --- lib/components/controller/index.js | 2 +- lib/components/core/errorHandler.js | 1 - lib/components/router/index.js | 2 +- lib/components/service/index.js | 2 +- lib/components/view/index.js | 3 +-- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/components/controller/index.js b/lib/components/controller/index.js index abe969a..efb9657 100644 --- a/lib/components/controller/index.js +++ b/lib/components/controller/index.js @@ -10,7 +10,7 @@ module.exports = function ControllerComponent(app, settings) { const controllerRoot = config.controllerRoot || pathUtil.join(appRoot, 'controllers'); const container = new ControllerContainer(); - app.controller = container.add.bind(container); + app.Controller = container; setupControllers(container, { controllerRoot }); diff --git a/lib/components/core/errorHandler.js b/lib/components/core/errorHandler.js index a698389..83a6047 100644 --- a/lib/components/core/errorHandler.js +++ b/lib/components/core/errorHandler.js @@ -10,7 +10,6 @@ module.exports = function createErrorHandler({ env }) { return next().catch(e => { const status = e.status || 500; ctx.app.emit('error', e, ctx); - global.console.error(e); const message = getMessage(env, e); ctx.status = status; if (ctx.is('application/json') || diff --git a/lib/components/router/index.js b/lib/components/router/index.js index 5b7d391..954274f 100644 --- a/lib/components/router/index.js +++ b/lib/components/router/index.js @@ -8,7 +8,7 @@ const AppRouter = require('./Router'); module.exports = function RouterComponent(app, settings) { const router = new AppRouter(); - app.router = router.add.bind(router); + app.Router = router; const appRoot = settings.applicationRoot; const config = settings.router || {}; diff --git a/lib/components/service/index.js b/lib/components/service/index.js index 92e1af5..977104b 100644 --- a/lib/components/service/index.js +++ b/lib/components/service/index.js @@ -6,7 +6,7 @@ const ServiceContainer = require('./ServiceContainer'); module.exports = function ServiceComponent(app, settings) { const container = new ServiceContainer(app); - app.service = container.add.bind(container); + app.Service = container; const appRoot = settings.applicationRoot; const config = settings.service || {}; diff --git a/lib/components/view/index.js b/lib/components/view/index.js index 3831f01..63bc039 100644 --- a/lib/components/view/index.js +++ b/lib/components/view/index.js @@ -7,9 +7,8 @@ const ViewContainer = require('./ViewContainer'); module.exports = function ViewComponent(app, settings) { const env = settings.env; const container = new ViewContainer({ env }); + app.View = container; - app.engine = container.engine.bind(container); - app.view = container.add.bind(container); app.context.render = async function(name, data) { this.body = await container.render(name, data); }; From b35908350a8785f66fd8c6c255690b072a93d6e2 Mon Sep 17 00:00:00 2001 From: bencode Date: Tue, 27 Apr 2021 21:47:24 +0800 Subject: [PATCH 02/22] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0caa0ca..0c3f9a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.1", + "version": "1.5.0-beta.2", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From f1892ff89d9c9bd8e990cfb78ae2cd6e542fba4f Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 11:06:31 +0800 Subject: [PATCH 03/22] fix: fix loadAppModule with test file --- lib/components/controller/index.js | 6 ++---- lib/components/service/index.js | 6 ++---- lib/index.js | 6 ++++-- lib/utils/scanAppModules.js | 28 ++++++++++++++++++++++++++++ package.json | 2 +- 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 lib/utils/scanAppModules.js diff --git a/lib/components/controller/index.js b/lib/components/controller/index.js index efb9657..42d4ef2 100644 --- a/lib/components/controller/index.js +++ b/lib/components/controller/index.js @@ -1,6 +1,6 @@ -const fs = require('fs'); const pathUtil = require('path'); const loadModule = require('../../utils/loadModule'); +const scanAppModules = require('../../utils/scanAppModules'); const ControllerContainer = require('./ControllerContainer'); @@ -20,9 +20,7 @@ module.exports = function ControllerComponent(app, settings) { function setupControllers(controller, { controllerRoot }) { - const rHidden = /^\..+/; - const list = fs.readdirSync(controllerRoot) - .filter(name => !rHidden.test(name)); + const list = scanAppModules(controllerRoot); for (const file of list) { const path = pathUtil.join(controllerRoot, file); const mod = loadModule(path); diff --git a/lib/components/service/index.js b/lib/components/service/index.js index 977104b..478b7d3 100644 --- a/lib/components/service/index.js +++ b/lib/components/service/index.js @@ -1,5 +1,5 @@ -const fs = require('fs'); const pathUtil = require('path'); +const scanAppModules = require('../../utils/scanAppModules'); const loadModule = require('../../utils/loadModule'); const ServiceContainer = require('./ServiceContainer'); @@ -22,9 +22,7 @@ module.exports = function ServiceComponent(app, settings) { function setupServices(container, { serviceRoot }) { - const rHidden = /^\..+/; - const list = fs.readdirSync(serviceRoot) - .filter(name => !rHidden.test(name)); + const list = scanAppModules(serviceRoot); for (const file of list) { const name = pathUtil.basename(file, pathUtil.extname(file)); const path = pathUtil.join(serviceRoot, file); diff --git a/lib/index.js b/lib/index.js index 0c158f5..3749fd5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -31,10 +31,12 @@ module.exports = function(config) { const { listen = true } = opts; if (listen) { const port = (config.server || {}).port || 3000; - const server = app.listen(port); - global.console.log(`server listen at: ${port}`); + const server = app.listen(port, () => { + global.console.log(`server listen at: ${port}`); + }); return server; } + return null; }; app.stop = async() => { diff --git a/lib/utils/scanAppModules.js b/lib/utils/scanAppModules.js new file mode 100644 index 0000000..17802d8 --- /dev/null +++ b/lib/utils/scanAppModules.js @@ -0,0 +1,28 @@ +const fs = require('fs'); +const pathUtil = require('path'); + +module.exports = function scanAppModules(dir) { + const list = fs.readdirSync(dir); + return list.filter(name => isAppModule(name, dir)); +}; + +function isAppModule(name, dir) { + const rHidden = /^\./; + // ignore hidden file/dir + if (rHidden.test(name)) { + return false; + } + + // valid js identify + const rName = /^[a-zA-Z]\w*$/; + const path = pathUtil.join(dir, name); + const stats = fs.statSync(path); + if (stats.isDirectory()) { + return rName.test(name); + } + if (stats.isFile()) { + const basename = pathUtil.basename(name, pathUtil.extname(name)); + return rName.test(basename); + } + return false; +} diff --git a/package.json b/package.json index 0c3f9a1..1acab9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.2", + "version": "1.5.0-beta.3", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From f7a3861872522b88b5240c32b95022f9ac64fabc Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 11:47:31 +0800 Subject: [PATCH 04/22] chore: migrate avada lib to packages --- .../avada/lib}/components/controller/ControllerContainer.js | 0 {lib => packages/avada/lib}/components/controller/index.js | 0 {lib => packages/avada/lib}/components/core/errorHandler.js | 0 {lib => packages/avada/lib}/components/core/index.js | 0 {lib => packages/avada/lib}/components/router/Router.js | 0 {lib => packages/avada/lib}/components/router/index.js | 0 {lib => packages/avada/lib}/components/router/parse.js | 0 .../avada/lib}/components/service/ServiceContainer.js | 0 {lib => packages/avada/lib}/components/service/index.js | 0 {lib => packages/avada/lib}/components/view/ViewContainer.js | 0 {lib => packages/avada/lib}/components/view/index.js | 0 {lib => packages/avada/lib}/components/web/csrf.js | 0 {lib => packages/avada/lib}/components/web/flash.js | 0 {lib => packages/avada/lib}/components/web/index.js | 0 {lib => packages/avada/lib}/components/web/params.js | 0 {lib => packages/avada/lib}/components/web/security.js | 0 {lib => packages/avada/lib}/components/web/session.js | 0 {lib => packages/avada/lib}/components/web/util.js | 0 {lib => packages/avada/lib}/index.js | 0 {lib => packages/avada/lib}/utils/loadModule.js | 0 {lib => packages/avada/lib}/utils/pathToRegexp.js | 0 {lib => packages/avada/lib}/utils/scanAppModules.js | 0 package.json => packages/avada/package.json | 0 23 files changed, 0 insertions(+), 0 deletions(-) rename {lib => packages/avada/lib}/components/controller/ControllerContainer.js (100%) rename {lib => packages/avada/lib}/components/controller/index.js (100%) rename {lib => packages/avada/lib}/components/core/errorHandler.js (100%) rename {lib => packages/avada/lib}/components/core/index.js (100%) rename {lib => packages/avada/lib}/components/router/Router.js (100%) rename {lib => packages/avada/lib}/components/router/index.js (100%) rename {lib => packages/avada/lib}/components/router/parse.js (100%) rename {lib => packages/avada/lib}/components/service/ServiceContainer.js (100%) rename {lib => packages/avada/lib}/components/service/index.js (100%) rename {lib => packages/avada/lib}/components/view/ViewContainer.js (100%) rename {lib => packages/avada/lib}/components/view/index.js (100%) rename {lib => packages/avada/lib}/components/web/csrf.js (100%) rename {lib => packages/avada/lib}/components/web/flash.js (100%) rename {lib => packages/avada/lib}/components/web/index.js (100%) rename {lib => packages/avada/lib}/components/web/params.js (100%) rename {lib => packages/avada/lib}/components/web/security.js (100%) rename {lib => packages/avada/lib}/components/web/session.js (100%) rename {lib => packages/avada/lib}/components/web/util.js (100%) rename {lib => packages/avada/lib}/index.js (100%) rename {lib => packages/avada/lib}/utils/loadModule.js (100%) rename {lib => packages/avada/lib}/utils/pathToRegexp.js (100%) rename {lib => packages/avada/lib}/utils/scanAppModules.js (100%) rename package.json => packages/avada/package.json (100%) diff --git a/lib/components/controller/ControllerContainer.js b/packages/avada/lib/components/controller/ControllerContainer.js similarity index 100% rename from lib/components/controller/ControllerContainer.js rename to packages/avada/lib/components/controller/ControllerContainer.js diff --git a/lib/components/controller/index.js b/packages/avada/lib/components/controller/index.js similarity index 100% rename from lib/components/controller/index.js rename to packages/avada/lib/components/controller/index.js diff --git a/lib/components/core/errorHandler.js b/packages/avada/lib/components/core/errorHandler.js similarity index 100% rename from lib/components/core/errorHandler.js rename to packages/avada/lib/components/core/errorHandler.js diff --git a/lib/components/core/index.js b/packages/avada/lib/components/core/index.js similarity index 100% rename from lib/components/core/index.js rename to packages/avada/lib/components/core/index.js diff --git a/lib/components/router/Router.js b/packages/avada/lib/components/router/Router.js similarity index 100% rename from lib/components/router/Router.js rename to packages/avada/lib/components/router/Router.js diff --git a/lib/components/router/index.js b/packages/avada/lib/components/router/index.js similarity index 100% rename from lib/components/router/index.js rename to packages/avada/lib/components/router/index.js diff --git a/lib/components/router/parse.js b/packages/avada/lib/components/router/parse.js similarity index 100% rename from lib/components/router/parse.js rename to packages/avada/lib/components/router/parse.js diff --git a/lib/components/service/ServiceContainer.js b/packages/avada/lib/components/service/ServiceContainer.js similarity index 100% rename from lib/components/service/ServiceContainer.js rename to packages/avada/lib/components/service/ServiceContainer.js diff --git a/lib/components/service/index.js b/packages/avada/lib/components/service/index.js similarity index 100% rename from lib/components/service/index.js rename to packages/avada/lib/components/service/index.js diff --git a/lib/components/view/ViewContainer.js b/packages/avada/lib/components/view/ViewContainer.js similarity index 100% rename from lib/components/view/ViewContainer.js rename to packages/avada/lib/components/view/ViewContainer.js diff --git a/lib/components/view/index.js b/packages/avada/lib/components/view/index.js similarity index 100% rename from lib/components/view/index.js rename to packages/avada/lib/components/view/index.js diff --git a/lib/components/web/csrf.js b/packages/avada/lib/components/web/csrf.js similarity index 100% rename from lib/components/web/csrf.js rename to packages/avada/lib/components/web/csrf.js diff --git a/lib/components/web/flash.js b/packages/avada/lib/components/web/flash.js similarity index 100% rename from lib/components/web/flash.js rename to packages/avada/lib/components/web/flash.js diff --git a/lib/components/web/index.js b/packages/avada/lib/components/web/index.js similarity index 100% rename from lib/components/web/index.js rename to packages/avada/lib/components/web/index.js diff --git a/lib/components/web/params.js b/packages/avada/lib/components/web/params.js similarity index 100% rename from lib/components/web/params.js rename to packages/avada/lib/components/web/params.js diff --git a/lib/components/web/security.js b/packages/avada/lib/components/web/security.js similarity index 100% rename from lib/components/web/security.js rename to packages/avada/lib/components/web/security.js diff --git a/lib/components/web/session.js b/packages/avada/lib/components/web/session.js similarity index 100% rename from lib/components/web/session.js rename to packages/avada/lib/components/web/session.js diff --git a/lib/components/web/util.js b/packages/avada/lib/components/web/util.js similarity index 100% rename from lib/components/web/util.js rename to packages/avada/lib/components/web/util.js diff --git a/lib/index.js b/packages/avada/lib/index.js similarity index 100% rename from lib/index.js rename to packages/avada/lib/index.js diff --git a/lib/utils/loadModule.js b/packages/avada/lib/utils/loadModule.js similarity index 100% rename from lib/utils/loadModule.js rename to packages/avada/lib/utils/loadModule.js diff --git a/lib/utils/pathToRegexp.js b/packages/avada/lib/utils/pathToRegexp.js similarity index 100% rename from lib/utils/pathToRegexp.js rename to packages/avada/lib/utils/pathToRegexp.js diff --git a/lib/utils/scanAppModules.js b/packages/avada/lib/utils/scanAppModules.js similarity index 100% rename from lib/utils/scanAppModules.js rename to packages/avada/lib/utils/scanAppModules.js diff --git a/package.json b/packages/avada/package.json similarity index 100% rename from package.json rename to packages/avada/package.json From 98c4637821b37c8d5ff072d5f61ef7b32e4b40f3 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 15:05:43 +0800 Subject: [PATCH 05/22] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=AF=E7=94=A8=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 ++++++++ packages/avada/lib/index.js | 17 +++++++++++++++++ packages/avada/lib/utils/loadModule.js | 23 ++++------------------- packages/unit/lib/index.js | 19 +++++++++++++++++++ packages/unit/package.json | 22 ++++++++++++++++++++++ 5 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 package.json create mode 100644 packages/unit/lib/index.js create mode 100644 packages/unit/package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..296fa66 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "name": "avada", + "description": "A nodejs web framework", + "private": true, + "repository": "git@github.com:bencode/avada.git", + "author": "bencode ", + "license": "MIT" +} diff --git a/packages/avada/lib/index.js b/packages/avada/lib/index.js index 3749fd5..429f4e3 100644 --- a/packages/avada/lib/index.js +++ b/packages/avada/lib/index.js @@ -9,6 +9,8 @@ const Components = [ module.exports = function(config) { const app = new Koa(); + let started = false; + let stopped = false; const list = []; for (const name of Components) { @@ -20,7 +22,13 @@ module.exports = function(config) { } app.start = async(opts = {}) => { + if (started) { + debug('already started, ignore'); + return; + } + debug('app.start'); + started = true; for (const item of list) { if (typeof item.start === 'function') { debug('start component: %s', item.name); @@ -40,6 +48,15 @@ module.exports = function(config) { }; app.stop = async() => { + if (!started) { + throw new Error('app not started'); + } + if (stopped) { + debug('app stopped, ignore'); + return; + } + stopped = true; + debug('app.stop'); for (const item of list.reverse()) { if (typeof item.stop === 'function') { diff --git a/packages/avada/lib/utils/loadModule.js b/packages/avada/lib/utils/loadModule.js index 4f1adcb..096ddcc 100644 --- a/packages/avada/lib/utils/loadModule.js +++ b/packages/avada/lib/utils/loadModule.js @@ -1,24 +1,9 @@ -const pathUtil = require('path'); - -const EXTS = Object.keys(require.extensions); - module.exports = function loadModule(path) { - path = resolve(path); - return path ? ensure(require(path)) : null; -}; - -function resolve(path) { - const ext = pathUtil.extname(path); - if (ext && !EXTS.includes(ext)) { - return null; - } try { - return require.resolve(path, { paths: [] }); + const mod = require(path); + return ('default' in mod) ? mod.default : mod; } catch (e) { + global.console.error(e); return null; } -} - -function ensure(mod) { - return ('default' in mod) ? mod.default : mod; -} +}; diff --git a/packages/unit/lib/index.js b/packages/unit/lib/index.js new file mode 100644 index 0000000..b07fdc8 --- /dev/null +++ b/packages/unit/lib/index.js @@ -0,0 +1,19 @@ +const avada = require('avada'); +const request = require('supertest'); + +exports.createApp = function createApp(config) { + const app = avada(config); + const startDefer = app.start({ listen: false }); + + const start = async() => { + await startDefer; + } + + const agent = () => request.agent(app.callback()); + + const get = (...args) => { + return request.agent(app.callback()).get(...args); + }; + + return { start, agent, get }; +}; diff --git a/packages/unit/package.json b/packages/unit/package.json new file mode 100644 index 0000000..787abe2 --- /dev/null +++ b/packages/unit/package.json @@ -0,0 +1,22 @@ +{ + "name": "avada-unit", + "version": "1.0.0", + "description": "unit test utility for avada", + "main": "lib/index.js", + "scripts": { + "lint": "eslint lib", + "test": "echo pass!", + "ci": "npm run lint && npm run test" + }, + "dependencies": { + "avada": "^1.5.0-beta.3", + "supertest": "^6.1.3" + }, + "devDependencies": {}, + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "repository": "git@github.com:bencode/avada.git", + "author": "bencode ", + "license": "MIT" +} From 27c261cfd6bee1b62a07bf7d7d80a6fb703b2c30 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 17:06:32 +0800 Subject: [PATCH 06/22] feat: add avata-util --- .eslintrc => packages/avada/.eslintrc | 0 packages/{unit => avata-unit}/lib/index.js | 0 packages/{unit => avata-unit}/package.json | 0 packages/avata-util/.eslintrc | 6 ++++ packages/avata-util/lib/index.js | 3 ++ packages/avata-util/lib/param.js | 39 ++++++++++++++++++++++ packages/avata-util/lib/param.test.js | 26 +++++++++++++++ packages/avata-util/package.json | 25 ++++++++++++++ 8 files changed, 99 insertions(+) rename .eslintrc => packages/avada/.eslintrc (100%) rename packages/{unit => avata-unit}/lib/index.js (100%) rename packages/{unit => avata-unit}/package.json (100%) create mode 100644 packages/avata-util/.eslintrc create mode 100644 packages/avata-util/lib/index.js create mode 100644 packages/avata-util/lib/param.js create mode 100644 packages/avata-util/lib/param.test.js create mode 100644 packages/avata-util/package.json diff --git a/.eslintrc b/packages/avada/.eslintrc similarity index 100% rename from .eslintrc rename to packages/avada/.eslintrc diff --git a/packages/unit/lib/index.js b/packages/avata-unit/lib/index.js similarity index 100% rename from packages/unit/lib/index.js rename to packages/avata-unit/lib/index.js diff --git a/packages/unit/package.json b/packages/avata-unit/package.json similarity index 100% rename from packages/unit/package.json rename to packages/avata-unit/package.json diff --git a/packages/avata-util/.eslintrc b/packages/avata-util/.eslintrc new file mode 100644 index 0000000..dca6e0e --- /dev/null +++ b/packages/avata-util/.eslintrc @@ -0,0 +1,6 @@ +{ + extends: 'eslint-config-bce', + rules: { + 'import/prefer-default-export': 0 + } +} diff --git a/packages/avata-util/lib/index.js b/packages/avata-util/lib/index.js new file mode 100644 index 0000000..53ebe3b --- /dev/null +++ b/packages/avata-util/lib/index.js @@ -0,0 +1,3 @@ +import * as param from './param'; + +export { param }; diff --git a/packages/avata-util/lib/param.js b/packages/avata-util/lib/param.js new file mode 100644 index 0000000..56a7c0d --- /dev/null +++ b/packages/avata-util/lib/param.js @@ -0,0 +1,39 @@ +const { curry } = require('ramda'); + +exports.parse = curry((define, query) => { + return Object.keys(define).reduce((acc, name) => { + const val = query[name]; + const [fn, def] = makeArray(define[name]); + acc[name] = typeof val === 'string' ? fn(val) : + typeof val === 'undefined' ? def : val; + return acc; + }, {}); +}); + +exports.types = { + number, string, bool, arrayOf +}; + +function number(val) { + return +val; +} + +function string(val) { + return '' + (val || ''); +} + +function bool(val) { + return val === 'true' || val === '1'; +} + +function arrayOf(fn) { + return val => { + return val.split(/,/).map(fn); + }; +} + +// Utility + +function makeArray(val) { + return Array.isArray(val) ? val : [val]; +} diff --git a/packages/avata-util/lib/param.test.js b/packages/avata-util/lib/param.test.js new file mode 100644 index 0000000..a8f1101 --- /dev/null +++ b/packages/avata-util/lib/param.test.js @@ -0,0 +1,26 @@ +const { parse, types } = require('./param'); + +test('parse', () => { + const query = { + pageIds: '1,3,5', + type: '3', + action: '1', + name: 'test', + define: 'product' + }; + const params = parse({ + pageIds: types.arrayOf(types.number), + type: types.number, + action: types.number, + name: types.string, + define: types.string + }, query); + + expect(params).toEqual({ + pageIds: [1, 3, 5], + type: 3, + action: 1, + name: 'test', + define: 'product' + }); +}); diff --git a/packages/avata-util/package.json b/packages/avata-util/package.json new file mode 100644 index 0000000..896ea31 --- /dev/null +++ b/packages/avata-util/package.json @@ -0,0 +1,25 @@ +{ + "name": "avada-util", + "version": "1.0.0", + "description": "utility tools for application", + "main": "lib/index.js", + "scripts": { + "lint": "eslint lib", + "test": "jest lib", + "ci": "npm run lint && npm run test" + }, + "dependencies": { + "ramda": "^0.27.1" + }, + "devDependencies": { + "eslint": "^7.27.0", + "eslint-config-bce": "^7.0.0", + "jest": "^27.0.3" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "repository": "git@github.com:bencode/avada.git", + "author": "bencode ", + "license": "MIT" +} From ef35b8c15ceb26353a5d1930da4df6d84681084f Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 17:57:57 +0800 Subject: [PATCH 07/22] add param utility --- packages/avata-util/lib/index.js | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 packages/avata-util/lib/index.js diff --git a/packages/avata-util/lib/index.js b/packages/avata-util/lib/index.js deleted file mode 100644 index 53ebe3b..0000000 --- a/packages/avata-util/lib/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import * as param from './param'; - -export { param }; From d2922ab0cae6ab37b360ad3c05cd4a3402fc1814 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 17:58:25 +0800 Subject: [PATCH 08/22] bump version --- packages/avata-util/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avata-util/package.json b/packages/avata-util/package.json index 896ea31..f2d5d16 100644 --- a/packages/avata-util/package.json +++ b/packages/avata-util/package.json @@ -1,6 +1,6 @@ { "name": "avada-util", - "version": "1.0.0", + "version": "1.0.0-beta.1", "description": "utility tools for application", "main": "lib/index.js", "scripts": { From 1514a7b5296a6eaa084cea4e333aa3a318ee3cf0 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 18:03:05 +0800 Subject: [PATCH 09/22] bump version --- packages/avata-unit/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avata-unit/package.json b/packages/avata-unit/package.json index 787abe2..c88ed16 100644 --- a/packages/avata-unit/package.json +++ b/packages/avata-unit/package.json @@ -1,6 +1,6 @@ { "name": "avada-unit", - "version": "1.0.0", + "version": "1.0.0-beta.1", "description": "unit test utility for avada", "main": "lib/index.js", "scripts": { From 260cf0fd6b3386167aea03b6cf4a8cde8836036c Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 18:05:45 +0800 Subject: [PATCH 10/22] bump version --- packages/avada/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avada/package.json b/packages/avada/package.json index 1acab9c..73caa6c 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.3", + "version": "1.5.0-beta.4", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From 1e3c7ee5360a36703e1f52df525073cb70dd2d6c Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 2 Jun 2021 18:15:10 +0800 Subject: [PATCH 11/22] bump version --- packages/avata-unit/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/avata-unit/package.json b/packages/avata-unit/package.json index c88ed16..38c0994 100644 --- a/packages/avata-unit/package.json +++ b/packages/avata-unit/package.json @@ -1,6 +1,6 @@ { "name": "avada-unit", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "description": "unit test utility for avada", "main": "lib/index.js", "scripts": { @@ -9,7 +9,7 @@ "ci": "npm run lint && npm run test" }, "dependencies": { - "avada": "^1.5.0-beta.3", + "avada": "^1.5.0-beta.4", "supertest": "^6.1.3" }, "devDependencies": {}, From cee3932fe5a29716f35648e559a760444521cbff Mon Sep 17 00:00:00 2001 From: bencode Date: Mon, 21 Jun 2021 14:18:06 +0800 Subject: [PATCH 12/22] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E8=87=AA=E5=8A=A8=E5=8A=A0=E8=BD=BDservices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avada/lib/components/controller/index.js | 4 ++-- packages/avada/lib/components/router/index.js | 15 ++++++++----- .../avada/lib/components/service/index.js | 7 +++--- packages/avada/lib/utils/loadModule.js | 9 -------- packages/avada/lib/utils/module.js | 22 +++++++++++++++++++ 5 files changed, 36 insertions(+), 21 deletions(-) delete mode 100644 packages/avada/lib/utils/loadModule.js create mode 100644 packages/avada/lib/utils/module.js diff --git a/packages/avada/lib/components/controller/index.js b/packages/avada/lib/components/controller/index.js index 42d4ef2..77ddebe 100644 --- a/packages/avada/lib/components/controller/index.js +++ b/packages/avada/lib/components/controller/index.js @@ -1,5 +1,5 @@ const pathUtil = require('path'); -const loadModule = require('../../utils/loadModule'); +const { tryLoadModule } = require('../../utils/module'); const scanAppModules = require('../../utils/scanAppModules'); const ControllerContainer = require('./ControllerContainer'); @@ -23,7 +23,7 @@ function setupControllers(controller, { controllerRoot }) { const list = scanAppModules(controllerRoot); for (const file of list) { const path = pathUtil.join(controllerRoot, file); - const mod = loadModule(path); + const mod = tryLoadModule(path); if (mod) { const name = pathUtil.basename(file, pathUtil.extname(file)); controller.add(name, mod); diff --git a/packages/avada/lib/components/router/index.js b/packages/avada/lib/components/router/index.js index 954274f..233cb64 100644 --- a/packages/avada/lib/components/router/index.js +++ b/packages/avada/lib/components/router/index.js @@ -1,6 +1,6 @@ const pathUtil = require('path'); const debug = require('debug')('avada:router'); -const loadModule = require('../../utils/loadModule'); +const { tryLoadModule } = require('../../utils/module'); const pathToRegexp = require('../../utils/pathToRegexp'); const parse = require('./parse'); const AppRouter = require('./Router'); @@ -14,11 +14,14 @@ module.exports = function RouterComponent(app, settings) { const config = settings.router || {}; const configRoot = config.configPath || pathUtil.join(appRoot, 'router'); - const fn = loadModule(configRoot); - const { middlewares, routes } = parse(fn); - - setupMiddlewares(app, middlewares); - setupRules(router, routes); + const fn = tryLoadModule(configRoot); + if (typeof fn === 'function') { + const { middlewares, routes } = parse(fn); + setupMiddlewares(app, middlewares); + setupRules(router, routes); + } else { + global.console.error('router file not exits'); + } app.use(createRouter(router), { level: 2 }); }; diff --git a/packages/avada/lib/components/service/index.js b/packages/avada/lib/components/service/index.js index 478b7d3..b1d29a9 100644 --- a/packages/avada/lib/components/service/index.js +++ b/packages/avada/lib/components/service/index.js @@ -1,6 +1,6 @@ const pathUtil = require('path'); const scanAppModules = require('../../utils/scanAppModules'); -const loadModule = require('../../utils/loadModule'); +const { tryLoadModule } = require('../../utils/module'); const ServiceContainer = require('./ServiceContainer'); @@ -26,10 +26,9 @@ function setupServices(container, { serviceRoot }) { for (const file of list) { const name = pathUtil.basename(file, pathUtil.extname(file)); const path = pathUtil.join(serviceRoot, file); - const mod = loadModule(path); - const service = mod && mod.default ? mod.default : mod; + const service = tryLoadModule(path); if (service && typeof service === 'function') { - container.add(name, mod); + container.add(name, service); } } } diff --git a/packages/avada/lib/utils/loadModule.js b/packages/avada/lib/utils/loadModule.js deleted file mode 100644 index 096ddcc..0000000 --- a/packages/avada/lib/utils/loadModule.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = function loadModule(path) { - try { - const mod = require(path); - return ('default' in mod) ? mod.default : mod; - } catch (e) { - global.console.error(e); - return null; - } -}; diff --git a/packages/avada/lib/utils/module.js b/packages/avada/lib/utils/module.js new file mode 100644 index 0000000..93ffb27 --- /dev/null +++ b/packages/avada/lib/utils/module.js @@ -0,0 +1,22 @@ +function tryLoadModule(path) { + if (checkModule(path)) { + return loadModule(path); + } + return null; +} + +function checkModule(path) { + try { + require.resolve(path); + return true; + } catch (e) { + return false; + } +} + +function loadModule(path) { + const mod = require(path); + return ('default' in mod) ? mod.default : mod; +} + +module.exports = { tryLoadModule, checkModule, loadModule }; From 1e4099937a081db9af520ebe63a798aa2d9d322a Mon Sep 17 00:00:00 2001 From: bencode Date: Mon, 21 Jun 2021 14:28:36 +0800 Subject: [PATCH 13/22] bump version to 1.5.0-beta.5 --- packages/avada/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avada/package.json b/packages/avada/package.json index 73caa6c..bd21a4b 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.4", + "version": "1.5.0-beta.5", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From d2f63b417a0219a063271ba5629df91e8ddf710e Mon Sep 17 00:00:00 2001 From: bencode Date: Fri, 2 Jul 2021 17:50:08 +0800 Subject: [PATCH 14/22] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcontrollers/serv?= =?UTF-8?q?ices=E7=AD=89=E7=9B=AE=E5=BD=95=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/avada/lib/components/view/index.js | 3 ++- packages/avada/lib/index.js | 11 ++++++++++- packages/avada/lib/utils/module.js | 6 ++++++ packages/avada/lib/utils/scanAppModules.js | 3 +++ packages/avada/package.json | 2 +- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/avada/lib/components/view/index.js b/packages/avada/lib/components/view/index.js index 63bc039..129daa4 100644 --- a/packages/avada/lib/components/view/index.js +++ b/packages/avada/lib/components/view/index.js @@ -14,7 +14,8 @@ module.exports = function ViewComponent(app, settings) { }; const config = settings.view || {}; - const viewRoot = config.viewRoot || pathUtil.join(settings.appRoot, 'views'); + const appRoot = settings.applicationRoot; + const viewRoot = config.viewRoot || pathUtil.join(appRoot, 'views'); installDefaultEngine(container, { env, config }); setupViews(container, { env, viewRoot }); }; diff --git a/packages/avada/lib/index.js b/packages/avada/lib/index.js index 429f4e3..eaf71e7 100644 --- a/packages/avada/lib/index.js +++ b/packages/avada/lib/index.js @@ -8,6 +8,7 @@ const Components = [ module.exports = function(config) { + config = normalizeConfig(config); const app = new Koa(); let started = false; let stopped = false; @@ -24,7 +25,7 @@ module.exports = function(config) { app.start = async(opts = {}) => { if (started) { debug('already started, ignore'); - return; + return null; } debug('app.start'); @@ -87,3 +88,11 @@ function makeArray(list) { return (list === undefined || list === null) ? [] : Array.isArray(list) ? list : [list]; } + +function normalizeConfig(config) { + return { + env: process.env.NODE_ENV || 'development', + applicationRoot: process.cwd(), + ...config + }; +} diff --git a/packages/avada/lib/utils/module.js b/packages/avada/lib/utils/module.js index 93ffb27..de5396c 100644 --- a/packages/avada/lib/utils/module.js +++ b/packages/avada/lib/utils/module.js @@ -1,3 +1,5 @@ +const fs = require('fs'); + function tryLoadModule(path) { if (checkModule(path)) { return loadModule(path); @@ -6,6 +8,10 @@ function tryLoadModule(path) { } function checkModule(path) { + if (fs.existsSync(path)) { + return false; + } + try { require.resolve(path); return true; diff --git a/packages/avada/lib/utils/scanAppModules.js b/packages/avada/lib/utils/scanAppModules.js index 17802d8..bac78af 100644 --- a/packages/avada/lib/utils/scanAppModules.js +++ b/packages/avada/lib/utils/scanAppModules.js @@ -2,6 +2,9 @@ const fs = require('fs'); const pathUtil = require('path'); module.exports = function scanAppModules(dir) { + if (!fs.existsSync(dir)) { + return []; + } const list = fs.readdirSync(dir); return list.filter(name => isAppModule(name, dir)); }; diff --git a/packages/avada/package.json b/packages/avada/package.json index bd21a4b..727189c 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.5", + "version": "1.5.0-beta.6", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From f1845ece7a5a87e7a5476fdadba126c3a1ebdc4f Mon Sep 17 00:00:00 2001 From: bencode Date: Fri, 2 Jul 2021 18:24:10 +0800 Subject: [PATCH 15/22] feat: add verify component --- packages/avada/lib/components/verify/index.js | 12 ++++++++++++ packages/avada/lib/index.js | 4 +++- packages/avada/package.json | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 packages/avada/lib/components/verify/index.js diff --git a/packages/avada/lib/components/verify/index.js b/packages/avada/lib/components/verify/index.js new file mode 100644 index 0000000..d6ec5d2 --- /dev/null +++ b/packages/avada/lib/components/verify/index.js @@ -0,0 +1,12 @@ +const chalk = require('chalk'); + +module.exports = function VerifyComponent(app) { + const { routes } = app.Router; + for (const route of routes) { + const { rule } = route; + if (!app.Controller.has(rule.module, rule.action)) { + global.console.error(chalk.red(`action not exists: ${rule.module}#${rule.action}`)); + global.console.error('route detail %o', route); + } + } +}; diff --git a/packages/avada/lib/index.js b/packages/avada/lib/index.js index eaf71e7..969cbfe 100644 --- a/packages/avada/lib/index.js +++ b/packages/avada/lib/index.js @@ -3,7 +3,9 @@ const debug = require('debug')('avada:boot'); const Components = [ - 'core', 'web', 'router', 'controller', 'service', 'view' + 'core', 'web', + 'router', 'controller', 'service', 'view', + 'verify' ]; diff --git a/packages/avada/package.json b/packages/avada/package.json index 727189c..5a2778a 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -11,6 +11,7 @@ "dependencies": { "@koa/cors": "^3.1.0", "assert": "^2.0.0", + "chalk": "^4.1.1", "co-busboy": "^1.4.1", "debug": "^4.3.1", "ejs": "^3.1.5", From 253de1188018d5c574d3672e468e35151f5aaba5 Mon Sep 17 00:00:00 2001 From: bencode Date: Fri, 2 Jul 2021 18:27:41 +0800 Subject: [PATCH 16/22] bump version --- packages/avada/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avada/package.json b/packages/avada/package.json index 5a2778a..5681686 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.6", + "version": "1.5.0-beta.7", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From fee5181d3e640e4ab2cf08d3f3ff47dd2fefb0a4 Mon Sep 17 00:00:00 2001 From: bencode Date: Fri, 2 Jul 2021 18:39:07 +0800 Subject: [PATCH 17/22] fix router check file --- packages/avada/lib/components/router/index.js | 2 +- packages/avada/lib/utils/module.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/avada/lib/components/router/index.js b/packages/avada/lib/components/router/index.js index 233cb64..49c4c12 100644 --- a/packages/avada/lib/components/router/index.js +++ b/packages/avada/lib/components/router/index.js @@ -14,7 +14,7 @@ module.exports = function RouterComponent(app, settings) { const config = settings.router || {}; const configRoot = config.configPath || pathUtil.join(appRoot, 'router'); - const fn = tryLoadModule(configRoot); + const fn = tryLoadModule(configRoot, { checkExists: false }); if (typeof fn === 'function') { const { middlewares, routes } = parse(fn); setupMiddlewares(app, middlewares); diff --git a/packages/avada/lib/utils/module.js b/packages/avada/lib/utils/module.js index de5396c..abac788 100644 --- a/packages/avada/lib/utils/module.js +++ b/packages/avada/lib/utils/module.js @@ -1,17 +1,16 @@ const fs = require('fs'); -function tryLoadModule(path) { - if (checkModule(path)) { +function tryLoadModule(path, opts = { checkExists: true }) { + if (checkModule(path, opts.checkExists)) { return loadModule(path); } return null; } -function checkModule(path) { - if (fs.existsSync(path)) { +function checkModule(path, checkExists) { + if (checkExists && !fs.existsSync(path)) { return false; } - try { require.resolve(path); return true; From b42a8f9f2810c2a9901786f2a6234aa5717795b1 Mon Sep 17 00:00:00 2001 From: bencode Date: Fri, 2 Jul 2021 18:40:14 +0800 Subject: [PATCH 18/22] bump version --- packages/avada/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avada/package.json b/packages/avada/package.json index 5681686..efb28d1 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.7", + "version": "1.5.0-beta.8", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From 19db621f6fecf1adc626458bc31d12e014bbbb21 Mon Sep 17 00:00:00 2001 From: bencode Date: Mon, 5 Jul 2021 15:24:22 +0800 Subject: [PATCH 19/22] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8Dweb=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6app.keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/avada/lib/components/router/Router.js | 1 + packages/avada/lib/components/web/index.js | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/avada/lib/components/router/Router.js b/packages/avada/lib/components/router/Router.js index 5e8965e..aa8e0e4 100644 --- a/packages/avada/lib/components/router/Router.js +++ b/packages/avada/lib/components/router/Router.js @@ -46,6 +46,7 @@ module.exports = class Router { * - query {Object} */ route(path, request) { + debug('try route %s', path); if (this.routes.length === 0) { return null; } diff --git a/packages/avada/lib/components/web/index.js b/packages/avada/lib/components/web/index.js index 1cb4b02..f4a3b35 100644 --- a/packages/avada/lib/components/web/index.js +++ b/packages/avada/lib/components/web/index.js @@ -1,12 +1,11 @@ +const uuid = require('uuid/v4'); const debug = require('debug')('avada:web'); const util = require('./util'); module.exports = function WebComponent(app, settings) { const config = settings.web || {}; - if (config.keys) { - initKeys(app, config.keys); - } + initKeys(app, config.keys); require('./params')(app); @@ -21,6 +20,10 @@ module.exports = function WebComponent(app, settings) { // private function initKeys(app, keys) { + if (!keys) { + keys = uuid(); + global.console.warn('app.keys missing, auto gen: %s', keys); + } keys = typeof keys === 'string' ? [keys] : keys; app.keys = keys; } From 58869b1121942d0412773d78a18b72611a495b8c Mon Sep 17 00:00:00 2001 From: bencode Date: Mon, 5 Jul 2021 15:26:06 +0800 Subject: [PATCH 20/22] bump version --- packages/avada/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/avada/package.json b/packages/avada/package.json index efb28d1..4d75d14 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.8", + "version": "1.5.0-beta.9", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { From 7d895c1330e77d7e688256009dd46e24d90f9249 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 7 Jul 2021 14:50:57 +0800 Subject: [PATCH 21/22] bump version --- packages/avada/lib/components/web/index.js | 2 +- packages/avada/package.json | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/avada/lib/components/web/index.js b/packages/avada/lib/components/web/index.js index f4a3b35..6e181fd 100644 --- a/packages/avada/lib/components/web/index.js +++ b/packages/avada/lib/components/web/index.js @@ -1,4 +1,4 @@ -const uuid = require('uuid/v4'); +const { v4: uuid } = require('uuid'); const debug = require('debug')('avada:web'); const util = require('./util'); diff --git a/packages/avada/package.json b/packages/avada/package.json index 4d75d14..3fb8da1 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.9", + "version": "1.5.0-beta.10", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": { @@ -29,7 +29,8 @@ "minimatch": "^3.0.4", "mz": "^2.7.0", "path-to-regexp": "^6.2.0", - "ramda": "^0.27.1" + "ramda": "^0.27.1", + "uuid": "^8.3.2" }, "devDependencies": { "eslint": "^7.14.0", From b63d309921d5ba8ed74ab1658f05f766fffa33c6 Mon Sep 17 00:00:00 2001 From: bencode Date: Wed, 15 Sep 2021 17:38:07 +0800 Subject: [PATCH 22/22] feat: add Container to app --- packages/avada/lib/components/container/index.js | 4 ++++ packages/avada/lib/index.js | 2 +- packages/avada/package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 packages/avada/lib/components/container/index.js diff --git a/packages/avada/lib/components/container/index.js b/packages/avada/lib/components/container/index.js new file mode 100644 index 0000000..a104e7d --- /dev/null +++ b/packages/avada/lib/components/container/index.js @@ -0,0 +1,4 @@ +module.exports = function ControllerComponent(app) { + app.Container = new Map(); +}; + diff --git a/packages/avada/lib/index.js b/packages/avada/lib/index.js index 969cbfe..c66d9cf 100644 --- a/packages/avada/lib/index.js +++ b/packages/avada/lib/index.js @@ -3,7 +3,7 @@ const debug = require('debug')('avada:boot'); const Components = [ - 'core', 'web', + 'core', 'web', 'container', 'router', 'controller', 'service', 'view', 'verify' ]; diff --git a/packages/avada/package.json b/packages/avada/package.json index 3fb8da1..cae3eb2 100644 --- a/packages/avada/package.json +++ b/packages/avada/package.json @@ -1,6 +1,6 @@ { "name": "avada", - "version": "1.5.0-beta.10", + "version": "1.5.0-beta.11", "description": "A nodejs web framework basedon koa.", "main": "lib/index.js", "scripts": {