Transition to eslint-config-airbnb-with-typescript
- Migrate to newer `eslint-config-airbnb-with-typescript` from `eslint-config-airbnb`. - Add also `rushstack/eslint-patch` as per instructed by `eslint-config-airbnb-with-typescript` docs. - Update codebase to align with new linting standards. - Add script to configure VS Code for effective linting for project developers, move it to `scripts` directory along with clean npm install script for better organization.
This commit is contained in:
74
scripts/configure-vscode.sh
Executable file
74
scripts/configure-vscode.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script ensures that the '.vscode/settings.json' file exists and is configured correctly for ESLint validation on Vue and JavaScript files.
|
||||
# See https://web.archive.org/web/20230801024405/https://eslint.vuejs.org/user-guide/#visual-studio-code
|
||||
|
||||
declare -r SETTINGS_FILE='.vscode/settings.json'
|
||||
declare -ra CONFIG_KEYS=('vue' 'javascript' 'typescript')
|
||||
declare -r TEMP_FILE="tmp.$$.json"
|
||||
|
||||
main() {
|
||||
ensure_vscode_directory_exists
|
||||
create_or_update_settings
|
||||
}
|
||||
|
||||
ensure_vscode_directory_exists() {
|
||||
local dir_name
|
||||
dir_name=$(dirname "${SETTINGS_FILE}")
|
||||
if [[ ! -d ${dir_name} ]]; then
|
||||
mkdir -p "${dir_name}"
|
||||
echo "🎉 Created directory: ${dir_name}"
|
||||
fi
|
||||
}
|
||||
|
||||
create_or_update_settings() {
|
||||
if [[ ! -f ${SETTINGS_FILE} ]]; then
|
||||
create_default_settings
|
||||
else
|
||||
add_or_update_eslint_validate
|
||||
fi
|
||||
}
|
||||
|
||||
create_default_settings() {
|
||||
local default_validate
|
||||
default_validate=$(printf '%s' "${CONFIG_KEYS[*]}" | jq -R -s -c -M 'split(" ")')
|
||||
echo "{ \"eslint.validate\": ${default_validate} }" | jq '.' > "${SETTINGS_FILE}"
|
||||
echo "🎉 Created default ${SETTINGS_FILE}"
|
||||
}
|
||||
|
||||
add_or_update_eslint_validate() {
|
||||
if ! jq -e '.["eslint.validate"]' "${SETTINGS_FILE}" >/dev/null; then
|
||||
add_default_eslint_validate
|
||||
else
|
||||
update_eslint_validate
|
||||
fi
|
||||
}
|
||||
|
||||
add_default_eslint_validate() {
|
||||
jq --argjson keys "$(printf '%s' "${CONFIG_KEYS[*]}" \
|
||||
| jq -R -s -c 'split(" ")')" '. += {"eslint.validate": $keys}' "${SETTINGS_FILE}" > "${TEMP_FILE}"
|
||||
replace_and_confirm
|
||||
echo "🎉 Added default 'eslint.validate' to ${SETTINGS_FILE}"
|
||||
}
|
||||
|
||||
update_eslint_validate() {
|
||||
local existing_keys
|
||||
existing_keys=$(jq '.["eslint.validate"]' "${SETTINGS_FILE}")
|
||||
for key in "${CONFIG_KEYS[@]}"; do
|
||||
if ! echo "${existing_keys}" | jq 'index("'"${key}"'")' >/dev/null; then
|
||||
jq '.["eslint.validate"] += ["'"${key}"'"]' "${SETTINGS_FILE}" > "${TEMP_FILE}"
|
||||
mv "${TEMP_FILE}" "${SETTINGS_FILE}"
|
||||
echo "🎉 Updated 'eslint.validate' in ${SETTINGS_FILE} for ${key}"
|
||||
else
|
||||
echo "⏩️ No updated needed for ${key} ${SETTINGS_FILE}."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
replace_and_confirm() {
|
||||
if mv "${TEMP_FILE}" "${SETTINGS_FILE}"; then
|
||||
echo "🎉 Updated ${SETTINGS_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
95
scripts/fresh-npm-install.sh
Executable file
95
scripts/fresh-npm-install.sh
Executable file
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Description:
|
||||
# This script ensures npm is available, removes existing node modules, optionally
|
||||
# removes package-lock.json (when -n flag is used), installs dependencies and runs unit tests.
|
||||
# Usage:
|
||||
# ./fresh-npm-install.sh # Regular execution
|
||||
# ./fresh-npm-install.sh -n # Non-deterministic mode (removes package-lock.json)
|
||||
|
||||
declare NON_DETERMINISTIC_FLAG=0
|
||||
|
||||
|
||||
main() {
|
||||
parse_args "$@"
|
||||
ensure_npm_is_available
|
||||
ensure_npm_root
|
||||
remove_existing_modules
|
||||
if [[ $NON_DETERMINISTIC_FLAG -eq 1 ]]; then
|
||||
remove_package_lock_json
|
||||
fi
|
||||
install_dependencies
|
||||
run_unit_tests
|
||||
}
|
||||
|
||||
ensure_npm_is_available() {
|
||||
if ! command -v npm &> /dev/null; then
|
||||
log::fatal 'npm could not be found, please install it first.'
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_npm_root() {
|
||||
if [ ! -f package.json ]; then
|
||||
log::fatal 'Current directory is not a npm root. Please run the script in a npm root directory.'
|
||||
fi
|
||||
}
|
||||
|
||||
remove_existing_modules() {
|
||||
if [ -d ./node_modules ]; then
|
||||
log::info 'Removing existing node modules...'
|
||||
if ! rm -rf ./node_modules; then
|
||||
log::fatal 'Could not remove existing node modules.'
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
install_dependencies() {
|
||||
log::info 'Installing dependencies...'
|
||||
if ! npm install; then
|
||||
log::fatal 'Failed to install dependencies.'
|
||||
fi
|
||||
}
|
||||
|
||||
remove_package_lock_json() {
|
||||
if [ -f ./package-lock.json ]; then
|
||||
log::info 'Removing package-lock.json...'
|
||||
if ! rm -rf ./package-lock.json; then
|
||||
log::fatal 'Could not remove package-lock.json.'
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
run_unit_tests() {
|
||||
log::info 'Running unit tests...'
|
||||
if ! npm run test:unit; then
|
||||
pwd
|
||||
log::fatal 'Failed to run unit tests.'
|
||||
fi
|
||||
}
|
||||
|
||||
log::info() {
|
||||
local -r message="$1"
|
||||
echo "📣 ${message}"
|
||||
}
|
||||
|
||||
log::fatal() {
|
||||
local -r message="$1"
|
||||
echo "❌ ${message}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
parse_args() {
|
||||
while getopts "n" opt; do
|
||||
case ${opt} in
|
||||
n)
|
||||
NON_DETERMINISTIC_FLAG=1
|
||||
;;
|
||||
\?)
|
||||
echo "Invalid option: $OPTARG" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
main "$1"
|
||||
Reference in New Issue
Block a user