From 3d20361355bb17591b7032153ac52e909669a6ae Mon Sep 17 00:00:00 2001 From: Cory Dransfeldt Date: Tue, 10 Jun 2025 18:35:25 -0700 Subject: [PATCH] fix(cli): clean up eager loading bug when initializing cli --- cli/bin/index.js | 13 +++- cli/lib/config.js | 10 +-- cli/lib/jobs.js | 166 +++++++++++++++++++++--------------------- cli/package-lock.json | 4 +- cli/package.json | 2 +- 5 files changed, 99 insertions(+), 96 deletions(-) diff --git a/cli/bin/index.js b/cli/bin/index.js index 5dbe204..a747d57 100755 --- a/cli/bin/index.js +++ b/cli/bin/index.js @@ -3,8 +3,7 @@ import { program } from 'commander'; import chalk from 'chalk'; import figlet from 'figlet'; -import { initConfig, loadConfig } from '../lib/config.js'; -import { downloadAsset } from '../lib/download.js'; +import { loadConfig } from '../lib/config.js'; import { runRootScript } from '../lib/runScript.js'; import { handleExitError } from '../lib/handlers.js'; import { runJobsMenu } from '../lib/jobs.js'; @@ -14,11 +13,17 @@ process.on('unhandledRejection', (err) => handleExitError(err, 'Unhandled reject process.on('uncaughtException', (err) => handleExitError(err, 'Uncaught exception')); program.name('coryd').description('🪄 Handle tasks, run commands or jobs, download things and have fun.').version('3.2.0'); -program.command('init').description('Initialize CLI and populate required config.').action(initConfig); +program.command('init').description('Initialize CLI and populate required config.').action(async () => { + const { initConfig } = await import('../lib/config.js'); + await initConfig(); +}); program.command('run [script]').description('Run site scripts and commands.').action(runRootScript); program.command('tasks').description('Handle repeated tasks.').action(runTasksMenu); program.command('jobs').description('Trigger jobs and scripts.').action(runJobsMenu); -program.command('download').description('Download, name and store image assets.').action(downloadAsset); +program.command('download').description('Download, name and store image assets.').action(async () => { + const { downloadAsset } = await import('../lib/download.js'); + await downloadAsset(); +}); if (process.argv.length <= 2) { const ascii = figlet.textSync('coryd.dev', { horizontalLayout: 'default' }); diff --git a/cli/lib/config.js b/cli/lib/config.js index adfbaa2..ad59d12 100644 --- a/cli/lib/config.js +++ b/cli/lib/config.js @@ -5,7 +5,8 @@ import { fileURLToPath } from 'url'; import dotenv from 'dotenv'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const CACHE_DIR = path.resolve(__dirname, '..', '.cache'); +const rootDir = path.resolve(__dirname, '..'); +const CACHE_DIR = path.join(rootDir, '.cache'); const CONFIG_PATH = path.join(CACHE_DIR, 'config.json'); const MEDIA_TYPES = ['movie', 'show']; const ASSET_TYPES = ['poster', 'backdrop']; @@ -13,10 +14,7 @@ const ASSET_TYPES = ['poster', 'backdrop']; dotenv.config({ path: path.resolve(__dirname, '..', '..', '.env') }); export const initConfig = async () => { - const existingConfig = await fs.pathExists(CONFIG_PATH) - ? await fs.readJson(CONFIG_PATH) - : {}; - + const existingConfig = await fs.pathExists(CONFIG_PATH) ? await fs.readJson(CONFIG_PATH) : {}; const config = { ...existingConfig }; if (config.storageDir) { @@ -153,7 +151,7 @@ export const loadConfig = async () => { } return await fs.readJson(CONFIG_PATH); -} +}; const fetchGlobals = async () => { const POSTGREST_URL = process.env.POSTGREST_URL; diff --git a/cli/lib/jobs.js b/cli/lib/jobs.js index dbe692d..29dcadb 100644 --- a/cli/lib/jobs.js +++ b/cli/lib/jobs.js @@ -4,96 +4,96 @@ import { fileURLToPath } from 'url'; import dotenv from 'dotenv'; import { loadConfig } from './config.js'; -const config = await loadConfig(); const __dirname = path.dirname(fileURLToPath(import.meta.url)); dotenv.config({ path: path.resolve(__dirname, '..', '..', '.env') }); -const JOBS = [ - { - name: '🛠 Rebuild site', - type: 'curl', - urlEnvVar: 'SITE_REBUILD_WEBHOOK', - tokenEnvVar: 'DIRECTUS_API_TOKEN', - method: 'GET' - }, - { - name: '💿 Scrobble listens from Navidrome', - type: 'curl', - apiUrl: `${config.globals.url}/api/scrobble.php`, - tokenEnvVar: 'NAVIDROME_SCROBBLE_TOKEN', - method: 'POST' - }, - { - name: '🎧 Update total plays', - type: 'curl', - urlEnvVar: 'TOTAL_PLAYS_WEBHOOK', - tokenEnvVar: 'DIRECTUS_API_TOKEN', - method: 'GET' - }, - { - name: '🐘 Send posts to Mastodon', - type: 'curl', - apiUrl: `${config.globals.url}/api/mastodon.php`, - tokenEnvVar: 'MASTODON_SYNDICATION_TOKEN', - method: 'POST' - }, - { - name: '🎤 Import artist from Navidrome', - type: 'curl', - apiUrl: `${config.globals.url}/api/artist-import.php`, - tokenEnvVar: 'ARTIST_IMPORT_TOKEN', - method: 'POST', - paramsPrompt: [{ - type: 'input', - name: 'artistId', - message: 'Enter the Navidrome artist ID:', - validate: input => input ? true : 'Artist ID is required' - }] - }, - { - name: '📖 Import book', - type: 'curl', - apiUrl: `${config.globals.url}/api/book-import.php`, - tokenEnvVar: 'BOOK_IMPORT_TOKEN', - method: 'POST', - paramsPrompt: [{ - type: 'input', - name: 'isbn', - message: 'Enter the book\'s ISBN:', - validate: input => input ? true : 'ISBN is required' - }] - }, - { - name: '📽 Import movie or show', - type: 'curl', - apiUrl: `${config.globals.url}/api/watching-import.php`, - tokenEnvVar: 'WATCHING_IMPORT_TOKEN', - method: 'POST', - tokenIncludeInParams: true, - paramsPrompt: [{ - type: 'input', - name: 'tmdb_id', - message: 'Enter the TMDB ID:', - validate: (input) => - /^\d+$/.test(input) ? true : 'Please enter a valid TMDB ID' +export const runJobsMenu = async () => { + const config = await loadConfig(); + const JOBS = [ + { + name: '🛠 Rebuild site', + type: 'curl', + urlEnvVar: 'SITE_REBUILD_WEBHOOK', + tokenEnvVar: 'DIRECTUS_API_TOKEN', + method: 'GET' }, { - type: 'list', - name: 'media_type', - message: 'Is this a movie or a show?', - choices: ['movie', 'show'] - }] - }, - { - name: '📺 Import upcoming TV seasons', - type: 'curl', - apiUrl: `${config.globals.url}/api/seasons-import.php`, - tokenEnvVar: 'SEASONS_IMPORT_TOKEN', - method: 'POST' - }]; + name: '💿 Scrobble listens from Navidrome', + type: 'curl', + apiUrl: `${config.globals.url}/api/scrobble.php`, + tokenEnvVar: 'NAVIDROME_SCROBBLE_TOKEN', + method: 'POST' + }, + { + name: '🎧 Update total plays', + type: 'curl', + urlEnvVar: 'TOTAL_PLAYS_WEBHOOK', + tokenEnvVar: 'DIRECTUS_API_TOKEN', + method: 'GET' + }, + { + name: '🐘 Send posts to Mastodon', + type: 'curl', + apiUrl: `${config.globals.url}/api/mastodon.php`, + tokenEnvVar: 'MASTODON_SYNDICATION_TOKEN', + method: 'POST' + }, + { + name: '🎤 Import artist from Navidrome', + type: 'curl', + apiUrl: `${config.globals.url}/api/artist-import.php`, + tokenEnvVar: 'ARTIST_IMPORT_TOKEN', + method: 'POST', + paramsPrompt: [{ + type: 'input', + name: 'artistId', + message: 'Enter the Navidrome artist ID:', + validate: input => input ? true : 'Artist ID is required' + }] + }, + { + name: '📖 Import book', + type: 'curl', + apiUrl: `${config.globals.url}/api/book-import.php`, + tokenEnvVar: 'BOOK_IMPORT_TOKEN', + method: 'POST', + paramsPrompt: [{ + type: 'input', + name: 'isbn', + message: 'Enter the book\'s ISBN:', + validate: input => input ? true : 'ISBN is required' + }] + }, + { + name: '📽 Import movie or show', + type: 'curl', + apiUrl: `${config.globals.url}/api/watching-import.php`, + tokenEnvVar: 'WATCHING_IMPORT_TOKEN', + method: 'POST', + tokenIncludeInParams: true, + paramsPrompt: [{ + type: 'input', + name: 'tmdb_id', + message: 'Enter the TMDB ID:', + validate: (input) => + /^\d+$/.test(input) ? true : 'Please enter a valid TMDB ID' + }, + { + type: 'list', + name: 'media_type', + message: 'Is this a movie or a show?', + choices: ['movie', 'show'] + }] + }, + { + name: '📺 Import upcoming TV seasons', + type: 'curl', + apiUrl: `${config.globals.url}/api/seasons-import.php`, + tokenEnvVar: 'SEASONS_IMPORT_TOKEN', + method: 'POST' + }]; -export const runJobsMenu = async () => { const { selectedJob } = await inquirer.prompt([{ type: 'list', name: 'selectedJob', diff --git a/cli/package-lock.json b/cli/package-lock.json index 01e0212..8be0471 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,12 +1,12 @@ { "name": "coryd", - "version": "3.2.2", + "version": "3.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coryd", - "version": "3.2.2", + "version": "3.2.3", "dependencies": { "@directus/sdk": "^19.1.0", "chalk": "^5.4.1", diff --git a/cli/package.json b/cli/package.json index 315d02b..dcbd050 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "coryd", - "version": "3.2.2", + "version": "3.2.3", "description": "The CLI for my site to run scripts, manage and download assets.", "type": "module", "bin": {