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