{"_id":"@aklry/koana","_rev":"25-85120ec12180077db1637f32be420a89","name":"@aklry/koana","dist-tags":{"latest":"1.0.16"},"versions":{"1.0.11":{"name":"@aklry/koana","version":"1.0.11","keywords":["全栈","typescript","koa","vue","express","webpack"],"author":{"name":"aklry"},"license":"ISC","_id":"@aklry/koana@1.0.11","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"dist":{"shasum":"10a6e605f5a96a69191b32f921eb1a8d9fea1175","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.11.tgz","fileCount":6,"integrity":"sha512-YgMChWXpsa05VZLQNepAskARyU4zvapGvCpv0He+9cPqzHwajr/clAh72DYPVzHAQXVzNbg8EMSji7Ut8fyzqw==","signatures":[{"sig":"MEQCIHKIBBtVpeTOwZCkYaRtSspzjhmOV6TkkCiE5OSX6STqAiBTYRNQM9NQG+6bOGR/ERKH/JG0orpikiz9iI634wOWtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22256},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"commitizen":{"path":"cz-vinyl"}},"module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"gitHead":"6df94f10cae8fbd89b345b7f5cce74f8c61f4ef5","scripts":{"in":"pnpm install -r","build":"node scripts/build.js","clear":"rimraf --glob **/node_modules/** **/dist/**","commit":"cz","format":"prettier --write .","prepare":"husky","release":"node scripts/release.js","lint:fix":"eslint --fix .","ci:eslint":"eslint -f json src -o ./.ci/eslint.json","build:main":"node scripts/build-main.js","build:meta":"tsup","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","publish:all":"node scripts/publish.js","build:main:dev":"node scripts/build-main.js --dev","build:meta:dev":"tsup --watch","prepublishOnly":"npm run build:main","validate:build":"node scripts/build-main.js --validate","build:main:clean":"node scripts/build-main.js --clean","lint:lint-staged":"lint-staged"},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","workspaces":["koana-core","client","engineering","server","types","shared"],"_npmVersion":"10.8.2","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","directories":{},"lint-staged":{"*.{css,less}":["pnpm lint:style"],"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"]},"_nodeVersion":"20.19.3","dependencies":{"@aklry/koana-core":"^1.0.1","@aklry/koana-types":"^1.0.1","@aklry/koana-shared":"^1.0.1","@aklry/koana-engineering":"^1.0.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0","devDependencies":{"tsup":"^8.5.0","husky":"^9.1.7","eslint":"^9.26.0","nodemon":"^3.1.10","cz-vinyl":"^2.5.4","inquirer":"8.0.0","prettier":"^3.5.3","cross-env":"^7.0.3","stylelint":"^16.19.1","@types/md5":"^2.3.5","commitizen":"^4.3.1","@types/node":"^22.15.3","lint-staged":"^15.5.1","concurrently":"^9.1.2","@types/lodash":"^4.17.16","@commitlint/cli":"^19.8.0","eslint-config-ali":"^16.2.0","stylelint-prettier":"^5.0.3","prettier-config-ali":"^1.3.4","stylelint-config-ali":"^2.1.2","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","@commitlint/config-conventional":"^19.8.0"},"peerDependencies":{"ajv":"^8.17.1","md5":"^2.3.0","vue":"^3.5.17","glob":"^11.0.2","axios":"^1.10.0","pinia":"^3.0.3","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.30.1","ts-node":"^10.9.2","koa2-cors":"^2.0.6","koa-static":"^5.0.0","superagent":"^10.2.1","typescript":"^5.8.3","vue-router":"^4.5.1","element-plus":"^2.10.3","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","@element-plus/icons-vue":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/koana_1.0.11_1755660407040_0.33347016134130913","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@aklry/koana","version":"1.0.12","keywords":["全栈","typescript","koa","vue","express","webpack"],"author":{"name":"aklry"},"license":"ISC","_id":"@aklry/koana@1.0.12","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"dist":{"shasum":"1cebdce1db84a8c2a3eaf8cb1e5864e168d90c07","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.12.tgz","fileCount":6,"integrity":"sha512-SN3BaJy5bmpcd7ZhJciFGIEg02Hj8whruJy9bdYyYAwjDAaLz9ywtS89gi+w8DUrHmMRoBgHr6l4NsPimhooWA==","signatures":[{"sig":"MEUCICF3xAgV7njlecEFLqoOGaP+kjrMswcz1ZL7UnM3pKY+AiEA+A+sBEgzwpm+46lvQem373XIAtZ8U2orH42isXScDj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22256},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"commitizen":{"path":"cz-vinyl"}},"module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"gitHead":"6df94f10cae8fbd89b345b7f5cce74f8c61f4ef5","scripts":{"in":"pnpm install -r","build":"node scripts/build.js","clear":"rimraf --glob **/node_modules/** **/dist/**","commit":"cz","format":"prettier --write .","prepare":"husky","release":"node scripts/release.js","lint:fix":"eslint --fix .","ci:eslint":"eslint -f json src -o ./.ci/eslint.json","build:main":"node scripts/build-main.js","build:meta":"tsup","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","publish:all":"node scripts/publish.js","build:main:dev":"node scripts/build-main.js --dev","build:meta:dev":"tsup --watch","prepublishOnly":"npm run build:main","validate:build":"node scripts/build-main.js --validate","build:main:clean":"node scripts/build-main.js --clean","lint:lint-staged":"lint-staged"},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","workspaces":["koana-core","client","engineering","server","types","shared"],"_npmVersion":"10.8.2","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","directories":{},"lint-staged":{"*.{css,less}":["pnpm lint:style"],"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"]},"_nodeVersion":"20.19.3","dependencies":{"@aklry/koana-core":"^1.0.2","@aklry/koana-types":"^1.0.2","@aklry/koana-shared":"^1.0.2","@aklry/koana-engineering":"^1.0.2"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0","devDependencies":{"tsup":"^8.5.0","husky":"^9.1.7","eslint":"^9.26.0","nodemon":"^3.1.10","cz-vinyl":"^2.5.4","inquirer":"8.0.0","prettier":"^3.5.3","cross-env":"^7.0.3","stylelint":"^16.19.1","@types/md5":"^2.3.5","commitizen":"^4.3.1","@types/node":"^22.15.3","lint-staged":"^15.5.1","concurrently":"^9.1.2","@types/lodash":"^4.17.16","@commitlint/cli":"^19.8.0","eslint-config-ali":"^16.2.0","stylelint-prettier":"^5.0.3","prettier-config-ali":"^1.3.4","stylelint-config-ali":"^2.1.2","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","@commitlint/config-conventional":"^19.8.0"},"peerDependencies":{"ajv":"^8.17.1","md5":"^2.3.0","vue":"^3.5.17","glob":"^11.0.2","axios":"^1.10.0","pinia":"^3.0.3","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.30.1","ts-node":"^10.9.2","koa2-cors":"^2.0.6","koa-static":"^5.0.0","superagent":"^10.2.1","typescript":"^5.8.3","vue-router":"^4.5.1","element-plus":"^2.10.3","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","@element-plus/icons-vue":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/koana_1.0.12_1755660962784_0.8166661426125232","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"@aklry/koana","version":"1.0.13","keywords":["全栈","typescript","koa","vue","express","webpack"],"author":{"name":"aklry"},"license":"ISC","_id":"@aklry/koana@1.0.13","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"dist":{"shasum":"94ccffbea3507382f29a2c2c9e9786518c806e9c","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.13.tgz","fileCount":6,"integrity":"sha512-5tJMekc/mGPLW1n5I6Mhrlx8TEIplmc8lG1A/VWWDwWd3jvhh36i+cE9EaXP0bpLXuyw2TIiBf2Yo3c4W4vZDg==","signatures":[{"sig":"MEQCIAV62Uv8c7wv3nUylGMYZOtxRCbLa3O0WN2Q/YeE62afAiA8L13DYg1u5WofPkYSq4a4Rb1FbDxiVNhfTjLl/UEEWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21737},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"commitizen":{"path":"cz-vinyl"}},"module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"gitHead":"5527272579915d3a1d295098df7f8b4f63a378b2","scripts":{"in":"pnpm install -r","build":"node scripts/build.cjs","clear":"rimraf --glob **/node_modules/** **/dist/**","commit":"cz","format":"prettier --write .","prepare":"husky","release":"node scripts/release.cjs","lint:fix":"eslint --fix .","ci:eslint":"eslint -f json src -o ./.ci/eslint.json","build:main":"node scripts/build-main.cjs","build:meta":"tsup","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","publish:all":"node scripts/publish.cjs","build:meta:dev":"tsup --watch","prepublishOnly":"npm run build:main","validate:build":"node scripts/build-main.cjs --validate","lint:lint-staged":"lint-staged"},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","workspaces":["koana-core","client","engineering","server","types","shared"],"_npmVersion":"10.8.2","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","directories":{},"lint-staged":{"*.{css,less}":["pnpm lint:style"],"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"]},"_nodeVersion":"20.19.3","dependencies":{"@aklry/koana-core":"^1.0.3","@aklry/koana-types":"^1.0.2","@aklry/koana-shared":"^1.0.2","@aklry/koana-engineering":"^1.0.2"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0","devDependencies":{"tsup":"^8.5.0","husky":"^9.1.7","eslint":"^9.26.0","nodemon":"^3.1.10","cz-vinyl":"^2.5.4","inquirer":"8.0.0","prettier":"^3.5.3","cross-env":"^7.0.3","stylelint":"^16.19.1","@types/md5":"^2.3.5","commitizen":"^4.3.1","@types/node":"^22.15.3","lint-staged":"^15.5.1","concurrently":"^9.1.2","@types/lodash":"^4.17.16","@commitlint/cli":"^19.8.0","eslint-config-ali":"^16.2.0","stylelint-prettier":"^5.0.3","prettier-config-ali":"^1.3.4","stylelint-config-ali":"^2.1.2","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","@commitlint/config-conventional":"^19.8.0"},"peerDependencies":{"ajv":"^8.17.1","md5":"^2.3.0","vue":"^3.5.17","glob":"^11.0.2","axios":"^1.10.0","pinia":"^3.0.3","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.30.1","ts-node":"^10.9.2","koa2-cors":"^2.0.6","koa-static":"^5.0.0","superagent":"^10.2.1","typescript":"^5.8.3","vue-router":"^4.5.1","element-plus":"^2.10.3","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","@element-plus/icons-vue":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/koana_1.0.13_1755679040543_0.4539554125513814","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"@aklry/koana","version":"1.0.14","keywords":["全栈","typescript","koa","vue","express","webpack"],"author":{"name":"aklry"},"license":"ISC","_id":"@aklry/koana@1.0.14","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"dist":{"shasum":"813a454742a505e404333a1f67f90ea38788b106","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.14.tgz","fileCount":6,"integrity":"sha512-1/naDsiUoJH5CML8tMhcygamx4oNhnceuAvW+aihqnOeIm+pJ1QkU/n0HN02ghltZiXOtvo26NPvCaE+CRe8IA==","signatures":[{"sig":"MEUCIBmz4tRLazbC7HTKEUygWfx9pJRXipzJnzmW4hRW+DkxAiEAgYXOnOq3SYLwx+LSfsZ6yA8wBO965fb5Big5+Gd/zN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21737},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"commitizen":{"path":"cz-vinyl"}},"module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"gitHead":"5527272579915d3a1d295098df7f8b4f63a378b2","scripts":{"in":"pnpm install -r","build":"node scripts/build.cjs","clear":"rimraf --glob **/node_modules/** **/dist/**","commit":"cz","format":"prettier --write .","prepare":"husky","release":"node scripts/release.cjs","lint:fix":"eslint --fix .","ci:eslint":"eslint -f json src -o ./.ci/eslint.json","build:main":"node scripts/build-main.cjs","build:meta":"tsup","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","publish:all":"node scripts/publish.cjs","build:meta:dev":"tsup --watch","prepublishOnly":"npm run build:main","validate:build":"node scripts/build-main.cjs --validate","lint:lint-staged":"lint-staged"},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","workspaces":["koana-core","client","engineering","server","types","shared"],"_npmVersion":"10.8.2","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","directories":{},"lint-staged":{"*.{css,less}":["pnpm lint:style"],"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"]},"_nodeVersion":"20.19.3","dependencies":{"@aklry/koana-core":"^1.0.3","@aklry/koana-types":"^1.0.2","@aklry/koana-shared":"^1.0.2","@aklry/koana-engineering":"^1.0.3"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0","devDependencies":{"tsup":"^8.5.0","husky":"^9.1.7","eslint":"^9.26.0","nodemon":"^3.1.10","cz-vinyl":"^2.5.4","inquirer":"8.0.0","prettier":"^3.5.3","cross-env":"^7.0.3","stylelint":"^16.19.1","@types/md5":"^2.3.5","commitizen":"^4.3.1","@types/node":"^22.15.3","lint-staged":"^15.5.1","concurrently":"^9.1.2","@types/lodash":"^4.17.16","@commitlint/cli":"^19.8.0","eslint-config-ali":"^16.2.0","stylelint-prettier":"^5.0.3","prettier-config-ali":"^1.3.4","stylelint-config-ali":"^2.1.2","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","@commitlint/config-conventional":"^19.8.0"},"peerDependencies":{"ajv":"^8.17.1","md5":"^2.3.0","vue":"^3.5.17","glob":"^11.0.2","axios":"^1.10.0","pinia":"^3.0.3","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.30.1","ts-node":"^10.9.2","koa2-cors":"^2.0.6","koa-static":"^5.0.0","superagent":"^10.2.1","typescript":"^5.8.3","vue-router":"^4.5.1","element-plus":"^2.10.3","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","@element-plus/icons-vue":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/koana_1.0.14_1755679839643_0.6016251127357719","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"@aklry/koana","version":"1.0.15","keywords":["全栈","typescript","koa","vue","express","webpack"],"author":{"name":"aklry"},"license":"ISC","_id":"@aklry/koana@1.0.15","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"dist":{"shasum":"426bb7de9e2feb511a5246a1ee1be81635e98fc6","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.15.tgz","fileCount":6,"integrity":"sha512-C4YSeUfecUijMaR1pOSg9VqqiUVqjIq782RhNGRcUQmxhcvLhPKz6qI7hWGdIR2A7bYGCQf3er3TCBVOvadcaA==","signatures":[{"sig":"MEQCIEf0V8NcFEf8UUdcZhyenZIudnP5h4chVf4EaGJjrslOAiBxWbxNLbst4QeYhiaEuXU3QbFY3sRAOJ13QDkJC9SxZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21737},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"commitizen":{"path":"cz-vinyl"}},"module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"gitHead":"5527272579915d3a1d295098df7f8b4f63a378b2","scripts":{"in":"pnpm install -r","build":"node scripts/build.cjs","clear":"rimraf --glob **/node_modules/** **/dist/**","commit":"cz","format":"prettier --write .","prepare":"husky","release":"node scripts/release.cjs","lint:fix":"eslint --fix .","ci:eslint":"eslint -f json src -o ./.ci/eslint.json","build:main":"node scripts/build-main.cjs","build:meta":"tsup","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","publish:all":"node scripts/publish.cjs","build:meta:dev":"tsup --watch","prepublishOnly":"npm run build:main","validate:build":"node scripts/build-main.cjs --validate","lint:lint-staged":"lint-staged"},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","workspaces":["koana-core","client","engineering","server","types","shared"],"_npmVersion":"10.8.2","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","directories":{},"lint-staged":{"*.{css,less}":["pnpm lint:style"],"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"]},"_nodeVersion":"20.19.3","dependencies":{"@aklry/koana-core":"^1.0.3","@aklry/koana-types":"^1.0.2","@aklry/koana-shared":"^1.0.2","@aklry/koana-engineering":"^1.0.4"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0","devDependencies":{"tsup":"^8.5.0","husky":"^9.1.7","eslint":"^9.26.0","nodemon":"^3.1.10","cz-vinyl":"^2.5.4","inquirer":"8.0.0","prettier":"^3.5.3","cross-env":"^7.0.3","stylelint":"^16.19.1","@types/md5":"^2.3.5","commitizen":"^4.3.1","@types/node":"^22.15.3","lint-staged":"^15.5.1","concurrently":"^9.1.2","@types/lodash":"^4.17.16","@commitlint/cli":"^19.8.0","eslint-config-ali":"^16.2.0","stylelint-prettier":"^5.0.3","prettier-config-ali":"^1.3.4","stylelint-config-ali":"^2.1.2","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","@commitlint/config-conventional":"^19.8.0"},"peerDependencies":{"ajv":"^8.17.1","md5":"^2.3.0","vue":"^3.5.17","glob":"^11.0.2","axios":"^1.10.0","pinia":"^3.0.3","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.30.1","ts-node":"^10.9.2","koa2-cors":"^2.0.6","koa-static":"^5.0.0","superagent":"^10.2.1","typescript":"^5.8.3","vue-router":"^4.5.1","element-plus":"^2.10.3","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","@element-plus/icons-vue":"^2.3.1"},"_npmOperationalInternal":{"tmp":"tmp/koana_1.0.15_1755680583244_0.6495117624284978","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"@aklry/koana","version":"1.0.16","description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","keywords":["全栈","typescript","koa","vue","express","webpack"],"license":"ISC","author":{"name":"aklry"},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"import":"./types/index.d.ts","require":"./types/index.d.ts"}},"scripts":{"ci:eslint":"eslint -f json src -o ./.ci/eslint.json","lint:fix":"eslint --fix .","lint:style":"stylelint \"**/*.{css,less,scss}\" --fix","format":"prettier --write .","in":"pnpm install -r","commit":"cz","prepare":"husky","lint:lint-staged":"lint-staged","clear":"rimraf --glob **/node_modules/** **/dist/**","clear:dist":"rimraf **/dist/**","build":"node scripts/build.cjs","build:main":"node scripts/build-main.cjs","build:meta":"tsup","build:meta:dev":"tsup --watch","validate:build":"node scripts/build-main.cjs --validate","prepublishOnly":"npm run build:main","release":"node scripts/release.cjs","publish:all":"node scripts/publish.cjs"},"prettier":"prettier-config-ali","stylelint":{"extends":["stylelint-config-ali","stylelint-prettier/recommended"]},"devDependencies":{"@commitlint/cli":"^19.8.0","@commitlint/config-conventional":"^19.8.0","@types/lodash":"^4.17.16","@types/md5":"^2.3.5","@types/node":"^22.15.3","commitizen":"^4.3.1","concurrently":"^9.1.2","cross-env":"^7.0.3","cz-vinyl":"^2.5.4","eslint":"^9.26.0","eslint-config-ali":"^16.2.0","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","husky":"^9.1.7","inquirer":"8.0.0","lint-staged":"^15.5.1","nodemon":"^3.1.10","prettier":"^3.5.3","prettier-config-ali":"^1.3.4","stylelint":"^16.19.1","stylelint-config-ali":"^2.1.2","stylelint-prettier":"^5.0.3","tsup":"^8.5.0"},"packageManager":"pnpm@10.7.0","workspaces":["koana-core","client","engineering","server","types","shared"],"config":{"commitizen":{"path":"cz-vinyl"}},"lint-staged":{"*.{ts,vue,js}":["pnpm lint:fix","pnpm format"],"*.{css,less}":["pnpm lint:style"]},"dependencies":{"@aklry/koana-core":"^1.0.4","@aklry/koana-engineering":"^1.0.5","@aklry/koana-shared":"^1.0.3","@aklry/koana-types":"^1.0.3"},"peerDependencies":{"@element-plus/icons-vue":"^2.3.1","ajv":"^8.17.1","axios":"^1.10.0","element-plus":"^2.10.3","moment":"^2.30.1","pinia":"^3.0.3","ts-node":"^10.9.2","typescript":"^5.8.3","vue":"^3.5.17","vue-router":"^4.5.1","glob":"^11.0.2","koa-bodyparser":"^4.4.1","koa-nunjucks-2":"^3.0.2","koa-static":"^5.0.0","koa2-cors":"^2.0.6","lodash":"^4.17.21","log4js":"^6.9.1","md5":"^2.3.0","superagent":"^10.2.1"},"_id":"@aklry/koana@1.0.16","gitHead":"cb3e8505c82b6702ceff45473841b8e8cda145ee","_nodeVersion":"20.19.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-qfP0809vX7259dwfFOwlQgn9C3udbUH16pTa66lc0ohj0TOXiC1tgtMytltsB9iujBDP3EzSWqtaxhcvhUv1DA==","shasum":"0f336c257cb1a055c7f4798557be84f9d7885e2f","tarball":"https://registry.npmjs.org/@aklry/koana/-/koana-1.0.16.tgz","fileCount":6,"unpackedSize":21776,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDtgElWa4JLl3dHKEPDzIvfhIVtVzw73I3q4IWszhw2kgIhALbQ/41IhBJq1KyT8tevcPuVrvWERzZwsDUVwavFoA6W"}]},"_npmUser":{"name":"aklry","email":"l19854454128@gmail.com"},"directories":{},"maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/koana_1.0.16_1755692709439_0.5084470083102386"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-20T03:26:46.872Z","modified":"2025-08-20T12:25:10.194Z","1.0.0":"2025-07-09T01:44:23.501Z","1.0.1":"2025-07-09T02:24:35.060Z","1.0.2":"2025-07-09T03:51:40.440Z","1.0.3":"2025-07-09T05:39:59.978Z","1.0.4":"2025-07-09T05:42:30.469Z","1.0.5":"2025-07-09T05:47:02.244Z","1.0.6":"2025-07-09T05:50:35.273Z","1.0.7":"2025-07-09T06:09:43.497Z","1.0.8":"2025-07-09T06:52:52.525Z","1.0.9":"2025-07-09T07:10:50.440Z","1.0.10":"2025-07-14T03:10:54.897Z","1.0.11":"2025-08-20T03:26:47.245Z","1.0.12":"2025-08-20T03:36:02.970Z","1.0.13":"2025-08-20T08:37:20.698Z","1.0.14":"2025-08-20T08:50:39.844Z","1.0.15":"2025-08-20T09:03:03.421Z","1.0.16":"2025-08-20T12:25:09.696Z"},"author":{"name":"aklry"},"license":"ISC","keywords":["全栈","typescript","koa","vue","express","webpack"],"description":"一个全栈中后台框架,使用vue+typescript+koa+webpack+express实现","maintainers":[{"name":"aklry","email":"l19854454128@gmail.com"}],"readme":"# @aklry/koana\n\n一个全栈中后台框架，使用 Vue + TypeScript + Koa + Webpack + Express 实现。\n\n## 📦 包结构\n\nKoana 是一个 monorepo 项目，包含以下子包：\n\n- `@aklry/koana-core` - 核心服务端框架\n- `@aklry/koana-engineering` - 前端工程化构建工具\n- `@aklry/koana-shared` - 共享工具库\n- `@aklry/koana-types` - TypeScript 类型定义\n\n## 🚀 快速开始\n\n### 安装\n\n```bash\nnpm install @aklry/koana\n# 或\npnpm install @aklry/koana\n# 或\nyarn add @aklry/koana\n```\n\n### 基本使用\n\n```typescript\nimport koana from '@aklry/koana';\n\n// 启动服务器\nconst app = await koana.serverStart({\n  homePage: '/',\n  // 其他配置...\n});\n\n// 前端构建\nkoana.frontedBuild('prod'); // 或 'dev'\n\n// 使用基类\nclass UserController extends koana.BaseController {\n  // 控制器逻辑\n}\n\nclass UserService extends koana.BaseService {\n  // 服务逻辑\n}\n```\n\n## 主要技术栈\n\n- Vue\n- Koa\n- Express\n- TypeScript\n- mocha\n- Webpack\n- Element Plus\n\n## 开发文档（模板配置）\n\n```javascript\nexport default {\n  // 模板类型,不同模板类型对应不一样的模板数据结构\n  mode: 'dashboard',\n  name: '', // 名称\n  desc: '', // 描述\n  icon: '', // 图标\n  homePage: '', //首页(项目配置)\n  // 头部菜单\n  menu: [\n    {\n      key: '', // 菜单唯一描述\n      name: '', // 菜单名称\n      menuType: '', // 枚举值, group / module\n      // 当menuType = group 时, 可填\n      subMenu: [\n        {\n          // 可以递归menuItem\n        },\n      ],\n      // 当menuType = module 时, 可填\n      moduleType: '', // 枚举值 schema/custom/iframe/sider\n      // 当moduleType = schema 时, 可填\n      schemaConfig: {\n        api: '', // 数据源api 遵循RESTful规范\n        // 板块数据结构\n        schema: {\n          type: 'object',\n          properties: {\n            key: {\n              ...schema, // 标准schema 配置\n              type: '', // 字段类型\n              label: '', // 字段中文名\n              // 字段在table中的相关配置\n              tableOption: {\n                ...elTableColumnConfig, //标准el-table-column 配置\n                visible: true, // 默认为true(false 表示不在表单显示)\n                toFixed: 2, // 保留小数点后几位\n              },\n              // 字段在search-bar中的相关配置\n              searchOption: {\n                ...elComponentConfig, //标准el-component(form 表单组件) 配置\n                comType: '', // 配置控件类型(input/select)\n                default: '', // 默认值\n                // 当comType = select 时, 可填\n                enumList: [],\n                // 当comType = dynamicSelect 时, 可填\n                api: '', // 枚举列表数据源api 遵循RESTful规范\n              },\n              // 字段在不同 component 中的相关配置, 前缀对应componentConfig的键\n              // 例如: componentConfig.createForm = createFormOption\n              // 字段在createForm中的相关配置\n              createFormOption: {\n                ...eleFormConfig, // 标准element-ui form配置\n                comType: '', // 配置控件类型(input/select)\n                visible: true, // 是否展示(true/false),默认为true\n                disabled: false, // 是否禁用(true/false),默认为false\n                default: '', // 默认值\n                // 当comType = select 时, 可填\n                enumList: [], // 枚举列表\n              },\n              // 字段在editForm中的相关配置\n              editFormOption: {\n                ...eleFormConfig, // 标准element-ui form配置\n                comType: '', // 配置控件类型(input/select)\n                visible: true, // 是否展示(true/false),默认为true\n                disabled: false, // 是否禁用(true/false),默认为false\n                default: '', // 默认值\n                // 当comType = select 时, 可填\n                enumList: [], // 枚举列表\n              },\n              detailPanelOption: {\n                ...eleFormConfig, // 标准element-ui form配置\n                disabled: true, // 是否禁用(true/false),默认为true\n              },\n            },\n          },\n          required: [], // 标记哪些字段是必填的\n        },\n        // table相关配置\n        tableConfig: {\n          headerButtons: [\n            {\n              label: '', // 按钮中文名\n              eventKey: '', // 按钮事件名\n              // 按钮具体配置\n              eventOption: {\n                // 当eventKey === 'showComponent' 时\n                comName: '', // 组件名称\n              },\n              ...elButtonConfig, // 标准el-button配置\n            },\n          ],\n          rowButtons: [\n            {\n              label: '', // 按钮中文名\n              eventKey: '', // 按钮事件名\n              eventOption: {\n                // 当eventKey = remove 时, 可填\n                params: {\n                  // paramKey = 参数的键值\n                  // rowValueKey = 参数值 ,格式为 schema::xxx时，到table中找响应的字段\n                  paramKey: rowValueKey,\n                },\n                // 当eventKey === 'showComponent' 时\n                comName: '', // 组件名称\n              }, // 按钮事件具体配置\n              ...elButtonConfig, // 标准el-button配置\n            },\n          ],\n        },\n        searchConfig: {}, // search-bar相关配置\n        // 动态组件 相关配置\n        componentConfig: {\n          // create-form 相关配置\n          createForm: {\n            title: '', // 表单标题\n            saveBtnText: '', // 保存按钮文本\n          },\n          // edit-form 相关配置\n          editForm: {\n            mainKey: '', // 主键,用于唯一标识要修改的数据对象\n            title: '', // 表单标题\n            saveBtnText: '', // 保存按钮文本\n          },\n          // detail-panel 相关配置\n          detailPanel: {\n            mainKey: '', // 主键,用于唯一标识要修改的数据对象\n            title: '',\n          },\n          // 支持用户动态扩展\n        },\n      },\n      // 当moduleType = custom 时, 可填\n      customConfig: {\n        path: '', // 自定义路径\n      },\n      // 当moduleType = iframe 时, 可填\n      iframeConfig: {\n        path: '', // iframe路径\n      },\n      // 当moduleType = sider 时, 可填\n      siderConfig: {\n        menu: [\n          {\n            // 可递归 menuItem(除moduleType = sider)\n          },\n        ],\n      },\n    },\n  ],\n};\n```\n\n## sdk的使用\n\n### 安装\n\n```shell\nnpm i @aklry/elpis\n```\n\n### 服务端启动\n\n```js\nimport main from '@aklry/koana';\n\nmain.serverStart({\n  // 项目名称\n  name: 'demo',\n});\n```\n\n### 自定义服务端\n\n在server/目录下创建对应的目录\n\n- router-schema\n\n  - 表示接口的[jsonschema](https://json-schema.org/)规范\n\n  - ```js\n    import type { KoanaMainTypes } from '@aklry/koana/types';\n    const routerSchema:KoanaMainTypes.RouterSchema {\n        '/api/proj/list': {\n            get: {\n                query: {\n                    type: 'object',\n                    properties: {\n                        page: {\n                            type: 'string'\n                        },\n                        size: {\n                            type: 'string'\n                        }\n                    },\n                    required: ['page', 'size']\n                }\n            }\n        }\n    }\n    export default routerSchema\n    ```\n\n  -\n\n- router\n\n- controller\n\n- service\n\n遵循MVC规范，接口遵循**restful**规范\n\n### 前端构建\n\n#### 项目启动\n\n```js\nimport main from '@aklry/koana';\nmain.frontendBuild(process.env.NODE_ENV);\n```\n\n> 注：`process.env.NODE_ENV`表示环境变量，可取`dev`或`prod`，在执行`node`脚本时附带上\n\n#### 自定义webpack配置\n\n- 在`client/webpack.config.js`文件编写额外的配置\n\n#### 自定义页面扩展\n\n- 在`client/pages/**`目录下写入口`entry.xxx.js`\n\n- 在`client/pages/dashboard/**`目录下自定义页面\n\n- 在`client/pages/dashboard/complex-view/components`目录下写扩展组件\n\n  - 配置到`app/pages/dashboard/complex-view/components/component-config.js`\n\n- 在`client/pages/widgets/schema-form/complex-view`目录下写`schema-form`的扩展组件\n\n  - 配置到`client/pages/widgets/schema-form/form-item-config.js`\n\n  在`client/pages/widgets/schema-search-bar/complex-view`目录下写`schema-search-bar`的扩展组件\n\n  - 配置到`client/pages/widgets/schema-search-bar/schema-item-config.js`\n\n  ### TypeScript类型\n\n  ```typescript\n  import type Koa from 'koa';\n  import type { Context } from 'koa';\n  import type KoaRouter from 'koa-router';\n  import type log4js from 'log4js';\n  import type { DtoDSLModelTypes, HeaderMenu } from './extend';\n  /**\n   * 启动参数\n   */\n  export interface Options {\n    name: string;\n    homePage?: string;\n  }\n  /**\n   * 环境变量\n   */\n  export interface Env {\n    isLocal: () => boolean;\n    isProd: () => boolean;\n    isBeta: () => boolean;\n    get: () => string;\n  }\n  interface Property {\n    [key: string]: {\n      type: string;\n      description?: string;\n    };\n  }\n  type Required = Array<keyof Property>;\n  interface ObjectSchema {\n    type: 'object';\n    properties: Property;\n    required?: Required;\n    $schema?: string;\n  }\n\n  interface RequestSchema {\n    query?: ObjectSchema;\n    params?: ObjectSchema;\n    headers?: ObjectSchema;\n    body?: ObjectSchema;\n  }\n  /**\n   * router-schema对象的值类型\n   */\n  interface RouterSchemaValue {\n    get?: RequestSchema;\n    post?: RequestSchema;\n    put?: RequestSchema;\n    delete?: RequestSchema;\n    patch?: RequestSchema;\n    options?: RequestSchema;\n    head?: RequestSchema;\n  }\n  export type RouterSchemaKeys = keyof RouterSchemaValue;\n  /**\n   * RouterSchema的值类型\n   * @description 用于描述router-schema的数据结构\n   */\n  export interface RouterSchema {\n    [key: string]: RouterSchemaValue;\n  }\n  /**\n   * koa拓展实例对象\n   */\n  export interface App extends Koa<Koa.DefaultState, Koa.DefaultContext> {\n    options: Options;\n    baseDir: string;\n    businessDir: string;\n    clientDir: string;\n    koanaDir: string;\n    businessClientDir: string;\n    env: Env;\n    config: Record<string, any>;\n    service: Record<string, any>;\n    middlewares: Record<string, any>;\n    routerSchema: RouterSchema;\n    controller: Record<string, any>;\n    logger: log4js.Logger & Console;\n    [key: string]: any;\n  }\n  /**\n   * 路由实例\n   */\n  export interface Router extends KoaRouter {}\n  /**\n   * 中间件上下文类型\n   */\n  export interface MiddlewareContext extends Context {\n    request: Context['request'] & {\n      body: any;\n      headers: {\n        s_sign: string;\n        s_t: number;\n      };\n    };\n    params: {\n      page: string;\n      [key: string]: string;\n    };\n  }\n  /**\n   * 中间件的next函数类型\n   */\n  export interface Next extends Koa.Next {}\n  type Global = Window & typeof globalThis;\n  /**\n   * 全局类型扩展\n   * @description 用于在全局范围内添加额外的属性\n   */\n  export interface GlobalType extends Global {\n    projKey?: string;\n  }\n  /**\n   * ctx.headers的类型\n   */\n  export interface DtoHeaders {\n    s_t: number;\n    s_sign: string;\n    proj_key?: string;\n    [key: string]: any;\n  }\n  /**\n   * DSL模板类型\n   */\n  export interface DSLTypes {\n    // 模板类型,不同模板类型对应不一样的模板数据\n    mode?: string;\n    // 模型名称\n    name?: string;\n    // 模板数据\n    desc?: string;\n    // icon 图标\n    icon?: string;\n    // 首页配置\n    homePage?: string;\n    // 头部菜单\n    menu?: HeaderMenu[];\n  }\n  /**\n   * Dto模型数据\n   */\n  export interface DtoDSLModelTypes extends DSLTypes {\n    key: string;\n  }\n  /**\n   * 项目数据\n   */\n  export interface DSLProjectTypes extends DSLTypes {\n    key: string;\n    modelKey: string;\n  }\n  /**\n   * Dto项目数据\n   */\n  export interface DtoDSLProjectTypes {\n    [key: string]: DSLProjectTypes;\n  }\n\n  /**\n   * DSL模板结构化数据\n   */\n  export interface DtoDSLTypes {\n    model: DtoDSLModelTypes;\n    project: DtoDSLProjectTypes;\n  }\n\n  export interface IResponse<T = any> {\n    success: boolean;\n    data?: T;\n    metadata?: Record<string, any>;\n    message?: string;\n    code?: number;\n  }\n\n  export interface IMain {\n    serverStart: (options: Options) => Promise<App>;\n    frontedBuild: (env: string) => void;\n    BaseController: any;\n    BaseService: any;\n  }\n  ```\n\n  ```ts\n  /**\n   * DSL模板类型\n   */\n  export type MenuType = 'module' | 'group';\n  export type ModuleType = 'schema' | 'custom' | 'iframe' | 'sider';\n  export interface DSLIframeConfig {\n    path: string;\n  }\n  export interface DSLCustomConfig {\n    path: string;\n  }\n\n  export interface EnumListType {\n    label: string;\n    value: any;\n  }\n\n  export interface DSLSchemaProperties {\n    [key: string]: {\n      type: string;\n      label: string;\n      maxLength?: number;\n      minLength?: number;\n      required?: string[];\n      minimum?: number;\n      maximum?: number;\n      pattern?: string;\n      tableOption?: {\n        visible?: boolean;\n        [key: string]: any;\n      };\n      searchOption?: {\n        comType?: string;\n        api?: string;\n        visible?: boolean;\n        default?: any;\n        enumList?: EnumListType[];\n        [key: string]: any;\n      };\n      createFormOption?: {\n        comType?: string;\n        label?: string;\n        enumList?: EnumListType[];\n        default?: any;\n        [key: string]: any;\n      };\n      editFormOption?: {\n        comType?: string;\n        label?: string;\n        enumList?: EnumListType[];\n        default?: any;\n        [key: string]: any;\n      };\n      [key: string]: any;\n    };\n  }\n\n  export interface enumListType {\n    label: string;\n    value: string;\n  }\n  export interface DtoDSLSchemaPropertiesValue {\n    type?: string;\n    label?: string;\n    maxLength?: number;\n    minLength?: number;\n    required?: boolean;\n    minimum?: number;\n    maximum?: number;\n    pattern?: string;\n    option?: {\n      default?: string;\n      toFixed?: boolean;\n      visible?: boolean;\n      comType?: string;\n      enumList?: enumListType[];\n      api?: string;\n      [key: string]: any;\n    };\n    [key: string]: any;\n  }\n  export interface DtoDSLSchemaProperties {\n    [key: string]: DtoDSLSchemaPropertiesValue;\n  }\n  export interface DtoSchema {\n    type: 'object';\n    properties: DtoDSLSchemaProperties;\n  }\n  export interface DSLSchema {\n    type: string;\n    properties: DSLSchemaProperties;\n    required?: string[];\n  }\n\n  /**\n   * 表头按钮配置\n   */\n  export interface DSLButtons {\n    label: string;\n    eventKey: string;\n    eventOption: {\n      // 当eventKey为remove时，params为删除的数据\n      params?: {\n        // paramKey = 参数的键值\n        [key: string]: string;\n      };\n      // 组件名称\n      comName?: string;\n    };\n    params?: any;\n    [key: string]: any;\n  }\n  export interface DSLTableConfig {\n    headerButtons: DSLButtons[];\n    rowButtons: DSLButtons[];\n  }\n\n  export interface DSLSearchConfig {\n    [key: string]: any;\n  }\n\n  export interface DSLSchemaConfig {\n    // 遵循 RESTful API 规范\n    api: string;\n    schema: DSLSchema;\n    // 表单配置\n    tableConfig?: DSLTableConfig;\n    // search-bar配置\n    searchConfig?: DSLSearchConfig;\n    componentConfig?: {\n      title?: string;\n      saveBtnText?: string;\n      mainKey?: string;\n      [key: string]: any;\n    };\n  }\n\n  /**\n   * DSL component配置\n   */\n  export interface DtoDSLComponentConfig {\n    schema: DtoSchema;\n    config: DSLSchemaConfig['componentConfig'];\n  }\n\n  /**\n   * 头部菜单\n   */\n  export interface HeaderMenu {\n    key: string;\n    name: string;\n    menuType?: MenuType;\n    // 当menuType为group时\n    subMenu?: HeaderMenu[] | DSLSiderConfig[];\n    // 当menuType为module时\n    moduleType?: ModuleType;\n    // 当menuType为module且moduleType为schema时\n    schemaConfig?: DSLSchemaConfig;\n    // 当menuType为module且moduleType为custom时\n    customConfig?: DSLCustomConfig;\n    // 当menuType为module且moduleType为iframe时\n    iframeConfig?: DSLIframeConfig;\n    // 当menuType为module且moduleType为sider时\n    siderConfig?: {\n      menu: DSLSiderConfig[];\n    };\n    [key: string]: any;\n  }\n\n  export interface DSLSiderConfig extends HeaderMenu {\n    moduleType?: Exclude<ModuleType, 'sider'>;\n    [key: string]: any;\n  }\n  ```\n","readmeFilename":"README.md"}