@lazycatcloud/lzc-cli 1.2.54 → 1.2.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/changelog.md CHANGED
@@ -1,3 +1,12 @@
1
+ # 1.2.55
2
+
3
+ 1. 添加 lzc-docker 命令
4
+ 2. 添加 lzc-docker-compose 命令
5
+ 3. 添加 deploy_params 打包支持
6
+ 4. 添加 lzc-cli 版本检测
7
+ 5. 修复 lzc-cli zsh/bash 补全错误
8
+ 6. 隐藏 triggerApk 错误
9
+
1
10
  # 1.2.54
2
11
 
3
12
  1. 添加 lzc-cli docker 命令
@@ -29,6 +29,6 @@ export async function triggerApk(id, name, iconPath) {
29
29
  throw `请求生成应用出错! 使用 --apk=n 停止生成APK`
30
30
  }
31
31
  } catch (error) {
32
- logger.error(error)
32
+ logger.debug(error)
33
33
  }
34
34
  }
@@ -76,6 +76,33 @@ async function fetchIconTo(options, cwd, destDir) {
76
76
  return
77
77
  }
78
78
 
79
+ async function fetchLzcDeployParamTo(options, cwd, destDir) {
80
+ let deployParamsPath = options["deploy_params"]
81
+ if (!deployParamsPath) {
82
+ logger.debug("deploy_params 没有指定")
83
+ let cwdDeployParamsPath = path.join(cwd, "lzc-deploy-params.yml")
84
+ if (isFileExist(cwdDeployParamsPath)) {
85
+ deployParamsPath = cwdDeployParamsPath
86
+ logger.debug("检测当前目录下具有 lzc-deploy-params.yml")
87
+ }
88
+ }
89
+ if (!deployParamsPath) {
90
+ return
91
+ }
92
+
93
+ if (!path.isAbsolute(deployParamsPath)) {
94
+ deployParamsPath = path.resolve(cwd, deployParamsPath)
95
+ }
96
+
97
+ if (!isFileExist(deployParamsPath)) {
98
+ logger.warn(`deploy_params ${deployParamsPath} 不存在`)
99
+ return
100
+ }
101
+
102
+ fs.copyFileSync(deployParamsPath, path.join(destDir, "deploy_params.yml"))
103
+ return
104
+ }
105
+
79
106
  // 提供一些方便的环境变量,可以在 lzc-build.yml 中直接使用
80
107
  // - LocalIP 本地局域网ip
81
108
  function localIp() {
@@ -137,7 +164,7 @@ export class LpkBuild {
137
164
  this.beforeBuildPackageFn = []
138
165
  this.beforeDumpYamlFn = []
139
166
  this.beforeTarContentFn = []
140
- this.beforeDumpLpkFn = [fetchIconTo]
167
+ this.beforeDumpLpkFn = [fetchIconTo, fetchLzcDeployParamTo]
141
168
  }
142
169
 
143
170
  // init 时替换 lzc-build.yml 中的模板字段
@@ -4,43 +4,52 @@ import { isFileExist, isUserApp, loadFromYaml } from "../utils.js"
4
4
  import logger from "loglevel"
5
5
  import path from "node:path"
6
6
 
7
- export function lzcDockerCommand(program) {
8
- program
9
- .parserConfiguration({
10
- "unknown-options-as-args": true
11
- })
12
- .middleware((argv, yargs) => {
13
- argv.dockerArgs = []
14
- // 找到 'docker-compose' 或者 ’docker’ 在参数中的位置
15
- let index = argv._.indexOf("docker-compose")
16
- if (index === -1) {
17
- index = argv._.indexOf("docker")
18
- }
7
+ function dockerMiddleware(argv, yargs) {
8
+ if (argv.$0 == "lzc-docker" || argv.$0 == "lzc-docker-compose") {
9
+ argv.dockerArgs = argv._
10
+ return
11
+ }
19
12
 
20
- if (index !== -1 && index < argv._.length - 1) {
21
- // 获取原始的命令行参数
22
- const originalArgs = argv._
13
+ argv.dockerArgs = []
14
+ // 找到 'docker-compose' 或者 ’docker’ 在参数中的位置
15
+ let index = argv._.indexOf("docker-compose")
16
+ if (index === -1) {
17
+ index = argv._.indexOf("docker")
18
+ }
23
19
 
24
- // 'docker-compose' 或者 ’docker’ 之后的所有参数(包括选项)移到 dockerArgs 数组中
25
- argv.dockerArgs = originalArgs.slice(index + 1)
20
+ if (index !== -1 && index < argv._.length - 1) {
21
+ // 获取原始的命令行参数
22
+ const originalArgs = argv._
26
23
 
27
- // 从原始参数中移除这些参数
28
- argv._ = argv._.slice(0, index + 1)
24
+ // 将 'docker-compose' 或者 ’docker’ 之后的所有参数(包括选项)移到 dockerArgs 数组中
25
+ argv.dockerArgs = originalArgs.slice(index + 1)
29
26
 
30
- // 移除已经被处理的参数
31
- for (const arg of argv.dockerArgs) {
32
- delete argv[arg]
33
- }
34
- }
35
- return argv
27
+ // 从原始参数中移除这些参数
28
+ argv._ = argv._.slice(0, index + 1)
29
+
30
+ // 移除已经被处理的参数
31
+ for (const arg of argv.dockerArgs) {
32
+ delete argv[arg]
33
+ }
34
+ }
35
+ return argv
36
+ }
37
+
38
+ function builder(args) {
39
+ // 禁用严格模式,允许未知参数
40
+ return args
41
+ .parserConfiguration({
42
+ "unknown-options-as-args": true
36
43
  })
44
+ .middleware(dockerMiddleware)
45
+ .strict(false)
46
+ }
37
47
 
38
- program.command({
39
- command: "docker",
48
+ export function singleLzcDockerCommand(commandName = "docker") {
49
+ return {
50
+ command: commandName,
40
51
  desc: "微服应用 docker 管理",
41
- builder: (args) => {
42
- return args.strict(false) // 禁用严格模式,允许未知参数
43
- },
52
+ builder: builder,
44
53
  handler: async (args) => {
45
54
  logger.debug("args: ", args)
46
55
  await shellApi.init()
@@ -49,13 +58,14 @@ export function lzcDockerCommand(program) {
49
58
  logger.debug("docker", args.dockerArgs)
50
59
  await bridge.lzcDocker(args.dockerArgs)
51
60
  }
52
- })
53
- program.command({
54
- command: "docker-compose",
61
+ }
62
+ }
63
+
64
+ export function singleLzcDockerComposeCommand(commandName = "docker-compose") {
65
+ return {
66
+ command: commandName,
55
67
  desc: "微服应用 docker-compose 管理",
56
- builder: (args) => {
57
- return args.strict(false) // 禁用严格模式,允许未知参数
58
- },
68
+ builder: builder,
59
69
  handler: async (args) => {
60
70
  logger.debug("args: ", args)
61
71
  await shellApi.init()
@@ -86,5 +96,10 @@ export function lzcDockerCommand(program) {
86
96
  logger.debug("docker-compose", options.join(" "))
87
97
  await bridge.lzcDockerCompose(options)
88
98
  }
89
- })
99
+ }
100
+ }
101
+
102
+ export function lzcDockerCommand(program) {
103
+ program.command(singleLzcDockerCommand())
104
+ program.command(singleLzcDockerComposeCommand())
90
105
  }
package/lib/log.js ADDED
@@ -0,0 +1,47 @@
1
+ import chalk from "chalk"
2
+ import logger from "loglevel"
3
+
4
+ export function initLogger() {
5
+ // logger level middleware
6
+ const logLevelOriginalFactory = logger.methodFactory
7
+ logger.methodFactory = function (methodName, logLevel, loggerName) {
8
+ let debug = logLevel <= logger.levels.DEBUG
9
+ let rawMethod = logLevelOriginalFactory(methodName, logLevel, loggerName)
10
+ return function (...args) {
11
+ let color = (msg) => chalk.gray
12
+ switch (methodName) {
13
+ case "trace":
14
+ color = chalk.dim.cyan
15
+ break
16
+ case "debug":
17
+ color = chalk.blue
18
+ break
19
+ case "info":
20
+ color = chalk.green
21
+ break
22
+ case "warn":
23
+ color = chalk.magenta
24
+ break
25
+ case "error":
26
+ color = chalk.bold.red
27
+ break
28
+ }
29
+ const prefix = loggerName ?? methodName
30
+ rawMethod(
31
+ (debug ? `[${prefix}] ` : "") +
32
+ args
33
+ .map((a) => {
34
+ let res = a
35
+ if (typeof a == "object") {
36
+ res = JSON.stringify(a, undefined, 4)
37
+ }
38
+ return color(res)
39
+ })
40
+ .join(" ")
41
+ )
42
+ }
43
+ }
44
+ logger.setDefaultLevel("info")
45
+ }
46
+
47
+ initLogger()
package/lib/utils.js CHANGED
@@ -19,6 +19,7 @@ import dns from "node:dns/promises"
19
19
  import axios from "axios"
20
20
  import AdmZip from "adm-zip"
21
21
  import commandExists from "command-exists"
22
+ import fetch from "node-fetch"
22
23
 
23
24
  // lzc-cli 包的 pkgInfo 信息
24
25
  export const pkgInfo = JSON.parse(
@@ -27,6 +28,27 @@ export const pkgInfo = JSON.parse(
27
28
  )
28
29
  )
29
30
 
31
+ export async function getLatestVersion(controller, pkgName = pkgInfo.name) {
32
+ const url = `https://data.jsdelivr.com/v1/package/npm/${pkgName}`
33
+ try {
34
+ logger.debug("check latest lzc-cli version...")
35
+ const data = await fetch(url, {
36
+ signal: controller.signal
37
+ })
38
+ const content = await data.json()
39
+ const latestVersion = content["tags"]["latest"]
40
+ if (latestVersion != pkgInfo.version) {
41
+ logger.warn(
42
+ `检测到 ${pkgName} 最新版本为 ${latestVersion},使用 'npm i -g ${pkgName}@${latestVersion}' 升级到最新版本!`
43
+ )
44
+ } else {
45
+ logger.debug(`已经在最新版本: ${latestVersion}`)
46
+ }
47
+ } catch (err) {
48
+ logger.debug(`请求 ${url} 失败, error: ${err}`)
49
+ }
50
+ }
51
+
30
52
  // 创建 Axios 实例
31
53
  export const api = axios.create()
32
54
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazycatcloud/lzc-cli",
3
- "version": "1.2.54",
3
+ "version": "1.2.55",
4
4
  "description": "lazycat cloud developer kit",
5
5
  "scripts": {
6
6
  "prepublishOnly": "node check-changelog.js"
@@ -12,7 +12,9 @@
12
12
  "changelog.md"
13
13
  ],
14
14
  "bin": {
15
- "lzc-cli": "scripts/cli.js"
15
+ "lzc-cli": "scripts/cli.js",
16
+ "lzc-docker": "scripts/lzc-docker.js",
17
+ "lzc-docker-compose": "scripts/lzc-docker-compose.js"
16
18
  },
17
19
  "type": "module",
18
20
  "keywords": [
package/scripts/cli.js CHANGED
@@ -5,59 +5,32 @@ import fs from "fs"
5
5
  import logger from "loglevel"
6
6
  import yargs from "yargs"
7
7
  import { hideBin } from "yargs/helpers"
8
- import chalk from "chalk"
8
+ import "../lib/log.js" // init logger
9
9
 
10
- import { contextDirname, pkgInfo } from "../lib/utils.js"
10
+ import { contextDirname, pkgInfo, getLatestVersion } from "../lib/utils.js"
11
11
  import { boxCommand } from "../lib/box/index.js"
12
12
  import { appstoreCommand } from "../lib/appstore/index.js"
13
13
  import { lpkAppCommand, lpkProjectCommand } from "../lib/app/index.js"
14
14
  import { configCommand } from "../lib/config/index.js"
15
15
  import { lzcDockerCommand } from "../lib/docker/index.js"
16
16
 
17
- // logger level middleware
18
- const logLevelOriginalFactory = logger.methodFactory
19
- logger.methodFactory = function (methodName, logLevel, loggerName) {
20
- let debug = logLevel <= logger.levels.DEBUG
21
- let rawMethod = logLevelOriginalFactory(methodName, logLevel, loggerName)
22
- return function (...args) {
23
- let color = (msg) => chalk.gray
24
- switch (methodName) {
25
- case "trace":
26
- color = chalk.dim.cyan
27
- break
28
- case "debug":
29
- color = chalk.blue
30
- break
31
- case "info":
32
- color = chalk.green
33
- break
34
- case "warn":
35
- color = chalk.magenta
36
- break
37
- case "error":
38
- color = chalk.bold.red
39
- break
40
- }
41
- const prefix = loggerName ?? methodName
42
- rawMethod(
43
- (debug ? `[${prefix}] ` : "") +
44
- args
45
- .map((a) => {
46
- let res = a
47
- if (typeof a == "object") {
48
- res = JSON.stringify(a, undefined, 4)
49
- }
50
- return color(res)
51
- })
52
- .join(" ")
53
- )
54
- }
55
- }
56
- logger.setDefaultLevel("info")
57
17
  function setLoggerLevel({ log }) {
58
18
  logger.setLevel(log, false)
59
19
  }
60
20
 
21
+ function checkLatestVersion(controller) {
22
+ return ({ _: args }) => {
23
+ if (args.length > 0) {
24
+ switch (args[0]) {
25
+ case "project":
26
+ case "app":
27
+ case "appstore":
28
+ getLatestVersion(controller)
29
+ }
30
+ }
31
+ }
32
+ }
33
+
61
34
  const program = yargs(hideBin(process.argv))
62
35
  .scriptName("lzc-cli")
63
36
  .usage("<command> [options]")
@@ -83,24 +56,30 @@ lzcDockerCommand(program)
83
56
 
84
57
  // 当没有参数的时候,默认显示帮助。
85
58
  ;(async () => {
59
+ const controller = new AbortController()
60
+
86
61
  const parser = program
87
62
  .strict()
88
63
  .showHelpOnFail(false, "使用 lzc-cli help 查看更多帮助")
89
- .middleware([setLoggerLevel])
64
+ .middleware([setLoggerLevel, checkLatestVersion(controller)])
90
65
  .parse()
91
66
 
92
- const argv = await parser
93
- if (argv._.length == 1) {
94
- switch (argv._[0]) {
95
- case "box":
96
- case "app":
97
- case "project":
98
- case "appstore":
99
- case "config":
100
- program.showHelp()
101
- return
67
+ try {
68
+ const argv = await parser
69
+ if (argv._.length == 1) {
70
+ switch (argv._[0]) {
71
+ case "box":
72
+ case "app":
73
+ case "project":
74
+ case "appstore":
75
+ case "config":
76
+ program.showHelp()
77
+ return
78
+ }
79
+ } else if (argv._.length == 0) {
80
+ program.showHelp()
102
81
  }
103
- } else if (argv._.length == 0) {
104
- program.showHelp()
82
+ } finally {
83
+ controller.abort()
105
84
  }
106
85
  })()
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import process from "process"
3
+ import logger from "loglevel"
4
+ import yargs from "yargs"
5
+ import { hideBin } from "yargs/helpers"
6
+
7
+ import "../lib/log.js"
8
+ import { pkgInfo } from "../lib/utils.js"
9
+ import { singleLzcDockerComposeCommand } from "../lib/docker/index.js"
10
+
11
+ function setLoggerLevel({ log }) {
12
+ logger.setLevel(log, false)
13
+ }
14
+
15
+ const program = yargs(hideBin(process.argv))
16
+ .scriptName("lzc-docker-compose")
17
+ .usage("<command> [options]")
18
+ .version(`lzc-docker-compose ${pkgInfo.version}`)
19
+ .option("log", {
20
+ type: "string",
21
+ default: "info",
22
+ describe: "log level 'trace', 'debug', 'info', 'warn', 'error'"
23
+ })
24
+ .option("help", {
25
+ alias: "h",
26
+ type: "boolean",
27
+ default: false
28
+ })
29
+ .command(singleLzcDockerComposeCommand("$0"))
30
+
31
+ // 当没有参数的时候,默认显示帮助。
32
+ ;(async () => {
33
+ const parser = program
34
+ .strict(false)
35
+ .showHelpOnFail(false, "使用 lzc-cli help 查看更多帮助")
36
+ .middleware([setLoggerLevel])
37
+ .parse()
38
+
39
+ const argv = await parser
40
+ if (argv._.length == 0) {
41
+ program.showHelp()
42
+ }
43
+ })()
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import process from "process"
3
+ import logger from "loglevel"
4
+ import yargs from "yargs"
5
+ import { hideBin } from "yargs/helpers"
6
+
7
+ import "../lib/log.js"
8
+ import { pkgInfo } from "../lib/utils.js"
9
+ import { singleLzcDockerCommand } from "../lib/docker/index.js"
10
+
11
+ function setLoggerLevel({ log }) {
12
+ logger.setLevel(log, false)
13
+ }
14
+
15
+ const program = yargs(hideBin(process.argv))
16
+ .scriptName("lzc-docker")
17
+ .usage("<command> [options]")
18
+ .version(`lzc-docker ${pkgInfo.version}`)
19
+ .option("log", {
20
+ type: "string",
21
+ default: "info",
22
+ describe: "log level 'trace', 'debug', 'info', 'warn', 'error'"
23
+ })
24
+ .option("help", {
25
+ alias: "h",
26
+ type: "boolean",
27
+ default: false
28
+ })
29
+ .command(singleLzcDockerCommand("$0"))
30
+
31
+ // 当没有参数的时候,默认显示帮助。
32
+ ;(async () => {
33
+ const parser = program
34
+ .strict(false)
35
+ .showHelpOnFail(false, "使用 lzc-cli help 查看更多帮助")
36
+ .middleware([setLoggerLevel])
37
+ .parse()
38
+
39
+ const argv = await parser
40
+ if (argv._.length == 0) {
41
+ program.showHelp()
42
+ }
43
+ })()
@@ -18,6 +18,9 @@ pkgout: ./
18
18
  # icon 仅仅允许 png 后缀的文件
19
19
  icon: ./lazycat.png
20
20
 
21
+ # deploy_params 指定用户运行时输入的模板字段
22
+ # deploy_params: ./lzc-deploy-params.yml
23
+
21
24
  # devshell 自定义应用的开发容器环境
22
25
  # - routers 指定应用容器的访问路由
23
26