diff --git a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl new file mode 100644 index 0000000..2ee26de Binary files /dev/null and b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl differ diff --git a/.serena/memories/code_style_conventions.md b/.serena/memories/code_style_conventions.md new file mode 100644 index 0000000..53dc36f --- /dev/null +++ b/.serena/memories/code_style_conventions.md @@ -0,0 +1,31 @@ +# Code Style and Conventions + +## Naming Conventions +- Interfaces prefixed with `I` (e.g., `ITsPublishJson`) +- Types prefixed with `T` (when applicable) +- All filenames in lowercase +- Class files named as `classes..ts` +- Test files named as `test..ts` or `*.both.ts`, `*.node.ts`, `*.browser.ts` + +## Import Style +- Module dependencies imported via `ts/plugins.ts` +- Use full path references: `plugins.myModule.myClass()` +- Import TypeScript files directly in tests, never compiled JavaScript + +## Code Patterns +- Async/await preferred over callbacks +- Classes for main logic (TsPublish, PublishModule) +- Centralized logging via `logging.ts` +- Plugins pattern for external dependencies + +## TypeScript Conventions +- Use type annotations +- Export classes and functions explicitly +- Module exports through index.ts +- Interfaces in separate interfaces/ directory + +## File Organization +- Source code in `ts/` directory +- Tests in `test/` directory +- Compiled output in `dist_ts/` +- No uppercase in filenames \ No newline at end of file diff --git a/.serena/memories/logging_improvements_2025.md b/.serena/memories/logging_improvements_2025.md new file mode 100644 index 0000000..db77ca8 --- /dev/null +++ b/.serena/memories/logging_improvements_2025.md @@ -0,0 +1,49 @@ +# Logging Improvements - January 2025 + +## Overview +Enhanced TSPublish logging system with @push.rocks/smartlog and @push.rocks/consolecolor for better visual feedback and user experience. + +## Changes Made + +### 1. Dependencies +- Added @push.rocks/consolecolor (v2.0.3) for colored console output + +### 2. Enhanced logging.ts +- Created color-coded log level indicators with emojis +- Added specialized logging functions: + - `logInfo()` - Cyan info messages + - `logSuccess()` - Green success messages + - `logWarn()` - Orange warning messages + - `logError()` - Red error messages + - `logStart()` - Blue start indicators + - `logDone()` - Green completion indicators + - `logPackage()` - Package-specific messages with icons + - `logBuild()` - Build messages with hammer icon + - `logPublish()` - Publish messages with rocket icon + - `logOngoing()` - Ongoing operations with spinner icon +- Added visual helpers: + - `logSeparator()` - Cyan line separator + - `logHeader()` - Colored section headers + - `logProgress()` - Progress bar with percentage + +### 3. Updated classes.tspublish.ts +- Added colored header at startup +- Module discovery uses colored bullets +- Progress tracking for module processing +- Better visual separation between phases + +### 4. Updated classes.publishmodule.ts +- Added visual indicators for each operation phase +- Build process shows building status and completion +- Publishing shows rocket icon and success message +- NPM registry checks have clearer warnings + +### 5. Updated index.ts +- Replaced console.log with logStart() + +## Benefits +- Clearer visual hierarchy of information +- Easier to track progress through long operations +- Better distinction between info, warnings, and errors +- More professional and polished CLI output +- Semantic icons make status immediately recognizable \ No newline at end of file diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md new file mode 100644 index 0000000..35afd82 --- /dev/null +++ b/.serena/memories/project_overview.md @@ -0,0 +1,45 @@ +# TSPublish Project Overview + +## Purpose +TSPublish is a tool designed to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment. It helps manage and automate the publishing of individual packages from a monorepo structure. + +## Tech Stack +- **Language**: TypeScript +- **Runtime**: Node.js +- **Package Manager**: pnpm (v10.11.0) +- **Build Tool**: @git.zone/tsbuild +- **Testing**: @git.zone/tstest with @push.rocks/tapbundle +- **CLI Framework**: @push.rocks/smartcli +- **Logging**: @push.rocks/smartlog (currently basic usage) + +## Main Dependencies +- @push.rocks/smartcli - CLI interface +- @push.rocks/smartdelay - Delay utilities +- @push.rocks/smartfile - File operations +- @push.rocks/smartlog - Logging +- @push.rocks/smartnpm - NPM registry interactions +- @push.rocks/smartpath - Path utilities +- @push.rocks/smartrequest - HTTP requests +- @push.rocks/smartshell - Shell command execution + +## Project Structure +- `ts/` - TypeScript source files + - `index.ts` - Main entry point + - `classes.tspublish.ts` - Main TsPublish class + - `classes.publishmodule.ts` - PublishModule class for individual packages + - `classes.giteaassets.ts` - Gitea assets management + - `logging.ts` - Logger configuration + - `plugins.ts` - External dependencies + - `paths.ts` - Path constants + - `interfaces/` - TypeScript interfaces +- `test/` - Test files +- `dist_ts/` - Compiled JavaScript output +- `cli.js` - CLI entry point (bin script) + +## Key Features +1. Scans monorepo for directories starting with "ts" +2. Validates packages via tspublish.json files +3. Creates package.json dynamically for each module +4. Builds TypeScript code before publishing +5. Checks npm registry for version conflicts +6. Publishes packages to npm registry \ No newline at end of file diff --git a/.serena/memories/suggested_commands.md b/.serena/memories/suggested_commands.md new file mode 100644 index 0000000..9414a76 --- /dev/null +++ b/.serena/memories/suggested_commands.md @@ -0,0 +1,34 @@ +# Suggested Commands for TSPublish Development + +## Build & Test Commands +- `pnpm build` - Build the TypeScript project (runs tsbuild --web --allowimplicitany) +- `pnpm test` - Run the test suite (runs tstest test/ --web) +- `pnpm buildDocs` - Generate documentation (runs tsdoc) + +## Development Commands +- `tsx ts/index.ts` - Run the main entry point directly +- `tsx test/test.ts` - Run specific test file +- `tstest test/test.some.ts --verbose` - Run specific test with verbose output +- `tsbuild check test/**/* --skiplibcheck` - Type check test files + +## Package Management +- `pnpm install` - Install dependencies +- `pnpm install --save-dev ` - Install dev dependency +- `pnpm add ` - Add production dependency + +## Git Commands (Linux) +- `git status` - Check repository status +- `git diff` - View changes +- `git log` - View commit history +- `git mv ` - Move/rename files preserving history + +## File System Commands (Linux) +- `ls` - List directory contents +- `cd` - Change directory +- `find` - Find files +- `grep` - Search file contents +- `cat` - Display file contents + +## CLI Usage +- `./cli.js` - Run the tspublish CLI +- `node cli.js` - Alternative way to run CLI \ No newline at end of file diff --git a/.serena/memories/task_completion_checklist.md b/.serena/memories/task_completion_checklist.md new file mode 100644 index 0000000..b895e51 --- /dev/null +++ b/.serena/memories/task_completion_checklist.md @@ -0,0 +1,29 @@ +# Task Completion Checklist + +When completing any development task on TSPublish: + +## 1. Build Verification +- Run `pnpm build` to ensure TypeScript compiles without errors +- No use of --skiplibcheck flag + +## 2. Test Execution +- Run `pnpm test` to verify all tests pass +- For specific test files: `tsx test/test.specific.ts` + +## 3. Type Checking +- Type check test files: `tsbuild check test/**/* --skiplibcheck` +- Type check source files: `pnpm build` + +## 4. Code Quality +- Ensure changes are focused and goal-oriented +- Verify no unnecessary modifications were made +- Check that code follows existing patterns and conventions + +## 5. Documentation +- Update readme.hints.md if new insights discovered +- Update readme.plan.md if working from a plan + +## 6. Version Control +- Use `git mv` for file renames to preserve history +- Make small, focused commits +- Never commit without explicit user request \ No newline at end of file diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 0000000..13b762d --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,68 @@ +# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby) +# * For C, use cpp +# * For JavaScript, use typescript +# Special requirements: +# * csharp: Requires the presence of a .sln file in the project folder. +language: typescript + +# whether to use the project's gitignore file to ignore files +# Added on 2025-04-07 +ignore_all_files_in_gitignore: true +# list of additional paths to ignore +# same syntax as gitignore, so you can use * and ** +# Was previously called `ignored_dirs`, please update your config if you are using that. +# Added (renamed)on 2025-04-07 +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + + +# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. +# Below is the complete list of tools for convenience. +# To make sure you have the latest list of tools, and to view their descriptions, +# execute `uv run scripts/print_tool_overview.py`. +# +# * `activate_project`: Activates a project by name. +# * `check_onboarding_performed`: Checks whether project onboarding was already performed. +# * `create_text_file`: Creates/overwrites a file in the project directory. +# * `delete_lines`: Deletes a range of lines within a file. +# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. +# * `execute_shell_command`: Executes a shell command. +# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. +# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). +# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). +# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. +# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file or directory. +# * `initial_instructions`: Gets the initial instructions for the current project. +# Should only be used in settings where the system prompt cannot be set, +# e.g. in clients you have no control over, like Claude Desktop. +# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. +# * `insert_at_line`: Inserts content at a given line in a file. +# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. +# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). +# * `list_memories`: Lists memories in Serena's project-specific memory store. +# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). +# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). +# * `read_file`: Reads a file within the project directory. +# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. +# * `remove_project`: Removes a project from the Serena configuration. +# * `replace_lines`: Replaces a range of lines within a file with new content. +# * `replace_symbol_body`: Replaces the full definition of a symbol. +# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. +# * `search_for_pattern`: Performs a search for a pattern in the project. +# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. +# * `switch_modes`: Activates modes by providing a list of their names +# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. +# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. +# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. +# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. +excluded_tools: [] + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +project_name: "tspublish" diff --git a/changelog.md b/changelog.md index bdc63ae..cabe8d3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2025-08-08 - 1.10.0 - feat(logging) +Enhance logging and module publishing with color-coded output, progress tracking, and improved CLI startup + +- Refactored logging to introduce color-coded symbols and helper functions (logInfo, logWarn, logSuccess, logBuild, logPublish, etc.) +- Added visual components such as headers, separators, and progress indicators for better operational visibility +- Integrated enhanced logging into module publishing and CLI startup, replacing generic console logs +- Updated various configuration and documentation files to reflect new code style conventions and dependency updates + ## 2025-01-02 - 1.9.1 - fix(publishmodule) Fix incorrect CLI script path during publish module creation diff --git a/package.json b/package.json index 5a0b045..5a52e82 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "readme.md" ], "dependencies": { + "@push.rocks/consolecolor": "^2.0.3", "@push.rocks/smartcli": "^4.0.11", "@push.rocks/smartdelay": "^3.0.5", "@push.rocks/smartfile": "^11.0.21", @@ -68,5 +69,6 @@ "modularity", "module-management", "developer-tools" - ] + ], + "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fd8c06..3523ca7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@push.rocks/consolecolor': + specifier: ^2.0.3 + version: 2.0.3 '@push.rocks/smartcli': specifier: ^4.0.11 version: 4.0.11 @@ -479,8 +482,8 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@push.rocks/consolecolor@2.0.2': - resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} + '@push.rocks/consolecolor@2.0.3': + resolution: {integrity: sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==} '@push.rocks/early@4.0.4': resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} @@ -3653,7 +3656,7 @@ snapshots: '@api.global/typedserver': 3.0.51 '@git.zone/tsbundle': 2.1.0 '@git.zone/tsrun': 1.3.3 - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartbrowser': 2.0.6 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 11.0.21 @@ -3765,13 +3768,13 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@push.rocks/consolecolor@2.0.2': + '@push.rocks/consolecolor@2.0.3': dependencies: ansi-256-colors: 1.1.0 '@push.rocks/early@4.0.4': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartpromise': 4.0.4 '@push.rocks/isohash@2.0.1': @@ -3979,7 +3982,7 @@ snapshots: '@push.rocks/smartlog-destination-local@9.0.2': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartpromise': 4.0.4 @@ -4037,7 +4040,7 @@ snapshots: '@push.rocks/smartnpm@2.0.4': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/levelcache': 3.0.8 '@push.rocks/smartarchive': 3.0.8 '@push.rocks/smartfile': 10.0.41 @@ -4242,7 +4245,7 @@ snapshots: '@push.rocks/tapbundle@5.3.0': dependencies: '@open-wc/testing': 4.0.0 - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/qenv': 6.0.5 '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index e91c443..ff5084e 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tspublish', - version: '1.9.1', + version: '1.10.0', description: 'A tool to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment.' } diff --git a/ts/classes.publishmodule.ts b/ts/classes.publishmodule.ts index a1bd046..e192533 100644 --- a/ts/classes.publishmodule.ts +++ b/ts/classes.publishmodule.ts @@ -1,6 +1,6 @@ import * as plugins from './plugins.js'; import * as paths from './paths.js'; -import { logger } from './logging.js'; +import { logger, logInfo, logSuccess, logWarn, logError, logBuild, logPublish, logOngoing, logStart, logDone } from './logging.js'; import { type ITsPublishJson } from './interfaces/index.js'; import type { TsPublish } from './classes.tspublish.js'; @@ -66,16 +66,15 @@ export class PublishModule { try { packageInfo = await smartnpmInstance.getPackageInfo(this.options.name); } catch (error) { - logger.log('warn', `package does not yet seem to exist. Proceeding in 10 seconds...`); + logWarn(`Package ${this.options.name} does not yet seem to exist. Proceeding in 10 seconds...`); await plugins.smartdelay.delayFor(10000); } if (packageInfo) { const availableVersions = packageInfo.allVersions.map((versionArg) => versionArg.version); - logger.log('info', `available versions are: ${availableVersions.toString()}`); + logInfo(`Available versions for ${this.options.name}: ${availableVersions.join(', ')}`); if (availableVersions.includes(this.options.version)) { - logger.log( - 'error', - `package ${this.options.name} already exists with version ${this.options.version}` + logError( + `Package ${this.options.name} already exists with version ${this.options.version}` ); process.exit(1); } @@ -162,6 +161,7 @@ export class PublishModule { } public async createPublishModuleDir() { + logOngoing(`Creating publish directory for ${this.options.name}`); this.options.publishModDirFullPath = plugins.path.join( this.options.monoRepoDir, `dist_publish_${this.options.packageSubFolder}` @@ -207,10 +207,12 @@ export class PublishModule { } public async build() { + logBuild(`Building ${this.options.name}...`); const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); await smartshellInstance.exec(`cd ${this.options.publishModDirFullPath} && pnpm run build`); + logSuccess(`Build completed for ${this.options.name}`); } public async createBinCliSetup() { @@ -229,6 +231,7 @@ export class PublishModule { } public async publish() { + logPublish(`Publishing ${this.options.name} v${this.options.version}...`); const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); @@ -242,5 +245,6 @@ export class PublishModule { } --no-git-checks --registry https://${registryUrl}` ); } + logSuccess(`Successfully published ${this.options.name} v${this.options.version}!`); } } diff --git a/ts/classes.tspublish.ts b/ts/classes.tspublish.ts index e107d56..22bafb9 100644 --- a/ts/classes.tspublish.ts +++ b/ts/classes.tspublish.ts @@ -1,4 +1,4 @@ -import { logger } from './logging.js'; +import { logger, logInfo, logSuccess, logWarn, logError, logHeader, logPackage, logProgress, logSeparator, logStart, logDone } from './logging.js'; import * as plugins from './plugins.js'; import * as interfaces from './interfaces/index.js'; @@ -15,24 +15,26 @@ export class TsPublish { } public async publish(monorepoDirArg: string) { + logHeader('TSPublish - Module Publisher'); const publishModules = await this.getModuleSubDirs(monorepoDirArg); - logger.log('info', `Found ${Object.keys(publishModules).length} publish modules:`); + logInfo(`Found ${Object.keys(publishModules).length} publish modules`); + logSeparator(); for (const publishModule of Object.keys(publishModules)) { - logger.log( - 'info', - `Publishing module: ${publishModule} -> ${publishModules[publishModule].name}` - ); + logPackage('Module found', `${publishModule} → ${publishModules[publishModule].name}`); } for (const publishModule of Object.keys(publishModules)) { // lets check wether there is a name if (!publishModules[publishModule].name) { - logger.log('warn', `no name found in tspublish.json for ${publishModule}. Skipping...`); + logWarn(`No name found in tspublish.json for ${publishModule}. Skipping...`); continue; } const publishModuleInstance = new PublishModule(this, { monoRepoDir: monorepoDirArg, packageSubFolder: publishModule, }); + const moduleCount = Object.keys(publishModules).indexOf(publishModule) + 1; + const totalCount = Object.keys(publishModules).length; + logProgress(moduleCount, totalCount, publishModules[publishModule].name || publishModule); await publishModuleInstance.init(); await publishModuleInstance.createPublishModuleDir(); await publishModuleInstance.build(); @@ -53,13 +55,13 @@ export class TsPublish { continue; } - logger.log('info', `found publish module: ${subDir}`); + logPackage('Found module', subDir); publishModules[subDir] = JSON.parse( plugins.smartfile.fs.toStringSync(plugins.path.join(subDir, 'tspublish.json')) ); } - logger.log('ok', `found ${Object.keys(publishModules).length} publish modules`); - logger.log('info', `Ordering publish modules...`); + logSuccess(`Found ${Object.keys(publishModules).length} publish modules`); + logInfo('Ordering publish modules...'); return publishModules; } diff --git a/ts/index.ts b/ts/index.ts index e296e02..214bfdc 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,10 +1,11 @@ import * as paths from './paths.js'; import { TsPublish } from './classes.tspublish.js'; +import { logStart } from './logging.js'; export * from './classes.tspublish.js'; export const runCli = async () => { - console.log('Starting tspublish...'); + logStart('tspublish'); const tspublish = new TsPublish(); await tspublish.publish(paths.cwd); }; diff --git a/ts/logging.ts b/ts/logging.ts index 10735ef..ef8a721 100644 --- a/ts/logging.ts +++ b/ts/logging.ts @@ -3,3 +3,102 @@ import * as commitinfo from './00_commitinfo_data.js'; export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo.commitinfo); logger.enableConsole(); + +// Color-coded log level indicators +const logIcons = { + info: plugins.consolecolor.coloredString('ℹ', 'cyan'), + success: plugins.consolecolor.coloredString('✓', 'green'), + warn: plugins.consolecolor.coloredString('⚠', 'orange'), + error: plugins.consolecolor.coloredString('✖', 'red'), + start: plugins.consolecolor.coloredString('▶', 'blue'), + done: plugins.consolecolor.coloredString('✔', 'green'), + package: plugins.consolecolor.coloredString('📦', 'blue'), + build: plugins.consolecolor.coloredString('🔨', 'cyan'), + publish: plugins.consolecolor.coloredString('🚀', 'green'), +}; + +// Helper function for info messages with color +export const logInfo = (message: string, data?: any) => { + const coloredMessage = `${logIcons.info} ${plugins.consolecolor.coloredString(message, 'cyan')}`; + logger.log('info', coloredMessage, data); +}; + +// Helper function for success messages +export const logSuccess = (message: string, data?: any) => { + const coloredMessage = `${logIcons.success} ${plugins.consolecolor.coloredString(message, 'green')}`; + logger.log('ok', coloredMessage, data); +}; + +// Helper function for warning messages +export const logWarn = (message: string, data?: any) => { + const coloredMessage = `${logIcons.warn} ${plugins.consolecolor.coloredString(message, 'orange')}`; + logger.log('warn', coloredMessage, data); +}; + +// Helper function for error messages +export const logError = (message: string, data?: any) => { + const coloredMessage = `${logIcons.error} ${plugins.consolecolor.coloredString(message, 'red')}`; + logger.log('error', coloredMessage, data); +}; + +// Helper function for start of operations +export const logStart = (operation: string) => { + const coloredMessage = `${logIcons.start} ${plugins.consolecolor.coloredString(`Starting ${operation}...`, 'blue')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for completion of operations +export const logDone = (operation: string) => { + const coloredMessage = `${logIcons.done} ${plugins.consolecolor.coloredString(`Completed ${operation}`, 'green')}`; + logger.log('ok', coloredMessage); +}; + +// Helper function for package-related messages +export const logPackage = (message: string, packageName: string) => { + const coloredMessage = `${logIcons.package} ${message}: ${plugins.consolecolor.coloredString(packageName, 'blue', 'white')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for build-related messages +export const logBuild = (message: string) => { + const coloredMessage = `${logIcons.build} ${plugins.consolecolor.coloredString(message, 'cyan')}`; + logger.log('info', coloredMessage); +}; + +// Helper function for publish-related messages +export const logPublish = (message: string) => { + const coloredMessage = `${logIcons.publish} ${plugins.consolecolor.coloredString(message, 'green')}`; + logger.log('info', coloredMessage); +}; + +// Create a visual separator for different phases +export const logSeparator = () => { + const separator = plugins.consolecolor.coloredString('━'.repeat(60), 'cyan'); + console.log(separator); +}; + +// Create a header for major sections +export const logHeader = (title: string) => { + logSeparator(); + const header = plugins.consolecolor.coloredString(` ${title.toUpperCase()} `, 'white', 'blue'); + console.log(header); + logSeparator(); +}; + +// Helper for indicating ongoing operations +export const logOngoing = (text: string) => { + const spinnerIcon = plugins.consolecolor.coloredString('⟳', 'cyan'); + const coloredMessage = `${spinnerIcon} ${plugins.consolecolor.coloredString(text, 'cyan')}`; + logger.log('info', coloredMessage); +}; + +// Progress indicator helper +export const logProgress = (current: number, total: number, item: string) => { + const percentage = Math.round((current / total) * 100); + const progressBar = '█'.repeat(Math.floor(percentage / 5)) + '░'.repeat(20 - Math.floor(percentage / 5)); + const coloredProgress = plugins.consolecolor.coloredString( + `[${progressBar}] ${percentage}% - ${item}`, + percentage === 100 ? 'green' : 'blue' + ); + logger.log('info', coloredProgress); +}; diff --git a/ts/plugins.ts b/ts/plugins.ts index de995af..0877775 100644 --- a/ts/plugins.ts +++ b/ts/plugins.ts @@ -3,6 +3,7 @@ import * as path from 'path'; export { path }; // @push.rocks scope +import * as consolecolor from '@push.rocks/consolecolor'; import * as smartfile from '@push.rocks/smartfile'; import * as smartcli from '@push.rocks/smartcli'; import * as smartdelay from '@push.rocks/smartdelay'; @@ -12,4 +13,4 @@ import * as smartpath from '@push.rocks/smartpath'; import * as smartrequest from '@push.rocks/smartrequest'; import * as smartshell from '@push.rocks/smartshell'; -export { smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell }; +export { consolecolor, smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };