Skip to content

Instantly share code, notes, and snippets.

@Markkop
Created July 30, 2024 18:16
Show Gist options
  • Select an option

  • Save Markkop/8172916763bea92cf1a562a6ce0c09c7 to your computer and use it in GitHub Desktop.

Select an option

Save Markkop/8172916763bea92cf1a562a6ce0c09c7 to your computer and use it in GitHub Desktop.
Create a index.js file for a react components folder
#!/bin/bash
generate_index() {
local dir="$1"
local index_file="$dir/index.js"
echo "Creating/clearing $index_file..."
echo "" > "$index_file"
declare -a component_names
declare -a file_names
declare -a default_exports
declare -a successful_imports
declare -a failed_imports
echo "Scanning for JavaScript files in $dir..."
for file in "$dir"/*.js; do
if [ -f "$file" ] && [ "$(basename "$file")" != "index.js" ]; then
# Use grep to find various export patterns
named_exports=$(grep -E '^export (async function|function|const) [A-Za-z][A-Za-z0-9]*' "$file" | sed -E 's/^export (async function|function|const) ([A-Za-z][A-Za-z0-9]*).*/\2/')
default_export=$(grep -E '^export default (async function|function|const)? ?[A-Za-z][A-Za-z0-9]*' "$file" | sed -E 's/^export default (async function|function|const)? ?([A-Za-z][A-Za-z0-9]*).*/\2/')
if [ ! -z "$named_exports" ] || [ ! -z "$default_export" ]; then
if [ ! -z "$named_exports" ]; then
components=$(echo "$named_exports" | paste -sd "," -)
component_names+=("$components")
fi
if [ ! -z "$default_export" ]; then
default_exports+=("$default_export")
fi
file_names+=("$(basename "${file%.*}")")
successful_imports+=("$(basename "$file")")
else
failed_imports+=("$(basename "$file")")
fi
fi
done
if [ ${#component_names[@]} -eq 0 ] && [ ${#default_exports[@]} -eq 0 ]; then
echo "No components found in $dir. Skipping index.js creation."
rm "$index_file"
return
fi
echo "Adding import statements to $index_file..."
for i in "${!file_names[@]}"; do
if [ ! -z "${component_names[$i]}" ]; then
IFS=',' read -ra ADDR <<< "${component_names[$i]}"
components_list=$(IFS=', '; echo "${ADDR[*]}")
echo "import { $components_list } from './${file_names[$i]}';" >> "$index_file"
fi
if [ ! -z "${default_exports[$i]}" ]; then
echo "import ${default_exports[$i]} from './${file_names[$i]}';" >> "$index_file"
fi
done
echo "" >> "$index_file"
echo "Adding export statement to $index_file..."
echo "export {" >> "$index_file"
for component in $(echo "${component_names[@]}" | tr ' ' '\n' | sort -u); do
echo " $component," >> "$index_file"
done
for default_export in "${default_exports[@]}"; do
echo " $default_export," >> "$index_file"
done
echo "}" >> "$index_file"
echo "Index file generated for $dir"
# Display summary
echo ""
echo "Summary for $dir:"
echo "--------"
echo "Successfully imported components:"
for file in "${successful_imports[@]}"; do
echo " - $file"
done
echo ""
echo "Files with no components found:"
for file in "${failed_imports[@]}"; do
echo " - $file"
done
echo ""
echo "Total successful imports: ${#successful_imports[@]}"
echo "Total failed imports: ${#failed_imports[@]}"
}
# Generate index.js for the root directory
generate_index "."
# Find all subdirectories and generate index.js for each
find . -type d -mindepth 1 | while read -r dir; do
if [ -n "$(find "$dir" -maxdepth 1 -name '*.js' -print -quit)" ]; then
generate_index "$dir"
fi
done
# Update root index.js to import from subdirectories
echo "" >> index.js
echo "// Imports from subdirectories" >> index.js
find . -type d -mindepth 1 | while read -r dir; do
if [ -f "$dir/index.js" ]; then
dir_name=$(basename "$dir")
echo "import * as ${dir_name} from './${dir_name}';" >> index.js
echo "export { ${dir_name} };" >> index.js
fi
done
echo "Script completed. All index.js files have been generated."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment