From fc06b35c097895ba6e3330e3417f1d0e5ab5f0f8 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Wed, 8 May 2024 00:10:14 +0000 Subject: [PATCH] feat(cli): :sparkles: Add new CLI commands, move to project root --- bun.lockb | Bin 334236 -> 333732 bytes {packages/cli => cli}/base.ts | 0 {packages/cli => cli}/bin/dev.cmd | 0 {packages/cli => cli}/bin/dev.ts | 0 {packages/cli => cli}/bin/run.cmd | 0 {packages/cli => cli}/bin/run.ts | 0 {packages/cli => cli}/classes.ts | 14 +- cli/commands/emoji/add.ts | 94 ++++++++++ cli/commands/user/create.ts | 162 ++++++++++++++++++ {packages/cli => cli}/commands/user/delete.ts | 6 +- {packages/cli => cli}/commands/user/list.ts | 4 +- {packages/cli => cli}/commands/user/reset.ts | 6 +- cli/index.ts | 13 ++ {packages/cli => cli}/theme.json | 0 {packages/cli => cli}/utils/format.ts | 0 drizzle/db.ts | 2 +- package.json | 36 +++- packages/cli/index.ts | 9 - packages/cli/package.json | 40 ----- packages/database-interface/user.ts | 11 +- utils/loggers.ts | 2 +- 21 files changed, 332 insertions(+), 67 deletions(-) rename {packages/cli => cli}/base.ts (100%) rename {packages/cli => cli}/bin/dev.cmd (100%) rename {packages/cli => cli}/bin/dev.ts (100%) rename {packages/cli => cli}/bin/run.cmd (100%) rename {packages/cli => cli}/bin/run.ts (100%) rename {packages/cli => cli}/classes.ts (83%) create mode 100644 cli/commands/emoji/add.ts create mode 100644 cli/commands/user/create.ts rename {packages/cli => cli}/commands/user/delete.ts (95%) rename {packages/cli => cli}/commands/user/list.ts (95%) rename {packages/cli => cli}/commands/user/reset.ts (96%) create mode 100644 cli/index.ts rename {packages/cli => cli}/theme.json (100%) rename {packages/cli => cli}/utils/format.ts (100%) delete mode 100644 packages/cli/index.ts delete mode 100644 packages/cli/package.json diff --git a/bun.lockb b/bun.lockb index d79453ac630b5929a183ce5884b4f43c512d2543..d40c8910a65eba2e58e2d3566dd71709ec96210a 100755 GIT binary patch delta 66936 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 delta 68652 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%0A*mnwgOxgahmiY>0#z6r$n!ZO@ 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 diff --git a/packages/cli/base.ts b/cli/base.ts similarity index 100% rename from packages/cli/base.ts rename to cli/base.ts diff --git a/packages/cli/bin/dev.cmd b/cli/bin/dev.cmd similarity index 100% rename from packages/cli/bin/dev.cmd rename to cli/bin/dev.cmd diff --git a/packages/cli/bin/dev.ts b/cli/bin/dev.ts similarity index 100% rename from packages/cli/bin/dev.ts rename to cli/bin/dev.ts diff --git a/packages/cli/bin/run.cmd b/cli/bin/run.cmd similarity index 100% rename from packages/cli/bin/run.cmd rename to cli/bin/run.cmd diff --git a/packages/cli/bin/run.ts b/cli/bin/run.ts similarity index 100% rename from packages/cli/bin/run.ts rename to cli/bin/run.ts diff --git a/packages/cli/classes.ts b/cli/classes.ts similarity index 83% rename from packages/cli/classes.ts rename to cli/classes.ts index 65028645..0d55ddd8 100644 --- a/packages/cli/classes.ts +++ b/cli/classes.ts @@ -1,8 +1,9 @@ +import { Args, type Command, Flags, type Interfaces } from "@oclif/core"; +import chalk from "chalk"; import { and, eq, like } from "drizzle-orm"; import { Users } from "~drizzle/schema"; import type { User } from "~packages/database-interface/user"; import { BaseCommand } from "./base"; -import { Args, Flags, type Command, type Interfaces } from "@oclif/core"; export type FlagsType = Interfaces.InferredFlags< (typeof BaseCommand)["baseFlags"] & T["flags"] @@ -63,6 +64,17 @@ export abstract class UserFinderCommand< } public async findUsers(): Promise { + // Check if there are asterisks in the identifier but no pattern flag, warn the user if so + if (this.args.identifier.includes("*") && !this.flags.pattern) { + this.log( + chalk.bold( + `${chalk.yellow( + "⚠", + )} Your identifier has asterisks but the --pattern flag is not set. This will match a literal string. If you want to use wildcards, set the --pattern flag.`, + ), + ); + } + const operator = this.flags.pattern ? like : eq; // Replace wildcards with an SQL LIKE pattern const identifier = this.flags.pattern diff --git a/cli/commands/emoji/add.ts b/cli/commands/emoji/add.ts new file mode 100644 index 00000000..7550c4c6 --- /dev/null +++ b/cli/commands/emoji/add.ts @@ -0,0 +1,94 @@ +import { Args } from "@oclif/core"; +import chalk from "chalk"; +import { BaseCommand } from "~/cli/base"; +import { db } from "~drizzle/db"; + +export default class EmojiAdd extends BaseCommand { + static override args = { + shortcode: Args.string({ + description: "Shortcode of the emoji", + required: true, + }), + file: Args.string({ + description: "Path to the image file (can be an URL)", + required: true, + }), + }; + + static override description = "Adds a new emoji"; + + static override examples = ["<%= config.bin %> <%= command.id %>"]; + + static override flags = {}; + + public async run(): Promise { + const { flags, args } = await this.parse(EmojiAdd); + + // Check if emoji already exists + const existingEmoji = await db.query.Emojis.findFirst({ + where: (Emojis, { eq }) => eq(Emojis.shortcode, args.shortcode), + }); + + if (existingEmoji) { + this.log( + `${chalk.red("✗")} Emoji with shortcode ${chalk.red( + args.shortcode, + )} already exists`, + ); + this.exit(1); + } + + /* if (!user) { + this.log( + `${chalk.red("✗")} Failed to create user ${chalk.red( + args.username, + )}`, + ); + this.exit(1); + } + + !flags.format && + this.log( + `${chalk.green("✓")} Created user ${chalk.green( + user.getUser().username, + )} with id ${chalk.green(user.id)}`, + ); + + this.log( + formatArray( + [user.getUser()], + [ + "id", + "username", + "displayName", + "createdAt", + "updatedAt", + "isAdmin", + ], + flags.format as "json" | "csv" | undefined, + ), + ); + + if (!flags.format && !flags["set-password"]) { + const link = ""; + + this.log( + flags.format + ? link + : `\nPassword reset link for ${chalk.bold( + `@${user.getUser().username}`, + )}: ${chalk.underline(chalk.blue(link))}\n`, + ); + + const qrcode = renderUnicodeCompact(link, { + border: 2, + }); + + // Pad all lines of QR code with spaces + + this.log(` ${qrcode.replaceAll("\n", "\n ")}`); + } */ + + this.exit(0); + } +} diff --git a/cli/commands/user/create.ts b/cli/commands/user/create.ts new file mode 100644 index 00000000..5bb93ea0 --- /dev/null +++ b/cli/commands/user/create.ts @@ -0,0 +1,162 @@ +import input from "@inquirer/input"; +import { Args, Flags } from "@oclif/core"; +import chalk from "chalk"; +import { eq } from "drizzle-orm"; +import { renderUnicodeCompact } from "uqr"; +import { BaseCommand } from "~cli/base"; +import { formatArray } from "~cli/utils/format"; +import { Users } from "~drizzle/schema"; +import { User } from "~packages/database-interface/user"; + +export default class UserCreate extends BaseCommand { + static override args = { + username: Args.string({ + description: "Username", + required: true, + }), + }; + + static override description = "Creates a new user"; + + static override examples = [ + "<%= config.bin %> <%= command.id %> johngastron --email joe@gamer.com", + "<%= config.bin %> <%= command.id %> bimbobaggins", + ]; + + static override flags = { + format: Flags.string({ + char: "f", + description: + "Output format (when set, no password reset link is generated)", + options: ["json", "csv"], + }), + admin: Flags.boolean({ + char: "a", + description: "Admin user", + allowNo: true, + default: false, + }), + email: Flags.string({ + char: "e", + description: "Email", + }), + "verify-email": Flags.boolean({ + description: "Send email verification", + default: true, + allowNo: true, + }), + "set-password": Flags.boolean({ + description: "Type password instead of getting a reset link", + default: false, + exclusive: ["format"], + }), + }; + + public async run(): Promise { + const { flags, args } = await this.parse(UserCreate); + + // Check if user already exists + const existingUser = await User.fromSql( + eq(Users.username, args.username), + ); + + if (existingUser) { + this.log( + `${chalk.red("✗")} User ${chalk.red( + args.username, + )} already exists`, + ); + this.exit(1); + } + + let password = null; + + if (flags["set-password"]) { + const password1 = await input({ + message: "Please enter the user's password:", + // Set whatever the user types to stars + transformer: (value) => "*".repeat(value.length), + }); + + const password2 = await input({ + message: "Please confirm the user's password:", + // Set whatever the user types to stars + transformer: (value) => "*".repeat(value.length), + }); + + if (password1 !== password2) { + this.log( + `${chalk.red( + "✗", + )} Passwords do not match. Please try again.`, + ); + this.exit(1); + } + + password = password1; + } + + // TODO: Add password resets + + const user = await User.fromDataLocal({ + email: flags.email ?? undefined, + password: password ?? undefined, + username: args.username, + admin: flags.admin, + skipPasswordHash: !!password, + }); + + if (!user) { + this.log( + `${chalk.red("✗")} Failed to create user ${chalk.red( + args.username, + )}`, + ); + this.exit(1); + } + + !flags.format && + this.log( + `${chalk.green("✓")} Created user ${chalk.green( + user.getUser().username, + )} with id ${chalk.green(user.id)}`, + ); + + this.log( + formatArray( + [user.getUser()], + [ + "id", + "username", + "displayName", + "createdAt", + "updatedAt", + "isAdmin", + ], + flags.format as "json" | "csv" | undefined, + ), + ); + + if (!flags.format && !flags["set-password"]) { + const link = ""; + + this.log( + flags.format + ? link + : `\nPassword reset link for ${chalk.bold( + `@${user.getUser().username}`, + )}: ${chalk.underline(chalk.blue(link))}\n`, + ); + + const qrcode = renderUnicodeCompact(link, { + border: 2, + }); + + // Pad all lines of QR code with spaces + + this.log(` ${qrcode.replaceAll("\n", "\n ")}`); + } + + this.exit(0); + } +} diff --git a/packages/cli/commands/user/delete.ts b/cli/commands/user/delete.ts similarity index 95% rename from packages/cli/commands/user/delete.ts rename to cli/commands/user/delete.ts index c4c6eef5..2e8f851f 100644 --- a/packages/cli/commands/user/delete.ts +++ b/cli/commands/user/delete.ts @@ -1,9 +1,9 @@ +import confirm from "@inquirer/confirm"; import { Flags } from "@oclif/core"; import chalk from "chalk"; -import { formatArray } from "~packages/cli/utils/format"; -import confirm from "@inquirer/confirm"; import ora from "ora"; -import { UserFinderCommand } from "~packages/cli/classes"; +import { UserFinderCommand } from "~cli/classes"; +import { formatArray } from "~cli/utils/format"; export default class UserDelete extends UserFinderCommand { static override description = "Deletes users"; diff --git a/packages/cli/commands/user/list.ts b/cli/commands/user/list.ts similarity index 95% rename from packages/cli/commands/user/list.ts rename to cli/commands/user/list.ts index e988a9ff..42dac8a0 100644 --- a/packages/cli/commands/user/list.ts +++ b/cli/commands/user/list.ts @@ -1,8 +1,8 @@ import { Flags } from "@oclif/core"; import { and, eq, isNotNull, isNull } from "drizzle-orm"; +import { BaseCommand } from "~cli/base"; +import { formatArray } from "~cli/utils/format"; import { Users } from "~drizzle/schema"; -import { BaseCommand } from "~packages/cli/base"; -import { formatArray } from "~packages/cli/utils/format"; import { User } from "~packages/database-interface/user"; export default class UserList extends BaseCommand { diff --git a/packages/cli/commands/user/reset.ts b/cli/commands/user/reset.ts similarity index 96% rename from packages/cli/commands/user/reset.ts rename to cli/commands/user/reset.ts index 02cf873e..653a42d9 100644 --- a/packages/cli/commands/user/reset.ts +++ b/cli/commands/user/reset.ts @@ -1,9 +1,9 @@ +import confirm from "@inquirer/confirm"; import { Flags } from "@oclif/core"; import chalk from "chalk"; -import { formatArray } from "~packages/cli/utils/format"; -import confirm from "@inquirer/confirm"; import { renderUnicodeCompact } from "uqr"; -import { UserFinderCommand } from "~packages/cli/classes"; +import { UserFinderCommand } from "~cli/classes"; +import { formatArray } from "~cli/utils/format"; export default class UserReset extends UserFinderCommand { static override description = "Resets users' passwords"; diff --git a/cli/index.ts b/cli/index.ts new file mode 100644 index 00000000..ee0cfd48 --- /dev/null +++ b/cli/index.ts @@ -0,0 +1,13 @@ +import EmojiAdd from "./commands/emoji/add"; +import UserCreate from "./commands/user/create"; +import UserDelete from "./commands/user/delete"; +import UserList from "./commands/user/list"; +import UserReset from "./commands/user/reset"; + +export const commands = { + "user list": UserList, + "user delete": UserDelete, + "user create": UserCreate, + "user reset": UserReset, + "emoji add": EmojiAdd, +}; diff --git a/packages/cli/theme.json b/cli/theme.json similarity index 100% rename from packages/cli/theme.json rename to cli/theme.json diff --git a/packages/cli/utils/format.ts b/cli/utils/format.ts similarity index 100% rename from packages/cli/utils/format.ts rename to cli/utils/format.ts diff --git a/drizzle/db.ts b/drizzle/db.ts index 485bba4c..63a400ed 100644 --- a/drizzle/db.ts +++ b/drizzle/db.ts @@ -1,8 +1,8 @@ -import { config } from "~/packages/config-manager"; import { drizzle } from "drizzle-orm/node-postgres"; import { migrate } from "drizzle-orm/postgres-js/migrator"; import { LogLevel, type LogManager, type MultiLogManager } from "log-manager"; import { Client } from "pg"; +import { config } from "~/packages/config-manager"; import * as schema from "./schema"; export const client = new Client({ diff --git a/package.json b/package.json index c746cfbd..c3af4a7a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "build": "bun run build.ts", "cloc": "cloc . --exclude-dir node_modules,dist,.output,.nuxt,meta,logs,glitch,glitch-dev --exclude-ext sql,log,pem", "wc": "find server database *.ts docs packages types utils drizzle tests -type f -print0 | wc -m --files0-from=-", - "cli": "bun run packages/cli/bin/run.ts", + "cli": "bun run cli/bin/run.ts", "prune": "ts-prune | grep -v server/ | grep -v dist/ | grep -v '(used in module)'" }, "trustedDependencies": [ @@ -51,6 +51,27 @@ "sharp", "vue-demi" ], + "oclif": { + "bin": "cli", + "dirname": "cli", + "commands": { + "strategy": "explicit", + "target": "./cli/index.ts", + "identifier": "commands" + }, + "additionalHelpFlags": ["-h"], + "additionalVersionFlags": ["-v"], + "plugins": ["@oclif/plugin-help"], + "description": "CLI to interface with the Lysand project", + "topicSeparator": " ", + "topics": { + "user": { + "description": "Manage users" + } + }, + "theme": "./cli/theme.json", + "flexibleTaxonomy": true + }, "devDependencies": { "@biomejs/biome": "^1.7.0", "@types/cli-table": "^0.3.4", @@ -63,12 +84,23 @@ "bun-types": "latest", "drizzle-kit": "^0.20.14", "ts-prune": "^0.10.3", - "typescript": "latest" + "typescript": "latest", + "@types/cli-progress": "^3.11.5", + "oclif": "^4.10.4" }, "peerDependencies": { "typescript": "^5.3.2" }, "dependencies": { + "@inquirer/confirm": "^3.1.6", + "@inquirer/input": "^2.1.6", + "@oclif/core": "^3.26.6", + "@oclif/plugin-help": "^6.0.21", + "@oclif/plugin-plugins": "^5.0.19", + "cli-progress": "^3.12.0", + "ora": "^8.0.1", + "table": "^6.8.2", + "uqr": "^0.1.2", "@hackmd/markdown-it-task-lists": "^2.1.4", "@hono/zod-validator": "^0.2.1", "@json2csv/plainjs": "^7.0.6", diff --git a/packages/cli/index.ts b/packages/cli/index.ts deleted file mode 100644 index ff4eec50..00000000 --- a/packages/cli/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* import { Command } from "@oclif/core"; -import UserList from "./commands/user/list"; -import UserDelete from "./commands/user/delete"; - -export const commands = { - "user list": UserList, - "user delete": UserDelete, -}; - */ diff --git a/packages/cli/package.json b/packages/cli/package.json deleted file mode 100644 index 712e0e09..00000000 --- a/packages/cli/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "cli", - "version": "0.0.0", - "type": "module", - "dependencies": { - "@inquirer/confirm": "^3.1.6", - "@oclif/core": "^3.26.6", - "@oclif/plugin-help": "^6.0.21", - "@oclif/plugin-plugins": "^5.0.19", - "chalk": "^5.3.0", - "cli-progress": "^3.12.0", - "ora": "^8.0.1", - "table": "^6.8.2", - "uqr": "^0.1.2" - }, - "devDependencies": { - "@types/cli-progress": "^3.11.5", - "oclif": "^4.10.4" - }, - "oclif": { - "bin": "cli", - "dirname": "cli", - "commands": { - "strategy": "pattern", - "target": "./commands" - }, - "additionalHelpFlags": ["-h"], - "additionalVersionFlags": ["-v"], - "plugins": ["@oclif/plugin-help"], - "description": "CLI to interface with the Lysand project", - "topicSeparator": " ", - "topics": { - "user": { - "description": "Manage users" - } - }, - "theme": "./theme.json", - "flexibleTaxonomy": true - } -} diff --git a/packages/database-interface/user.ts b/packages/database-interface/user.ts index 0ffb5c54..bc4511fd 100644 --- a/packages/database-interface/user.ts +++ b/packages/database-interface/user.ts @@ -337,8 +337,8 @@ export class User { static async fromDataLocal(data: { username: string; display_name?: string; - password: string; - email: string; + password: string | undefined; + email: string | undefined; bio?: string; avatar?: string; header?: string; @@ -353,9 +353,10 @@ export class User { .values({ username: data.username, displayName: data.display_name ?? data.username, - password: data.skipPasswordHash - ? data.password - : await Bun.password.hash(data.password), + password: + data.skipPasswordHash || !data.password + ? data.password + : await Bun.password.hash(data.password), email: data.email, note: data.bio ?? "", avatar: data.avatar ?? config.defaults.avatar, diff --git a/utils/loggers.ts b/utils/loggers.ts index e0f4a557..dd6b6e0a 100644 --- a/utils/loggers.ts +++ b/utils/loggers.ts @@ -1,5 +1,5 @@ -import { config } from "~packages/config-manager"; import { LogManager, MultiLogManager } from "log-manager"; +import { config } from "~packages/config-manager"; const noColors = process.env.NO_COLORS === "true"; const noFancyDates = process.env.NO_FANCY_DATES === "true";