This commit is contained in:
Titor 2021-02-10 03:40:48 +08:00
commit d3d1f3fd30
19 changed files with 2510 additions and 0 deletions

10
.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
node_modules
*.js
.idea
.vscode
.atom
.DS_Store
*.ini
*.log

127
bin/index.ts Normal file
View File

@ -0,0 +1,127 @@
#! node
import program from "inquirer";
import { file as fs } from "../extend/file";
import * as os from "os";
import ejs from "ejs";
import chalk from "chalk";
import { exec } from "child_process";
// ------------------------------------------------
// cli结果
let answers: { appName: string; pkgManager: number; author: string };
// 脚本运行目录
const path: string = process.cwd() + "/";
// 模版所在目录
const tpl: string = `${path}/template/`;
// ========================================================
// 1、CLI 交互
program
.prompt([
{
name: "appName",
message: chalk.cyan("🌈 App Name:"),
type: "input",
validate(input) {
if (input.trim().length <= 0 || !input) return chalk.red("‼️ 必填项");
else return true;
},
},
{
name: "pkgManager",
message: chalk.yellow("🥓 Package Manager:"),
type: "list",
choices: [
{ name: "Yarn", value: 0, checked: true },
{ name: "Npm", value: 1 },
],
},
{
name: "author",
message: chalk.green("🥤 Your Name:"),
type: "input",
default: os.userInfo().username,
},
])
.then(async answer => {
answers = answer;
// --------------------------------
// 调用2
await writing();
});
// ========================================================
// 2、读写操作
async function writing() {
console.log(chalk.blue("\r\n ---------------- WRITING... ----------------"));
// Static 文件
copyStatic([
[`controller/index.ts`, `controller/index.ts`],
[`extend/logger.ts`, `extend/logger.ts`],
[`extend/lucky.ts`, `extend/lucky.ts`],
[`route/route.ts`, `route/route.ts`],
[`view/index.njk`, `view/index.njk`],
[`tsconfig.json`, `tsconfig.json`],
[`Dockerfile`, `Dockerfile`],
[`yarn.lock`, `yarn.lock`],
[`app.ts`, `app.ts`],
]);
// template that uses the EJS engine
await copyTemplate([
[`docker-compose.yml`, `docker-compose.yml`],
[`package.json`, `package.json`],
[`LICENSE`, `LICENSE`],
]);
// --------------------------------
// 调用3
installed();
}
// ------------------------------------------------
// Copy Static 文件
function copyStatic(files: string[][]) {
files.forEach(file => {
fs.copy(`${tpl}${file[0]}`, `${path}${answers.appName}/${file[1]}`);
console.log(
chalk.green("+") +
` ${chalk.grey(answers.appName + "/" + file[1])} ${chalk.green(
"SUCCESS.👌"
)}`
);
});
}
// Copy template that uses the EJS engine
// 使用EJS解析模版并将解析后的内容存入新文件中
function copyTemplate(files: string[][]) {
files.forEach(async file => {
let compileContent = await ejs.renderFile(`${tpl}${file[0]}`, answers);
fs.write(`${path}${answers.appName}/${file[1]}`, compileContent);
console.log(
chalk.green("+") +
` ${chalk.grey(answers.appName + "/" + file[1])} ${chalk.green(
"SUCCESS.👌"
)}`
);
});
}
// ========================================================
// 3、依赖安装
function installed() {
console.log(
chalk.blue("\r\n ---------------- Installing... ----------------")
);
if (answers.pkgManager == 0) {
exec(`cd ${answers.appName} && yarn install`, err => {
console.log(chalk.green("SUCCESS.👌"));
});
} else {
exec(`cd ${answers.appName} && npm install`, err => {
console.log(chalk.green("SUCCESS.👌"));
});
}
}

23
extend/file.d.ts vendored Normal file
View File

@ -0,0 +1,23 @@
/**
*
* @description 便
*/
declare class file {
/**
*
* @description
* true
*
* @param {string} filePath
* @return {boolean}
*/
protected static createPath(filePath: string): boolean;
/**
*
* @param {string} src
* @param {string} dest
* @return {boolean}
*/
static copy(src: string, dest: string): boolean;
}
export { file };

60
extend/file.ts Normal file
View File

@ -0,0 +1,60 @@
import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
/**
*
* @description 便
*/
class file {
/**
*
* @description
* true
*
* @param {string} filePath
* @return {boolean}
*/
protected static createPath(filePath: string): boolean {
// 获取完整目录(去除最后一位的文件字段)
let dir = filePath.substring(0, filePath.lastIndexOf("/"));
if (dir == "" || dir == null) dir = "./"; // 不写目录名 => 根目录
// 文件夹不存在
if (!existsSync(dir)) {
let actionNotice = mkdirSync(dir, { recursive: true });
return !!actionNotice;
} else return true;
}
/**
*
* @param {string} src
* @param {string} dest
* @return {boolean}
*/
static copy(src: string, dest: string): boolean {
if (!existsSync(src)) {
console.log("源文件不存在");
return false;
}
// 复制操作
if (file.createPath(dest)) {
copyFileSync(src, dest);
return existsSync(dest);
} else return false;
}
/***
*
* @param {string} filePath
* @param data
* @return {boolean}
*/
static write(filePath: string, data: any = "") {
if (file.createPath(filePath)) {
writeFileSync(filePath, data);
return existsSync(filePath);
} else return false;
}
}
export { file };

46
package.json Normal file
View File

@ -0,0 +1,46 @@
{
"name": "@h2ostudio/koa-program",
"version": "1.0.0",
"bin": {
"koa": "bin/index.js"
},
"engines": {
"node": ">= 15"
},
"dependencies": {
"chalk": "^4.1.0",
"ejs": "^3.1.6",
"inquirer": "^7.3.3"
},
"prettier": {
"tabWidth": 2,
"printWidth": 80,
"semi": true,
"singleQuote": false,
"arrowParens": "avoid",
"bracketSpacing": true,
"trailingComma": "es5"
},
"devDependencies": {
"@types/ejs": "^3.0.5",
"@types/inquirer": "^7.3.1",
"prettier": "^2.2.1"
},
"description": "koa web 项目脚手架",
"keywords": [
"koa",
"koa2",
"koa-web",
"koa-app",
"cli"
],
"author": {
"name": "titor"
},
"publishConfig": {
"registry": "https://npm.pkg.github.com/h2ostudio"
},
"repository": {
"url": ""
}
}

20
template/Dockerfile Normal file
View File

@ -0,0 +1,20 @@
FROM foolsecret/alpine
# 安装 NodeJS 和 Yarn
RUN apk update upgrade && \
apk add --no-cache nodejs-current yarn
# 安装依赖项
#WORKDIR /root/
#COPY . .
#RUN cd /root/ && yarn install && yarn tsc
# 默认目录 Root 用户目录
# 默认端口 4321
# 启动 开发模式
VOLUME /root/
EXPOSE 4321
ENTRYPOINT ["yarn", "docker"]

21
template/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 <%= author %>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

29
template/app.ts Normal file
View File

@ -0,0 +1,29 @@
import Application from "koa";
import { router } from "./route/route";
// @ts-ignore
import view from "koa-nunjucks-2";
import { logger } from "./extend/logger";
const app: Application = new Application();
const port: Number = 4321;
// -------------------------------------------------- Use View
app.use(
view({
ext: "njk",
path: process.cwd() + "/view/",
})
);
// -------------------------------------------------- Use logger
app.use((ctx: Application.Context, next) => {
logger(ctx, next).then();
});
// -------------------------------------------------- Use Route
app.use(router.routes());
// ========================================================================
// START Application
// ========================================================================
app.listen(port);

View File

@ -0,0 +1,24 @@
import { Context, Next } from "koa"
export class Index {
static async index(ctx: Context, next: Next): Promise<any> {
ctx.body = "This is Home!"
await next()
}
static async json(ctx: Context, next: Next): Promise<any> {
ctx.type = "json"
ctx.body = {
code: "200",
message: "This is Home!",
}
await next()
}
static async view(ctx: Context) {
await ctx.render("index", {
name: "titor",
})
}
}

View File

@ -0,0 +1,12 @@
version: '3'
services:
koa:
build: .
container_name: "<%= appName %>"
restart: "no"
ports:
- 4321:4321
volumes:
- .:/root
working_dir: /root/

47
template/extend/logger.ts Normal file
View File

@ -0,0 +1,47 @@
import { lucky } from "./lucky";
import { Context, Next } from "koa";
/**
*
*
* @param app {Context | string}
* @param next {Next | function}
* @return {Promise<void>}
*/
async function logger(app: Context, next: Next): Promise<void> {
// @ts-ignore
let start: Date = new Date();
await next();
// @ts-ignore
let ms: Date = new Date() - start;
console.log(`${setMethodImage(app)} ${lucky.info(app.method)} ${lucky.second(app.url)} ${lucky.primary('['+ ms + "ms]")}`);
}
/**
*
* Application
* @param app {Application.Context}
* @return methodImage {String}
*/
function setMethodImage(app: Context) {
let method = app.method;
let methodImage: string;
switch (method) {
case "GET":
methodImage = "=>";
break;
case "POST":
methodImage = "<= ";
break;
default:
methodImage = "<=>";
break;
}
return methodImage;
}
// 导出
export { logger };

81
template/extend/lucky.ts Normal file
View File

@ -0,0 +1,81 @@
// colors-console 仅支持 CommonJS 导入
const cmd = require("colors-console");
/**
*
*
* @class lucky
*/
export class lucky {
/**
*
* @param content {String}
* @return {void}
*/
static warning(content: any) {
return cmd("yellow", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static danger(content: any) {
return cmd("magenta", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static info(content: any) {
return cmd("cyan", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static second(content: any) {
return cmd("grey", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static light(content: any) {
return cmd("white", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static primary(content: any) {
return cmd("blue", content);
}
/**
* 绿
* @param content {String}
* @return {void}
*/
static success(content: any) {
return cmd("green", content);
}
/**
*
* @param content {String}
* @return {void}
*/
static dark(content: any) {
return cmd("black", content);
}
}

45
template/package.json Normal file
View File

@ -0,0 +1,45 @@
{
"name": "<%= appName %>",
"version": "1.0.0",
"main": "app.js",
"license": "MIT",
"scripts": {
"start": "node app.js",
"dev": "yarn tsc && yarn nodemon app.js",
"build": "yarn tsc",
"clean": "rm -rf ./**/*.js ./*.js",
"clear": "rm -rf node_modules ./**/*.js ./*.js",
"docker": "yarn && yarn build && yarn start",
"docker:dev": "yarn && yarn dev"
},
"devDependencies": {
"@types/koa": "^2.11.6",
"@types/koa-router": "^7.4.1",
"@types/node": "^14.14.22",
"nodemon": "^2.0.7",
"prettier": "^2.2.1",
"rollup-plugin-typescript2": "^0.29.0",
"typescript": "^4.1.3"
},
"dependencies": {
"koa": "^2.13.1",
"koa-nunjucks-2": "^3.0.2",
"koa-router": "^10.0.0",
"colors-console": "^1.0.3"
},
"prettier": {
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"singleQuote": false,
"semi": false,
"trailingComma": "es5"
},
"nodemonConfig": {
"watch": [
"*.js",
"*.ts",
"*.njk"
]
}
}

15
template/route/route.ts Normal file
View File

@ -0,0 +1,15 @@
import Router from "koa-router"
import { Index as IndexRoute } from "./../controller/index"
const router: Router = new Router()
router.get("/", IndexRoute.index)
router.get("/json", IndexRoute.json)
router.get("/view", IndexRoute.view)
// --------------------------------------------------
// 导出 router 规则
// --------------------------------------------------
export { router }

71
template/tsconfig.json Normal file
View File

@ -0,0 +1,71 @@
{
"compileOnSave": true,
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "ES6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
"types": ["koa","koa-compose"], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}

1
template/view/index.njk Normal file
View File

@ -0,0 +1 @@
<h3>hello, {{name}}</h3>

1451
template/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

80
tsconfig.json Normal file
View File

@ -0,0 +1,80 @@
{
"compileOnSave": true,
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "ES6",
/* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "CommonJS",
/* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true,
/* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true,
/* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true,
/* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true
/* Disallow inconsistently-cased references to the same file. */
},
"files": [
"bin/index.ts"
]
}

347
yarn.lock Normal file
View File

@ -0,0 +1,347 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@types/ejs@^3.0.5":
version "3.0.5"
resolved "http://mirrors.cloud.tencent.com/npm/@types%2fejs/-/ejs-3.0.5.tgz#95a3a1c3d9603eba80fe67ff56da1ba275ef2eda"
integrity sha512-k4ef69sS4sIqAPW9GoBnN+URAON2LeL1H0duQvL4RgdEBna19/WattYSA1qYqvbVEDRTSWzOw56tCLhC/m/IOw==
"@types/inquirer@^7.3.1":
version "7.3.1"
resolved "http://mirrors.cloud.tencent.com/npm/@types%2finquirer/-/inquirer-7.3.1.tgz#1f231224e7df11ccfaf4cf9acbcc3b935fea292d"
integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g==
dependencies:
"@types/through" "*"
rxjs "^6.4.0"
"@types/node@*":
version "14.14.25"
resolved "http://mirrors.cloud.tencent.com/npm/@types%2fnode/-/node-14.14.25.tgz#15967a7b577ff81383f9b888aa6705d43fbbae93"
integrity sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==
"@types/through@*":
version "0.0.30"
resolved "http://mirrors.cloud.tencent.com/npm/@types%2fthrough/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==
dependencies:
"@types/node" "*"
ansi-escapes@^4.2.1:
version "4.3.1"
resolved "https://mirrors.tencent.com/npm/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
dependencies:
type-fest "^0.11.0"
ansi-regex@^5.0.0:
version "5.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
ansi-styles@^3.2.1:
version "3.2.1"
resolved "http://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.1.0:
version "4.3.0"
resolved "http://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
async@0.9.x:
version "0.9.2"
resolved "http://mirrors.cloud.tencent.com/npm/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
balanced-match@^1.0.0:
version "1.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
brace-expansion@^1.1.7:
version "1.1.11"
resolved "http://mirrors.cloud.tencent.com/npm/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
chalk@^2.4.2:
version "2.4.2"
resolved "http://mirrors.cloud.tencent.com/npm/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.1.0:
version "4.1.0"
resolved "http://mirrors.cloud.tencent.com/npm/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chardet@^0.7.0:
version "0.7.0"
resolved "http://mirrors.cloud.tencent.com/npm/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
cli-cursor@^3.1.0:
version "3.1.0"
resolved "http://mirrors.cloud.tencent.com/npm/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-width@^3.0.0:
version "3.0.0"
resolved "https://mirrors.tencent.com/npm/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
color-convert@^1.9.0:
version "1.9.3"
resolved "http://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
resolved "http://mirrors.cloud.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "http://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@~1.1.4:
version "1.1.4"
resolved "http://mirrors.cloud.tencent.com/npm/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
concat-map@0.0.1:
version "0.0.1"
resolved "http://mirrors.cloud.tencent.com/npm/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
ejs@^3.1.6:
version "3.1.6"
resolved "http://mirrors.cloud.tencent.com/npm/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
dependencies:
jake "^10.6.1"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://mirrors.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
external-editor@^3.0.3:
version "3.1.0"
resolved "http://mirrors.cloud.tencent.com/npm/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
dependencies:
chardet "^0.7.0"
iconv-lite "^0.4.24"
tmp "^0.0.33"
figures@^3.0.0:
version "3.2.0"
resolved "http://mirrors.cloud.tencent.com/npm/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
dependencies:
escape-string-regexp "^1.0.5"
filelist@^1.0.1:
version "1.0.2"
resolved "http://mirrors.cloud.tencent.com/npm/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b"
integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==
dependencies:
minimatch "^3.0.4"
has-flag@^3.0.0:
version "3.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
iconv-lite@^0.4.24:
version "0.4.24"
resolved "http://mirrors.cloud.tencent.com/npm/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
inquirer@^7.3.3:
version "7.3.3"
resolved "https://mirrors.tencent.com/npm/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
dependencies:
ansi-escapes "^4.2.1"
chalk "^4.1.0"
cli-cursor "^3.1.0"
cli-width "^3.0.0"
external-editor "^3.0.3"
figures "^3.0.0"
lodash "^4.17.19"
mute-stream "0.0.8"
run-async "^2.4.0"
rxjs "^6.6.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
through "^2.3.6"
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
jake@^10.6.1:
version "10.8.2"
resolved "http://mirrors.cloud.tencent.com/npm/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b"
integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==
dependencies:
async "0.9.x"
chalk "^2.4.2"
filelist "^1.0.1"
minimatch "^3.0.4"
lodash@^4.17.19:
version "4.17.20"
resolved "http://mirrors.cloud.tencent.com/npm/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "http://mirrors.cloud.tencent.com/npm/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
minimatch@^3.0.4:
version "3.0.4"
resolved "http://mirrors.cloud.tencent.com/npm/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
dependencies:
brace-expansion "^1.1.7"
mute-stream@0.0.8:
version "0.0.8"
resolved "http://mirrors.cloud.tencent.com/npm/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
onetime@^5.1.0:
version "5.1.2"
resolved "http://mirrors.cloud.tencent.com/npm/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://mirrors.tencent.com/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
prettier@^2.2.1:
version "2.2.1"
resolved "http://mirrors.cloud.tencent.com/npm/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
restore-cursor@^3.1.0:
version "3.1.0"
resolved "http://mirrors.cloud.tencent.com/npm/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
run-async@^2.4.0:
version "2.4.1"
resolved "https://mirrors.tencent.com/npm/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
rxjs@^6.4.0, rxjs@^6.6.0:
version "6.6.3"
resolved "http://mirrors.cloud.tencent.com/npm/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==
dependencies:
tslib "^1.9.0"
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
resolved "http://mirrors.cloud.tencent.com/npm/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
signal-exit@^3.0.2:
version "3.0.3"
resolved "http://mirrors.cloud.tencent.com/npm/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
string-width@^4.1.0:
version "4.2.0"
resolved "http://mirrors.cloud.tencent.com/npm/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
strip-ansi@^6.0.0:
version "6.0.0"
resolved "http://mirrors.cloud.tencent.com/npm/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
ansi-regex "^5.0.0"
supports-color@^5.3.0:
version "5.5.0"
resolved "http://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.2.0"
resolved "http://mirrors.cloud.tencent.com/npm/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
through@^2.3.6:
version "2.3.8"
resolved "http://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
tmp@^0.0.33:
version "0.0.33"
resolved "https://mirrors.tencent.com/npm/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
tslib@^1.9.0:
version "1.14.1"
resolved "https://mirrors.tencent.com/npm/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
type-fest@^0.11.0:
version "0.11.0"
resolved "http://mirrors.cloud.tencent.com/npm/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==