Created
January 15, 2024 10:33
-
-
Save roderik/c83efef5412b7bbd7d76329c02a28338 to your computer and use it in GitHub Desktop.
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
#!/bin/bash | |
## Configure all the nx, jest and tx config files for the libraries. | |
## The only thing you need to make sure of is to set the name correct in the package.json file | |
jq '.compilerOptions.paths = {}' tsconfig.base.json > temp.json && mv temp.json tsconfig.base.json | |
find ./libs -name "package.json" | while read pkg; do | |
pkg_name=$(jq -r '.name' "$pkg") | |
pkg_dir=$(dirname "$pkg") | |
jq --arg pkg_name "$pkg_name" --arg pkg_dir "$pkg_dir" '.compilerOptions.paths[$pkg_name] = [$pkg_dir + "/src/index.ts"]' tsconfig.base.json > temp.json && mv temp.json tsconfig.base.json | |
done | |
function relative_path_to_root { | |
local file_path=$1 | |
local depth=$(echo $file_path | grep -o "/" | wc -l) | |
local relative_path="" | |
for ((i=1; i<=depth-1; i++)); do | |
relative_path+="../" | |
done | |
echo "${relative_path}" | |
} | |
for dir in ./libs/shared/next ./libs/saas/next ./libs/onprem/next; do | |
find "$dir" -name "package.json" | while read pkg; do | |
rel_path=$(relative_path_to_root "$pkg") | |
project_name=$(jq -r '.name' "$pkg" | sed 's/@bpaas\///') | |
echo "Project name: $project_name" | |
project_dir=$(dirname "$pkg" | sed 's/^\.\///') | |
project_json_path="$project_dir/project.json" | |
tags=("type:library") | |
if [[ $project_name == *"shared"* ]]; then | |
tags+=("scope:next-shared") | |
elif [[ $project_name == *"saas"* ]]; then | |
tags+=("scope:next-saas") | |
elif [[ $project_name == *"onprem"* ]]; then | |
tags+=("scope:next-onprem") | |
fi | |
cat << EOF > "$project_json_path" | |
{ | |
"name": "$project_name", | |
"\$schema": "${rel_path}node_modules/nx/schemas/project-schema.json", | |
"sourceRoot": "$project_dir/src", | |
"projectType": "library", | |
"targets": { | |
"lint": { | |
"executor": "@nx/eslint:lint", | |
"outputs": ["{options.outputFile}"], | |
"defaultConfiguration": "production", | |
"configurations": { | |
"production": { | |
"eslintConfig": "{projectRoot}/.eslintrc.ci.json", | |
"hasTypeAwareRules": true | |
}, | |
"development": { | |
"eslintConfig": "{projectRoot}/.eslintrc.json", | |
"hasTypeAwareRules": false, | |
"fix": true, | |
"quiet": true | |
} | |
} | |
}, | |
"test": { | |
"executor": "@nx/jest:jest", | |
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], | |
"options": { | |
"jestConfig": "{projectRoot}/jest.config.ts", | |
"forceExit": true, | |
}, | |
"defaultConfiguration": "production", | |
"configurations": { | |
"production": { | |
"runInBand": true | |
}, | |
"development": { | |
"maxWorkers": 6, | |
} | |
} | |
}, | |
"check-circular": { | |
"executor": "nx:run-commands", | |
"inputs": ["{projectRoot}/**/*.ts"], | |
"options": { | |
"command": "pnpm madge --ts-config {projectRoot}/tsconfig.json --circular --extensions ts {projectRoot} --include-npm --no-spinner || true" | |
} | |
}, | |
"build": { | |
"executor": "@nx/rollup:rollup", | |
"outputs": ["{options.outputPath}"], | |
"options": { | |
"outputPath": "dist/{projectRoot}", | |
"tsConfig": "{projectRoot}/tsconfig.lib.json", | |
"project": "{projectRoot}/package.json", | |
"entryFile": "{projectRoot}/src/index.ts", | |
"external": "all", | |
"rollupConfig": "@nx/react/plugins/bundle-rollup", | |
"compiler": "swc", | |
"assets": [ | |
{ | |
"glob": "{projectRoot}/README.md", | |
"input": ".", | |
"output": "." | |
} | |
] | |
}, | |
} | |
}, | |
"tags": $(printf '%s\n' "${tags[@]}" | jq -R . | jq -s -c .) | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.json" | |
{ | |
"compilerOptions": { | |
"jsx": "react-jsx", | |
"allowJs": false, | |
"esModuleInterop": false, | |
"allowSyntheticDefaultImports": true, | |
"strict": true | |
}, | |
"files": [], | |
"include": [], | |
"references": [ | |
{ | |
"path": "./tsconfig.lib.json" | |
}, | |
{ | |
"path": "./tsconfig.spec.json" | |
} | |
], | |
"extends": "${rel_path}tsconfig.base.json" | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.lib.json" | |
{ | |
"extends": "./tsconfig.json", | |
"compilerOptions": { | |
"outDir": "${rel_path}dist/out-tsc", | |
"types": [ | |
"node", | |
"@nx/react/typings/cssmodule.d.ts", | |
"@nx/react/typings/image.d.ts", | |
"next", | |
"@nx/next/typings/image.d.ts" | |
] | |
}, | |
"exclude": [ | |
"jest.config.ts", | |
"src/**/*.spec.ts", | |
"src/**/*.test.ts", | |
"src/**/*.spec.tsx", | |
"src/**/*.test.tsx", | |
"src/**/*.spec.js", | |
"src/**/*.test.js", | |
"src/**/*.spec.jsx", | |
"src/**/*.test.jsx" | |
], | |
"include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.spec.json" | |
{ | |
"extends": "./tsconfig.json", | |
"compilerOptions": { | |
"outDir": "${rel_path}dist/out-tsc", | |
"module": "commonjs", | |
"types": [ | |
"node", | |
"@nx/react/typings/cssmodule.d.ts", | |
"@nx/react/typings/image.d.ts", | |
"next", | |
"@nx/next/typings/image.d.ts", | |
"jest" | |
] | |
}, | |
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx","src/**/*.d.ts"] | |
} | |
EOF | |
rm -Rf "$project_dir/.swcrc" | |
cat << EOF > "$project_dir/.eslintrc.json" | |
{ | |
"extends": ["${rel_path}.eslintrc.json"], | |
"ignorePatterns": ["!**/*"], | |
"overrides": [ | |
{ | |
"files": ["*.ts", "*.tsx"], | |
"rules": {} | |
} | |
] | |
} | |
EOF | |
cat << EOF > "$project_dir/.eslintrc.ci.json" | |
{ | |
"extends": ["${rel_path}.eslintrc.ci.json"], | |
"ignorePatterns": ["!**/*"], | |
"overrides": [ | |
{ | |
"files": ["*.ts", "*.tsx"], | |
"rules": {}, | |
"parserOptions": { | |
"project": ["$project_dir/tsconfig.*?.json"] | |
} | |
} | |
] | |
} | |
EOF | |
cat << EOF > "$project_dir/jest.config.ts" | |
/* eslint-disable */ | |
export default { | |
displayName: '$project_name', | |
preset: '${rel_path}jest.preset.ts', | |
transform: { | |
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }], | |
}, | |
testEnvironment: 'jsdom', | |
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], | |
coverageDirectory: '${rel_path}coverage/$project_dir', | |
transformIgnorePatterns: ['node_modules/.pnpm/(?!@amcharts|wagmi|crypto-hash|d3-|@wagmi|internmap|@rainbow-me)'], | |
}; | |
EOF | |
done | |
done | |
find ./libs/shared/nest -name "package.json" | grep -v "docker-image-versions" | while read pkg; do | |
rel_path=$(relative_path_to_root "$pkg") | |
project_name=$(jq -r '.name' "$pkg" | sed 's/@bpaas\///') | |
echo "Project name: $project_name" | |
project_dir=$(dirname "$pkg" | sed 's/^\.\///') | |
project_json_path="$project_dir/project.json" | |
tags=("type:library") | |
if [[ $project_name == *"api"* ]]; then | |
tags+=("scope:nest-api") | |
elif [[ $project_name == *"database"* ]]; then | |
tags+=("scope:nest-database") | |
elif [[ $project_name == *"processor"* ]]; then | |
tags+=("scope:nest-processor") | |
elif [[ $project_name == *"deploy-worker"* ]]; then | |
tags+=("scope:nest-deploy-worker") | |
elif [[ $project_name == *"jobs"* ]]; then | |
tags+=("scope:nest-jobs") | |
elif [[ $project_name == *"singleton"* ]]; then | |
tags+=("scope:nest-singleton") | |
else | |
tags+=("scope:nest-common") | |
fi | |
cat << EOF > "$project_json_path" | |
{ | |
"name": "$project_name", | |
"\$schema": "${rel_path}node_modules/nx/schemas/project-schema.json", | |
"sourceRoot": "$project_dir/src", | |
"projectType": "library", | |
"targets": { | |
"lint": { | |
"executor": "@nx/eslint:lint", | |
"outputs": ["{options.outputFile}"], | |
"defaultConfiguration": "production", | |
"configurations": { | |
"production": { | |
"eslintConfig": "{projectRoot}/.eslintrc.ci.json", | |
"hasTypeAwareRules": true | |
}, | |
"development": { | |
"eslintConfig": "{projectRoot}/.eslintrc.json", | |
"hasTypeAwareRules": false, | |
"fix": true, | |
"quiet": true | |
} | |
} | |
}, | |
"test": { | |
"executor": "@nx/jest:jest", | |
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], | |
"options": { | |
"jestConfig": "{projectRoot}/jest.config.ts", | |
"forceExit": true, | |
}, | |
"defaultConfiguration": "production", | |
"configurations": { | |
"production": { | |
"runInBand": true | |
}, | |
"development": { | |
"maxWorkers": 6, | |
} | |
} | |
}, | |
"check-circular": { | |
"executor": "nx:run-commands", | |
"inputs": ["{projectRoot}/**/*.ts"], | |
"options": { | |
"command": "pnpm madge --ts-config {projectRoot}/tsconfig.json --circular --extensions ts {projectRoot} --include-npm --no-spinner" | |
} | |
}, | |
"build": { | |
"executor": "@nx/js:tsc", | |
"outputs": ["{options.outputPath}"], | |
"options": { | |
"clean": false, | |
"outputPath": "dist/{projectRoot}", | |
"tsConfig": "{projectRoot}/tsconfig.lib.json", | |
"packageJson": "{projectRoot}/package.json", | |
"main": "{projectRoot}/src/index.ts", | |
"assets": [ | |
"{projectRoot}/*.md", | |
"{projectRoot}/src/*.json", | |
"{projectRoot}/src/**/*.json" | |
] | |
} | |
} | |
}, | |
"tags": $(printf '%s\n' "${tags[@]}" | jq -R . | jq -s -c .) | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.json" | |
{ | |
"extends": "${rel_path}tsconfig.base.json", | |
"compilerOptions": {}, | |
"files": [], | |
"include": [], | |
"references": [ | |
{ | |
"path": "./tsconfig.lib.json" | |
}, | |
{ | |
"path": "./tsconfig.spec.json" | |
} | |
] | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.lib.json" | |
{ | |
"extends": "./tsconfig.json", | |
"compilerOptions": { | |
"outDir": "${rel_path}dist/out-tsc", | |
"declaration": true, | |
"types": ["node"], | |
"target": "es2021" | |
}, | |
"include": ["src/**/*.ts"], | |
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] | |
} | |
EOF | |
cat << EOF > "$project_dir/tsconfig.spec.json" | |
{ | |
"extends": "./tsconfig.json", | |
"compilerOptions": { | |
"outDir": "${rel_path}dist/out-tsc", | |
"module": "commonjs", | |
"types": ["jest", "node"] | |
}, | |
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] | |
} | |
EOF | |
cat << EOF > "$project_dir/package.json" | |
{ | |
"name": "@bpaas/$project_name", | |
"version": "0.0.1", | |
"dependencies": { | |
"tslib": "2.6.2" | |
}, | |
"type": "module", | |
"main": "./src/index.js", | |
"typings": "./src/index.d.ts" | |
} | |
EOF | |
cat << EOF > "$project_dir/jest.config.ts" | |
/* eslint-disable */ | |
export default { | |
displayName: '$project_name', | |
preset: '${rel_path}jest.preset.ts', | |
testEnvironment: 'node', | |
transform: { | |
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }], | |
}, | |
moduleFileExtensions: ['ts', 'js', 'html', 'json'], | |
coverageDirectory: '${rel_path}coverage/$project_dir', | |
}; | |
EOF | |
rm -Rf "$project_dir/.swcrc" | |
cat << EOF > "$project_dir/.eslintrc.json" | |
{ | |
"extends": ["${rel_path}.eslintrc.json"], | |
"ignorePatterns": ["!**/*"], | |
"overrides": [ | |
{ | |
"files": ["*.ts", "*.tsx"], | |
"rules": {} | |
} | |
] | |
} | |
EOF | |
cat << EOF > "$project_dir/.eslintrc.ci.json" | |
{ | |
"extends": ["${rel_path}.eslintrc.ci.json"], | |
"ignorePatterns": ["!**/*"], | |
"overrides": [ | |
{ | |
"files": ["*.ts"], | |
"extends": ["plugin:@darraghor/nestjs-typed/recommended", "plugin:@darraghor/nestjs-typed/no-swagger"], | |
"plugins": ["@darraghor/nestjs-typed"], | |
"rules": { | |
'@darraghor/nestjs-typed/injectable-should-be-provided': [ | |
'error', | |
{ | |
src: ['$project_dir/src/**/*.ts'], | |
filterFromPaths: ['node_modules', '.test.', '.spec.', 'jest.config.ts', 'tsconfig.spec.json', 'tsconfig.scripts.json'], | |
}, | |
], | |
}, | |
"parserOptions": { | |
"project": ["$project_dir/tsconfig.*?.json"] | |
} | |
} | |
] | |
} | |
EOF | |
done | |
# Directories to start the search from | |
dirs=("apps" "libs") | |
# Loop over directories | |
for dir in ${dirs[@]}; do | |
# Recursively find all project.json files in the directory | |
find "$dir" -name "project.json" | while read project; do | |
# Derive the project directory | |
project_dir=$(dirname "$project") | |
# Check if there are any spec files in the directory or its subdirectories | |
if ! find "$project_dir" -name "*.spec.ts" -o -name "*.spec.tsx" | grep -q .; then | |
# Rename test to xtest in project.json if test is present | |
sed -i '' 's/"test"/"xtest"/g' "$project" | |
else | |
# If spec files exist and the task is xtest, rename xtest back to test | |
sed -i '' 's/"xtest"/"test"/g' "$project" | |
fi | |
done | |
done | |
pnpm nx format:write |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment