Skip to content

Commit

Permalink
Implemented: cli improvements #83
Browse files Browse the repository at this point in the history
  • Loading branch information
rizen committed Apr 10, 2024
1 parent c6f58fb commit ea2a3f3
Show file tree
Hide file tree
Showing 12 changed files with 257 additions and 178 deletions.
1 change: 1 addition & 0 deletions docs/change-log.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ outline: deep
* Fixed: isRoleOrDie not documented correctly #77
* Implemented: document Nuxt stuff #76
* Implemented: add --bare as an option in generators that gets rid of the boiler plate #75
* Implemented: cli improvements #83

## 2024-04-08
* Breaking change: Refactored VingRecord isOwner(), canEdit(), and propsOptions() to be async.
Expand Down
3 changes: 2 additions & 1 deletion ving.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const main = defineCommand({
name: "ving.mjs",
description: "ving CLI",
},
cleanup: ving.close,
subCommands: {
alert: () => import('#ving/cli/alert.mjs').then((r) => r.default),
cache: () => import('#ving/cli/cache.mjs').then((r) => r.default),
Expand All @@ -20,4 +21,4 @@ const main = defineCommand({
},
});

runMain(main);
runMain(main,);
41 changes: 26 additions & 15 deletions ving/cli/alert.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { defineCommand } from "citty";
import { defineCommand, showUsage } from "citty";
import ving from '#ving/index.mjs';

export default defineCommand({
meta: {
name: "System Wide Alert",
name: "alert",
description: "Manage system wide alerts from the command line",
},
cleanup: ving.close,
args: {
message: {
type: "string",
Expand Down Expand Up @@ -40,20 +41,30 @@ export default defineCommand({
alias: "g",
},
},
async run({ args }) {
if (args.message) {
await ving.useCache().set('system-wide-alert', {
message: args.message,
severity: args.severity,
ttl: 60 * 60 * 1000 * args.ttl,
}, 60 * 60 * 1000 * args.ttl);
async run({ args, cmd }) {
try {
if (args.message) {
const ttl = 60 * 60 * 1000 * args.ttl;
await ving.useCache().set('system-wide-alert', {
message: args.message,
severity: args.severity,
ttl,
}, ttl);
ving.log('cli').info(`Message set: "${args.message}"`);
}
else if (args.get) {
ving.log('cli').info(await ving.useCache().get('system-wide-alert'));
}
else if (args.delete) {
await ving.useCache().delete('system-wide-alert');
ving.log('cli').info('Message deleted.');
}
else {
await showUsage(cmd, { meta: { name: 'ving.mjs' } });
}
}
if (args.get) {
ving.log('cli').info(await ving.useCache().get('system-wide-alert'));
catch (e) {
ving.log('cli').error(e.message);
}
if (args.delete) {
await ving.useCache().delete('system-wide-alert');
}
await ving.close();
},
});
44 changes: 26 additions & 18 deletions ving/cli/cache.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { defineCommand } from "citty";
import { defineCommand, showUsage } from "citty";
import ving from '#ving/index.mjs';

export default defineCommand({
meta: {
name: "Cache",
name: "cache",
description: "CRUD cache entries",
},
cleanup: ving.close,
args: {
clear: {
type: "boolean",
Expand Down Expand Up @@ -44,23 +45,30 @@ export default defineCommand({
alias: "t",
},
},
async run({ args }) {
if (args.clear) {
await ving.useCache().clear();
ving.log('cli').info('Cache cleared');
async run({ args, cmd }) {
try {
if (args.clear) {
await ving.useCache().clear();
ving.log('cli').info('Cache cleared');
}
else if (args.get) {
const value = await ving.useCache().get(args.get);
ving.log('cli').info(`Value of ${args.get} is ${JSON.stringify(value)}`);
}
else if (args.delete) {
await ving.useCache().delete(args.delete);
ving.log('cli').info(`${args.delete} deleted`);
}
else if (args.set) {
await ving.useCache().set(args.set, args.value, Number(args.ttl));
ving.log('cli').info(`${args.set} set to ${args.value} for ${args.ttl}ms`);
}
else {
await showUsage(cmd, { meta: { name: 'ving.mjs' } });
}
}
if (args.get) {
const value = await ving.useCache().get(args.get);
ving.log('cli').info(`Value of ${args.get} is ${JSON.stringify(value)}`);
catch (e) {
ving.log('cli').error(e.message);
}
if (args.delete) {
await ving.useCache().delete(args.delete);
ving.log('cli').info(`${args.delete} deleted`);
}
if (args.set) {
await ving.useCache().set(args.set, args.value, Number(args.ttl));
ving.log('cli').info(`${args.set} set to ${args.value} for ${args.ttl}ms`);
}
await ving.close();
},
});
103 changes: 55 additions & 48 deletions ving/cli/drizzle.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { defineCommand } from "citty";
import { defineCommand, showUsage } from "citty";
import { exec } from "child_process";
import { runMigrations } from '#ving/drizzle/migrate.mjs';
import { makeTableFile } from '#ving/generator/drizzletable.mjs';
Expand All @@ -9,9 +9,10 @@ import fs from "node:fs";

export default defineCommand({
meta: {
name: "Drizzle ORM",
description: "Manage Drizzle migrations and code generation",
name: "drizzle",
description: "Manage Drizzle ORM migrations and code generation",
},
cleanup: ving.close,
args: {
tables: {
type: "boolean",
Expand All @@ -34,57 +35,63 @@ export default defineCommand({
alias: "s",
},
},
async run({ args }) {
if (args.tables) {
for (const schema of vingSchemas) {
await makeTableFile({ schema });
}
}
else if (args.status) {
const migrationFolderTo = './ving/drizzle/migrations';
const migrations = [];
const journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();
const journal = JSON.parse(journalAsString);
for (const journalEntry of journal.entries) {
const query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();
migrations.push({
tag: journalEntry.tag,
hash: crypto.createHash("sha256").update(query).digest("hex")
});
async run({ args, cmd }) {
try {
if (args.tables) {
for (const schema of vingSchemas) {
await makeTableFile({ schema });
}
}
ving.log('cli').info(`Last Migration Available: ${migrations[migrations.length - 1].tag} [${migrations[migrations.length - 1].hash}]`);
try {
const [rows] = await ving.useDB().session.client.pool.promise().query('SELECT * from __drizzle_migrations order by created_at desc limit 1');
const applied = migrations.find(m => m.hash == rows[0].hash);
if (applied) {
ving.log('cli').info(`Last Migration Applied: ${applied.tag} [${applied.hash}]`);
else if (args.status) {
const migrationFolderTo = './ving/drizzle/migrations';
const migrations = [];
const journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();
const journal = JSON.parse(journalAsString);
for (const journalEntry of journal.entries) {
const query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();
migrations.push({
tag: journalEntry.tag,
hash: crypto.createHash("sha256").update(query).digest("hex")
});
}
else {
ving.log('cli').error(`Last Migration Applied: None`);
ving.log('cli').info(`Last Migration Available: ${migrations[migrations.length - 1].tag} [${migrations[migrations.length - 1].hash}]`);
try {
const [rows] = await ving.useDB().session.client.pool.promise().query('SELECT * from __drizzle_migrations order by created_at desc limit 1');
const applied = migrations.find(m => m.hash == rows[0].hash);
if (applied) {
ving.log('cli').info(`Last Migration Applied: ${applied.tag} [${applied.hash}]`);
}
else {
ving.log('cli').error(`Last Migration Applied: None`);
}
}
catch {
ving.log('cli').error(`Last Migration Applied: Database not initialized`);
}

}
catch {
ving.log('cli').error(`Last Migration Applied: Database not initialized`);
else if (args.up) {
runMigrations();
}
else if (args.prepare) {
exec("npx drizzle-kit generate:mysql --out ./ving/drizzle/migrations --schema ving/drizzle/schema", (error, stdout, stderr) => {
if (error) {
ving.log('cli').error(error.message);
return;
}
if (stderr) {
ving.log('cli').error(stderr);
return;
}
ving.log('cli').info(stdout);
});
}
else {
await showUsage(cmd, { meta: { name: 'ving.mjs' } });
}

}
else if (args.up) {
runMigrations();
catch (e) {
ving.log('cli').error(e.message);
}
else if (args.prepare) {
exec("npx drizzle-kit generate:mysql --out ./ving/drizzle/migrations --schema ving/drizzle/schema", (error, stdout, stderr) => {
if (error) {
ving.log('cli').error(error.message);
return;
}
if (stderr) {
ving.log('cli').error(stderr);
return;
}
ving.log('cli').info(stdout);
});
}
await ving.close();

},
});
30 changes: 19 additions & 11 deletions ving/cli/email.mjs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { defineCommand } from "citty";
import { defineCommand, showUsage } from "citty";
import { generateTemplates } from '#ving/generator/emailtemplate.mjs';
import ving from '#ving/index.mjs';

export default defineCommand({
meta: {
name: "Email",
name: "email",
description: "Useful for testing email",
},
cleanup: ving.close,
args: {
to: {
type: "string",
Expand All @@ -32,16 +33,23 @@ export default defineCommand({
alias: 'c',
},
},
async run({ args }) {
if (args.to) {
ving.sendMail(args.template, {
options: { to: args.to, from: '[email protected]', preview: args.preview },
});
ving.log('cli').info(`Email sent to ${args.to}`);
async run({ args, cmd }) {
try {
if (args.to) {
ving.sendMail(args.template, {
options: { to: args.to, from: '[email protected]', preview: args.preview },
});
ving.log('cli').info(`Email sent to ${args.to}`);
}
else if (args.create) {
await generateTemplates({ name: args.create });
}
else {
await showUsage(cmd, { meta: { name: 'ving.mjs' } });
}
}
else if (args.create) {
await generateTemplates({ name: args.create });
catch (e) {
ving.log('cli').error(e.message);
}
await ving.close();
},
});
42 changes: 25 additions & 17 deletions ving/cli/jobs.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { defineCommand } from "citty";
import { defineCommand, showUsage } from "citty";
import { VingJobWorker } from '#ving/jobs/worker.mjs';
import ving from '#ving/index.mjs';

export default defineCommand({
meta: {
name: "Jobs",
name: "jobs",
description: "Manage background jobs",
},
args: {
Expand Down Expand Up @@ -40,22 +40,30 @@ export default defineCommand({
alias: 'd',
},
},
async run({ args }) {
if (args.addJob) {
await ving.addJob(args.addJob, JSON.parse(args.jobData), {
queueName: args.queueName,
});
if (!args.worker)
ving.close();
}
if (args.worker) {
const worker = new VingJobWorker(args.queueName);
await worker.start();
if (args.ttl > 0) {
setTimeout(async () => {
await worker.end();
}, 1000 * args.ttl);
async run({ args, cmd }) {
try {
if (args.worker) {
const worker = new VingJobWorker(args.queueName);
await worker.start();
if (args.ttl > 0) {
setTimeout(async () => {
await worker.end();
}, 1000 * args.ttl);
}
}
else if (args.addJob) {
await ving.addJob(args.addJob, JSON.parse(args.jobData), {
queueName: args.queueName,
});
if (!args.worker)
ving.close();
}
else {
await showUsage(cmd, { meta: { name: 'ving.mjs' } });
}
}
catch (e) {
ving.log('cli').error(e.message);
}
},
});
Loading

0 comments on commit ea2a3f3

Please sign in to comment.