diff --git a/src/lib/application/application.factory.test.ts b/src/lib/application/application.factory.test.ts index a5f571842..bbb6d8b46 100644 --- a/src/lib/application/application.factory.test.ts +++ b/src/lib/application/application.factory.test.ts @@ -455,6 +455,91 @@ describe('Application Factory', () => { ].sort(), ); }); + it('should skip testing files and package entries', async () => { + const options = { + name: 'project', + skipTesting: true, + } as ApplicationOptions; + const tree: UnitTestTree = await runner.runSchematic( + 'application', + options, + ); + + const files: string[] = tree.files; + expect(files.sort()).toEqual( + [ + '/project/oxlint.json', + '/project/.gitignore', + '/project/.prettierrc', + '/project/README.md', + '/project/nest-cli.json', + '/project/package.json', + '/project/tsconfig.build.json', + '/project/tsconfig.json', + '/project/src/app.controller.ts', + '/project/src/app.module.ts', + '/project/src/app.service.ts', + '/project/src/main.ts', + ].sort(), + ); + + const packageJson = JSON.parse(tree.readContent('/project/package.json')); + + expect(packageJson.scripts).not.toHaveProperty('test'); + expect(packageJson.scripts).not.toHaveProperty('test:watch'); + expect(packageJson.scripts).not.toHaveProperty('test:cov'); + expect(packageJson.scripts).not.toHaveProperty('test:debug'); + expect(packageJson.scripts).not.toHaveProperty('test:e2e'); + expect(packageJson.scripts.format).toBe('prettier --write "src/**/*.ts"'); + expect(packageJson.devDependencies).not.toHaveProperty('@nestjs/testing'); + expect(packageJson.devDependencies).not.toHaveProperty('@types/jest'); + expect(packageJson.devDependencies).not.toHaveProperty('@types/supertest'); + expect(packageJson.devDependencies).not.toHaveProperty('jest'); + expect(packageJson.devDependencies).not.toHaveProperty('supertest'); + expect(packageJson.devDependencies).not.toHaveProperty('ts-jest'); + expect(packageJson.devDependencies).not.toHaveProperty('vitest'); + expect(packageJson).not.toHaveProperty('jest'); + }); + it('should skip testing files and package entries for JavaScript projects', async () => { + const options = { + name: 'project', + skipTesting: true, + language: 'js', + } as ApplicationOptions; + const tree: UnitTestTree = await runner.runSchematic( + 'application', + options, + ); + + const files: string[] = tree.files; + expect(files.sort()).toEqual( + [ + '/project/.babelrc', + '/project/.gitignore', + '/project/.prettierrc', + '/project/README.md', + '/project/index.js', + '/project/jsconfig.json', + '/project/nest-cli.json', + '/project/nodemon.json', + '/project/package.json', + '/project/src/app.controller.js', + '/project/src/app.module.js', + '/project/src/app.service.js', + '/project/src/main.js', + ].sort(), + ); + + const packageJson = JSON.parse(tree.readContent('/project/package.json')); + + expect(packageJson.scripts).not.toHaveProperty('test'); + expect(packageJson.scripts).not.toHaveProperty('test:cov'); + expect(packageJson.scripts).not.toHaveProperty('test:e2e'); + expect(packageJson.devDependencies).not.toHaveProperty('@nestjs/testing'); + expect(packageJson.devDependencies).not.toHaveProperty('jest'); + expect(packageJson.devDependencies).not.toHaveProperty('supertest'); + expect(packageJson).not.toHaveProperty('jest'); + }); it('should create a spec file', async () => { const options: ApplicationOptions = { name: 'project', diff --git a/src/lib/application/application.factory.ts b/src/lib/application/application.factory.ts index 45b2b84b1..34f249079 100644 --- a/src/lib/application/application.factory.ts +++ b/src/lib/application/application.factory.ts @@ -88,18 +88,27 @@ function generate(options: ApplicationOptions, path: string): Source { options.type === 'esm' && options.language === 'ts' ? 'ts-esm' : options.language!; + const shouldSkipTesting = options.skipTesting === true; + const shouldSkipSpecFiles = shouldSkipTesting || options.spec === false; return apply(url(join('./files' as Path, templateDir)), [ - options.spec - ? noop() - : filter((path) => !path.endsWith('__specFileSuffix__.ts')), - options.spec - ? noop() - : filter((path) => { + shouldSkipTesting + ? filter( + (path) => + !path.startsWith('/test/') && + !path.endsWith('/jest.config.js') && + !path.endsWith('/jest.config.ts') && + !path.endsWith('/vitest.config.ts') && + !path.endsWith('/vitest.config.e2e.ts'), + ) + : noop(), + shouldSkipSpecFiles + ? filter((path) => { const languageExtension = options.language || 'ts'; const suffix = `__specFileSuffix__.${languageExtension}`; return !path.endsWith(suffix); - }), + }) + : noop(), template({ ...strings, ...options, diff --git a/src/lib/application/application.schema.d.ts b/src/lib/application/application.schema.d.ts index b848b057e..29739c465 100644 --- a/src/lib/application/application.schema.d.ts +++ b/src/lib/application/application.schema.d.ts @@ -49,6 +49,10 @@ export interface ApplicationOptions { * Specifies if a spec file is generated. */ spec?: boolean; + /** + * Specifies if testing files and package entries are skipped. + */ + skipTesting?: boolean; /** * Specifies the file suffix of spec files. * @default "spec" diff --git a/src/lib/application/files/js/package.json b/src/lib/application/files/js/package.json index 9bd71873e..05cc7c6da 100644 --- a/src/lib/application/files/js/package.json +++ b/src/lib/application/files/js/package.json @@ -8,10 +8,10 @@ "scripts": { "format": "prettier --write \"**/*.js\"", "start": "babel-node index.js", - "start:dev": "nodemon", + "start:dev": "nodemon"<% if (!skipTesting) { %>, "test": "jest", "test:cov": "jest --coverage", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./test/jest-e2e.json"<% } %> }, "dependencies": { "@nestjs/common": "next", @@ -21,17 +21,17 @@ "rxjs": "^7.2.0" }, "devDependencies": { - "@nestjs/testing": "next", "@babel/core": "7.29.0", "@babel/node": "7.29.0", "@babel/plugin-proposal-decorators": "7.29.0", "@babel/plugin-transform-runtime": "7.29.0", "@babel/preset-env": "7.29.5", "@babel/register": "7.29.3", - "@babel/runtime": "7.29.2", - "jest": "30.4.2", + "@babel/runtime": "7.29.2"<% if (!skipTesting) { %>, + "@nestjs/testing": "next", + "jest": "30.4.2"<% } %>, "nodemon": "3.1.14", - "prettier": "3.8.3", - "supertest": "7.2.2" + "prettier": "3.8.3"<% if (!skipTesting) { %>, + "supertest": "7.2.2"<% } %> } } diff --git a/src/lib/application/files/ts-esm/package.json b/src/lib/application/files/ts-esm/package.json index 729d6726c..5166a192a 100644 --- a/src/lib/application/files/ts-esm/package.json +++ b/src/lib/application/files/ts-esm/package.json @@ -8,17 +8,17 @@ "type": "module", "scripts": { "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write \"src/**/*.ts\"<% if (!skipTesting) { %> \"test/**/*.ts\"<% } %>", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", - "lint": "oxlint src/ test/", + "lint": "oxlint src/<% if (!skipTesting) { %> test/<% } %>"<% if (!skipTesting) { %>, "test": "vitest run", "test:watch": "vitest", "test:cov": "vitest run --coverage", "test:debug": "vitest --inspect-brk --no-file-parallelism", - "test:e2e": "vitest run --config ./vitest.config.e2e.ts" + "test:e2e": "vitest run --config ./vitest.config.e2e.ts"<% } %> }, "dependencies": { "@nestjs/common": "next", @@ -29,16 +29,16 @@ }, "devDependencies": { "@nestjs/cli": "next", - "@nestjs/schematics": "next", - "@nestjs/testing": "next", + "@nestjs/schematics": "next"<% if (!skipTesting) { %>, + "@nestjs/testing": "next"<% } %>, "@types/express": "^5.0.0", - "@types/node": "^24.0.0", - "@types/supertest": "^7.0.0", + "@types/node": "^24.0.0"<% if (!skipTesting) { %>, + "@types/supertest": "^7.0.0"<% } %>, "oxlint": "^1.58.0", "prettier": "^3.4.2", - "source-map-support": "^0.5.21", - "supertest": "^7.0.0", - "typescript": "^6.0.2", - "vitest": "^4.1.2" + "source-map-support": "^0.5.21"<% if (!skipTesting) { %>, + "supertest": "^7.0.0"<% } %>, + "typescript": "^6.0.2"<% if (!skipTesting) { %>, + "vitest": "^4.1.2"<% } %> } } diff --git a/src/lib/application/files/ts/package.json b/src/lib/application/files/ts/package.json index 4a0117d2d..c91aad359 100644 --- a/src/lib/application/files/ts/package.json +++ b/src/lib/application/files/ts/package.json @@ -7,17 +7,17 @@ "license": "UNLICENSED", "scripts": { "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write \"src/**/*.ts\"<% if (!skipTesting) { %> \"test/**/*.ts\"<% } %>", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", - "lint": "oxlint src/ test/", + "lint": "oxlint src/<% if (!skipTesting) { %> test/<% } %>"<% if (!skipTesting) { %>, "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./test/jest-e2e.json"<% } %> }, "dependencies": { "@nestjs/common": "next", @@ -28,18 +28,18 @@ }, "devDependencies": { "@nestjs/cli": "next", - "@nestjs/schematics": "next", + "@nestjs/schematics": "next"<% if (!skipTesting) { %>, "@nestjs/testing": "next", - "@types/express": "^5.0.0", "@types/jest": "^30.0.0", - "@types/node": "^24.0.0", - "@types/supertest": "^7.0.0", - "jest": "^30.0.0", + "@types/supertest": "^7.0.0"<% } %>, + "@types/express": "^5.0.0", + "@types/node": "^24.0.0"<% if (!skipTesting) { %>, + "jest": "^30.0.0"<% } %>, "oxlint": "^1.58.0", "prettier": "^3.4.2", - "source-map-support": "^0.5.21", + "source-map-support": "^0.5.21"<% if (!skipTesting) { %>, "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "ts-jest": "^29.2.5"<% } %>, "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", diff --git a/src/lib/application/schema.json b/src/lib/application/schema.json index 71db5a1dc..ba11f9cb8 100644 --- a/src/lib/application/schema.json +++ b/src/lib/application/schema.json @@ -75,6 +75,11 @@ "default": true, "description": "Specifies if a spec file is generated." }, + "skipTesting": { + "type": "boolean", + "default": false, + "description": "Specifies if testing files and package entries are skipped." + }, "specFileSuffix": { "type": "string", "default": "spec",