Created
January 15, 2024 10:33
-
-
Save roderik/c83efef5412b7bbd7d76329c02a28338 to your computer and use it in GitHub Desktop.
This file contains hidden or 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