From 49726c18154cb2675d408c0269d8ecd456eacbf9 Mon Sep 17 00:00:00 2001
From: ymc9 <104139426+ymc9@users.noreply.github.com>
Date: Mon, 6 Jan 2025 18:06:19 +0800
Subject: [PATCH] chore: misc CLI fixes

---
 packages/schema/src/cli/actions/generate.ts | 4 ++--
 packages/schema/src/cli/actions/info.ts     | 4 +++-
 packages/schema/src/cli/actions/init.ts     | 3 +--
 packages/schema/src/cli/cli-util.ts         | 8 ++++----
 packages/schema/src/cli/index.ts            | 2 +-
 packages/schema/src/utils/version-utils.ts  | 2 +-
 6 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/packages/schema/src/cli/actions/generate.ts b/packages/schema/src/cli/actions/generate.ts
index d697504ee..229a9ddd8 100644
--- a/packages/schema/src/cli/actions/generate.ts
+++ b/packages/schema/src/cli/actions/generate.ts
@@ -37,8 +37,8 @@ export async function generate(projectPath: string, options: Options) {
 
     // check for multiple versions of Zenstack packages
     const packages = getZenStackPackages(projectPath);
-    if (packages) {
-        const versions = new Set<string>(packages.map((p) => p.version));
+    if (packages.length > 0) {
+        const versions = new Set<string>(packages.map((p) => p.version).filter((v): v is string => !!v));
         if (versions.size > 1) {
             console.warn(
                 colors.yellow(
diff --git a/packages/schema/src/cli/actions/info.ts b/packages/schema/src/cli/actions/info.ts
index dddef9e27..c212babf4 100644
--- a/packages/schema/src/cli/actions/info.ts
+++ b/packages/schema/src/cli/actions/info.ts
@@ -16,7 +16,9 @@ export async function info(projectPath: string) {
     console.log('Installed ZenStack Packages:');
     const versions = new Set<string>();
     for (const { pkg, version } of packages) {
-        versions.add(version);
+        if (version) {
+            versions.add(version);
+        }
         console.log(`    ${colors.green(pkg.padEnd(20))}\t${version}`);
     }
 
diff --git a/packages/schema/src/cli/actions/init.ts b/packages/schema/src/cli/actions/init.ts
index 5790997e6..1016d61a9 100644
--- a/packages/schema/src/cli/actions/init.ts
+++ b/packages/schema/src/cli/actions/init.ts
@@ -63,8 +63,7 @@ export async function init(projectPath: string, options: Options) {
     if (sampleModelGenerated) {
         console.log(`Sample model generated at: ${colors.blue(zmodelFile)}
 
-Please check the following guide on how to model your app:
-    https://zenstack.dev/#/modeling-your-app.`);
+Learn how to use ZenStack: https://zenstack.dev/docs.`);
     } else if (prismaSchema) {
         console.log(
             `Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
diff --git a/packages/schema/src/cli/cli-util.ts b/packages/schema/src/cli/cli-util.ts
index b822f75ee..54ac123bd 100644
--- a/packages/schema/src/cli/cli-util.ts
+++ b/packages/schema/src/cli/cli-util.ts
@@ -227,13 +227,13 @@ export async function getPluginDocuments(services: ZModelServices, fileName: str
     return result;
 }
 
-export function getZenStackPackages(projectPath: string) {
+export function getZenStackPackages(projectPath: string): Array<{ pkg: string; version: string | undefined }> {
     let pkgJson: { dependencies: Record<string, unknown>; devDependencies: Record<string, unknown> };
     const resolvedPath = path.resolve(projectPath);
     try {
         pkgJson = require(path.join(resolvedPath, 'package.json'));
     } catch {
-        return undefined;
+        return [];
     }
 
     const packages = [
@@ -245,7 +245,7 @@ export function getZenStackPackages(projectPath: string) {
         try {
             const resolved = require.resolve(`${pkg}/package.json`, { paths: [resolvedPath] });
             // eslint-disable-next-line @typescript-eslint/no-var-requires
-            return { pkg, version: require(resolved).version };
+            return { pkg, version: require(resolved).version as string };
         } catch {
             return { pkg, version: undefined };
         }
@@ -286,7 +286,7 @@ export async function checkNewVersion() {
         return;
     }
 
-    if (latestVersion && semver.gt(latestVersion, currVersion)) {
+    if (latestVersion && currVersion && semver.gt(latestVersion, currVersion)) {
         console.log(`A newer version ${colors.cyan(latestVersion)} is available.`);
     }
 }
diff --git a/packages/schema/src/cli/index.ts b/packages/schema/src/cli/index.ts
index c58db8c43..62084ce9b 100644
--- a/packages/schema/src/cli/index.ts
+++ b/packages/schema/src/cli/index.ts
@@ -73,7 +73,7 @@ export const checkAction = async (options: Parameters<typeof actions.check>[1]):
 export function createProgram() {
     const program = new Command('zenstack');
 
-    program.version(getVersion(), '-v --version', 'display CLI version');
+    program.version(getVersion()!, '-v --version', 'display CLI version');
 
     const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');
 
diff --git a/packages/schema/src/utils/version-utils.ts b/packages/schema/src/utils/version-utils.ts
index 0e2de705d..3a2daae57 100644
--- a/packages/schema/src/utils/version-utils.ts
+++ b/packages/schema/src/utils/version-utils.ts
@@ -1,5 +1,5 @@
 /* eslint-disable @typescript-eslint/no-var-requires */
-export function getVersion() {
+export function getVersion(): string | undefined {
     try {
         return require('../package.json').version;
     } catch {