install.fairie/docs/scripts/after/run_onchange_after_26-system-vscode-node-modules.sh.tmpl.md
2023-08-08 03:06:49 -04:00

7 KiB

title description sidebar_label slug githubLocation scriptLocation repoLocation
Global NPM Modules Fallback Installs NPM packages to the system `/` directory as a catch-all for tools that recursively search upwards for shared NPM configurations. 26 Global NPM Modules Fallback /scripts/after/run_onchange_after_26-system-vscode-node-modules.sh.tmpl https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoiscripts/universal/run_onchange_after_26-system-vscode-node-modules.sh.tmpl https://github.com/megabyte-labs/install.doctor/raw/master/home/.chezmoiscripts/universal/run_onchange_after_26-system-vscode-node-modules.sh.tmpl home/.chezmoiscripts/universal/run_onchange_after_26-system-vscode-node-modules.sh.tmpl

Global NPM Modules Fallback

Installs NPM packages to the system / directory as a catch-all for tools that recursively search upwards for shared NPM configurations.

Overview

This script makes fallback linter and code auto-fixer configurations globally available. Normally, configurations, like the ones used for ESLint, are installed at the project level by specifying the NPM package configuration in the package.json file (or via an .eslintrc file). However, whenever no configuration is present, IDEs like Visual Studio Code will recursively search upwards in the directory tree, trying to find an ESLint configuration.

This script addresses this issue by installing a set of shared NPM packages that enhance the functionality of tools like ESLint by placing a package.json with all the necessary settings into the highest directory possible and then installing the package's modules. This normally results in a package.json file and node_modules/ folder at the root of the system.

NPM Packages Included

To reduce clutter, all the configurations are mapped out in the package.json file. Our default package.json file includes the following configuration:

<!-- AUTO-GENERATED:START (REMOTE:url=https://gitlab.com/megabyte-labs/install.doctor/-/raw/master/home/dot_config/Code/User/package.json) -->
{
...
// Notable dependencies listed below
"dependencies": {
"eslint-config-strictlint": "latest",
"jest-preset-ts": "latest",
"prettier-config-strictlint": "latest",
"remark-preset-strictlint": "latest",
"stylelint-config-strictlint": "latest"
},
...
}
<!-- AUTO-GENERATED:END -->

Strict Lint

More details on the shared configurations can be found at StrictLint.com. Strict Lint is another brand maintained by Megabyte Labs that is home to many of the well-crafted shared configurations that are included in our default NPM configuration fallback settings.

Notes

  • If the system root directory is not writable (even with sudo), then the shared modules are installed to the provisioning user's $HOME directory

Source Code

{{- if (ne .host.distro.family "windows") -}}
#!/usr/bin/env bash
# @file Global NPM Modules Fallback
# @brief Installs NPM packages to the system `/` directory as a catch-all for tools that recursively search upwards for shared NPM configurations.
# @description
#     This script makes fallback linter and code auto-fixer configurations globally available. Normally, configurations, like
#     the ones used for ESLint, are installed at the project level by specifying the NPM package configuration
#     in the `package.json` file (or via an `.eslintrc` file). However, whenever no configuration is present, IDEs like
#     Visual Studio Code will recursively search upwards in the directory tree, trying to find an ESLint configuration.
#
#     This script addresses this issue by installing a set of shared NPM packages that enhance the functionality of tools like ESLint
#     by placing a `package.json` with all the necessary settings into the highest directory possible and then installing the package's
#     modules. This normally results in a `package.json` file and `node_modules/` folder at the root of the system.
#
#     ## NPM Packages Included
#
#     To reduce clutter, all the configurations are mapped out in the `package.json` file. Our default `package.json` file includes
#     the following configuration:
#
#     ```json
#     <!-- AUTO-GENERATED:START (REMOTE:url=https://gitlab.com/megabyte-labs/install.doctor/-/raw/master/home/dot_config/Code/User/package.json) -->
#     {
#       ...
#       // Notable dependencies listed below
#       "dependencies": {
#         "eslint-config-strictlint": "latest",
#         "jest-preset-ts": "latest",
#         "prettier-config-strictlint": "latest",
#         "remark-preset-strictlint": "latest",
#         "stylelint-config-strictlint": "latest"
#       },
#       ...
#     }
#     <!-- AUTO-GENERATED:END -->
#     ```
#
#     ## Strict Lint
#
#     More details on the shared configurations can be found at [StrictLint.com](https://strictlint.com).
#     Strict Lint is another brand maintained by Megabyte Labs that is home to many of the well-crafted
#     shared configurations that are included in our default NPM configuration fallback settings.
#
#     ## Notes
#
#     * If the system root directory is not writable (even with `sudo`), then the shared modules are installed to the provisioning user's `$HOME` directory
#
#     ## Links
#
#     * [`package.json` configuration file](https://github.com/megabyte-labs/install.doctor/blob/master/home/dot_config/Code/User/package.json)
#     * [StrictLint.com documentation](https://strictlint.com/docs)

{{ includeTemplate "universal/profile" }}
{{ includeTemplate "universal/logg" }}

if command -v code > /dev/null && command -v pnpm > /dev/null && [ -f "${XDG_DATA_HOME:-$HOME/.local/share}/vscode/package.json" ]; then
    ### Install linter fallback node_modules / package.json to system or home directory
    if sudo cp -f "${XDG_DATA_HOME:-$HOME/.local/share}/vscode/package.json" /package.json; then
        logg info 'Successfully copied linter fallback configurations package.json to /package.json'
        logg info 'Installing system root directory node_modules'
        cd / && sudo pnpm i --no-lockfile || EXIT_CODE=$?
    else
        logg warn 'Unable to successfully copy linter fallback configurations package.json to /package.json'
        logg info 'Installing linter fallback configurations node_modules to home directory instead'
        cp -f "${XDG_DATA_HOME:-$HOME/.local/share}/vscode/package.json" "$HOME/package.json"
        cd ~ && pnpm i --no-lockfile || EXIT_CODE=$?
    fi

    ### Log message if install failed
    if [ -n "$EXIT_CODE" ]; then
        logg warn 'Possible error(s) were detected while installing linter fallback configurations to the home directory.'
    else
        logg success 'Installed linter fallback configuration node_modules'
    fi
else
    logg info 'Skipping installation of fallback linter configurations because one or more of the dependencies is missing.'
fi

{{ end -}}