-
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add global config support and cross-platform enhancements #45
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Introduced `YTMP3_HOMEDIR` constant to standardize the home directory path across the utility functions. - Refactored `LOGDIR` to utilize the new `YTMP3_HOMEDIR` constant for better maintainability. - Improved the `isObject` function to strictly check for non-null objects while ensuring compatibility with objects created from null prototypes. - Added a new `isPlainObject` function to specifically identify plain objects (`{}`) with an `Object` prototype. - Implemented a `getType` utility function to return a detailed string representation of the type for given values. - Updated module exports to include the new utilities (`YTMP3_HOMEDIR`, `isPlainObject`, and `getType`).
- Added `InvalidTypeError` class to handle cases where values do not match expected types. Includes additional properties for `actualType`, `expectedType`, and `cause`, which provide more context for type-related errors. - Added `GlobalConfigParserError` class to handle errors related to invalid or unprocessable configuration files. It includes properties such as `errno`, `code`, `syscall`, and `path` to offer detailed information about the underlying error. - Both new error classes extend the base `Error` class and utilize the `isPlainObject` utility function to validate options. - Updated module exports to include the new error classes alongside the existing ones.
- Updated `KNOWN_CONFIG_EXTS` to include new `.config` variants for configuration files, marking older extensions as deprecated. These deprecated extensions (`.js`, `.mjs`, `.cjs`) will be removed in the next major update. - Modified `parseConfig` function to handle the new configuration file extensions and adjusted logic for resolving and importing configuration files. Improved error message formatting to list supported extensions more clearly. - Updated JSDoc comments to reflect changes in configuration extensions. Deprecation Note: The following extensions are now deprecated and will be removed in the next major version: `.js`, `.mjs`, `.cjs`. Please transition to using `.config.js`, `.config.mjs`, or `.config.cjs` for future compatibility.
- Added a JSDoc for `YTMP3_HOMEDIR` constant - Improve the JSDoc of other constants
- Replaced `TypeError` with `InvalidTypeError` in `configChecker` and `parseConfig` functions for better error specificity when invalid types are encountered. - Enhanced `configChecker` to include `actualType` and `expectedType` in error details when an invalid configuration object is detected. - Exported `KNOWN_OPTIONS`, `KNOWN_CONFIG_EXTS`, and `ERR_FORMAT` constants for improved modularity and testing purposes. - Updated JSDoc to reflect the change from `TypeError` to `InvalidTypeError`. - Improved JSDoc examples for configuration files by specifying the expected filenames (e.g., `ytmp3-js.config.cjs`).
…arch - Introduced `findGlobalConfig()` to locate the most appropriate global configuration file in the user's home directory. - Added `parseGlobalConfig()` to validate and parse the global configuration file, with optional parser settings. - Integrated the `lsfnd` npm package to assist in locating configuration files. - Updated JSDoc comments to document the new functionality.
- Separated the main index file to create a distinct entry point for API-related functionality. - Introduced a new module called `bin/cli.js` specifically designed to handle command-line interface (CLI) operations. - Moved command line arguments parser functionality to a module called `argparser` in "bin" directory.
- Adjusted the `bin` field in `package.json` to use `./bin/cli.js` instead of `./index.js` for the `ytmp3` command.
- Added the "bin" directory to `include` field in `eslint.config.js` file - Added the "bin" directory to `ignores` field in `eslint.config.test.js` file
Now it uses `utils.isPlainObject` instead `utils.isObject` to check a plain object
- Replaced instances of `TypeError` with `InvalidTypeError` in the `config` module test suite. - Adjusted test descriptions to align with the updated error handling in the `config` module. - Ensured that `InvalidTypeError` is correctly imported and used in assertions for better type validation.
- Added new test cases for `isObject` to ensure it returns `true` for non-array objects and objects with null prototypes. - Introduced a separate test suite for `isPlainObject` to validate that it correctly identifies plain objects, including those with null prototypes. - Updated test assertions for better clarity and accuracy.
- Updated `argparser.js` to suppress default values for options when not provided, ensuring cleaner output and reducing unnecessary clutter in the parsed arguments. - Switched to `parse_intermixed_args()` to support intermixed positional and optional arguments, improving usability and flexibility in the command-line interface. This change enhances the overall argument parsing behavior, making the CLI tool more intuitive and user-friendly.
- Introduced a new `--noConfig` (`--no-config`) CLI option, allowing users to disable the loading of global or specified configuration files. - Updated the `filterOptions` function to respect the `--no-config` flag, preventing the merging of global configuration with command-line options when this flag is set. - Enhanced the global configuration parsing logic to conditionally apply settings only when `--no-config` is not specified. - Improved overall flexibility by allowing users to opt out of configuration file overrides, ensuring more precise control over the CLI's behavior.
- Added the ability to inverse the behavior of enabled options by using `BooleanOptionalAction` in `argparse`. - Updated `--convertAudio` and `--deleteOld` options to use `BooleanOptionalAction`, allowing users to disable these options by using their inverse form (e.g., `--no-convertAudio` or `--no-deleteOld`). - Introduced a new `--noQuiet` option to reset the `quiet` level, enabling suppressed output messages even when `quiet` is enabled.
- Added `searchDir` parameter to `findGlobalConfig` function, allowing the search directory for the global configuration file to be specified. Defaults to `utils.YTMP3_HOMEDIR`. - Implemented directory existence and type checks to ensure the specified `searchDir` is a valid directory. - Updated the function to return `null` if the `searchDir` does not exist or is not a directory, enhancing error handling and flexibility in configuration management.
* Added new test suites for new functions (`findGlobalConfig` and `parseGlobalConfig`) that search and parse the known global configuration file of YTMP3-JS. * Added new 3 test cases for `parseConfig` function. * Several improvements to other test suites and code coverage.
Refactored the `parseConfig` function to properly handle path resolution across different platforms. This change ensures that paths are correctly resolved on both Windows and POSIX systems by replacing incorrect path separators and using platform-specific logic. - On Windows, '/' is replaced with the appropriate Windows separator. - On POSIX systems, '\' is replaced with the appropriate POSIX separator. - Applied `path.resolve` to ensure the paths are absolute. This change enhances cross-platform compatibility and resolves issues related to incorrect path handling in configuration file imports.
mitsuki31
added
refactor
Refactor and enhancement changes
feature
Bring new features
minor
Minor changes
labels
Sep 4, 2024
* Added homepage and GitHub repo link to the epilog of CLI documentation.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
This pull request introduces significant enhancements to the YTMP3-JS module, focusing on adding support for global configuration files and ensuring consistent cross-platform behavior. The changes involve refactoring existing utilities, improving error handling, expanding test coverage, and enhancing the command-line interface (CLI). Additionally, the PR includes fixes for path resolution issues on Windows and POSIX platforms, making the module more robust and user-friendly.
Detailed Description
Global Configuration Support
findGlobalConfig()
: A new function was introduced to locate the global configuration file, with an addedsearchDir
parameter that allows specifying a custom directory for the search.parseGlobalConfig()
: A corresponding parser function for validating and importing the global configuration file.lsfnd
npm package to assist in locating configuration files within the specified directory.Error Handling Enhancements
InvalidTypeError
andGlobalConfigParserError
classes were added to provide more specific error messages and detailed context for errors related to invalid types and configuration parsing.Cross-Platform Path Resolution
parseConfig
function was refactored to correctly handle path separators and resolution across both Windows and POSIX platforms, ensuring paths are properly interpreted regardless of the operating system.Refactorings and Improvements
isObject
,isPlainObject
) and the introduction of thegetType
utility.--no-convertAudio
).--no-config
.--no-config
is not specified..config
variants for future use.Testing Enhancements
Deprecated Features
This pull request introduces some deprecations that users should be aware of:
Deprecated Configuration File Extensions
.js
.mjs
.cjs
.config.js
,.config.mjs
, or.config.cjs
extensions to ensure future compatibility.Summary
This update introduces several enhancements to command-line usage, including support for global configuration, the ability to invert enabled options, and the addition of new command-line options.
How to Set Up Global Configuration?
The home directory for
ytmp3
is typically located relative to the user's home directory, specifically in a directory named".ytmp3-js"
. This equates to"$HOME/.ytmp3-js"
on POSIX systems and"%USERPROFILE%\.ytmp3-js"
on Windows.To set up global configuration, simply create a YTMP3-JS configuration file in this directory. The system supports both CommonJS and EcmaScript Module formats, and also JSON format.
Note
Please note, the system parser will only detect the global configuration named
ytmp3-js.*
, otherwise nothing will be parsed.Once configured, you can verify your global configuration by running the following command:
If you prefer not to use any configuration files -- whether global or specified by the
--config
option -- you can disable them easily with the--no-config
flag:Important
Please note that the
.js
,.mjs
, and.cjs
file extensions for configuration files are deprecated and will be removed in the next major update. To ensure future compatibility, use.config.js
,.config.mjs
, or.config.cjs
instead.This deprecation does not affect configuration files with the
.json
extension.By consolidating and enhancing the project's capabilities, this update aims to provide more robust and flexible configuration management, improved error handling, and better cross-platform support.