From 864a828f03535ddd69c5801f607244f2ac7b6256 Mon Sep 17 00:00:00 2001 From: John Carmichael Date: Tue, 4 Mar 2025 11:07:39 +0000 Subject: [PATCH] fix: _tpl_testing_ ignore split out into copy and render ignore patterns --- CHANGELOG.md | 3 + package-lock.json | 4 +- package.json | 2 +- src/lib/FileIterator.ts | 10 +- src/lib/generate/generateBaseStructure.ts | 12 +- src/lib/helpers/__tests__/isFileToIgnore.ts | 61 ---------- .../__tests__/shouldCopyOrRenderFile.ts | 114 ++++++++++++++++++ src/lib/helpers/isFileToIgnore.ts | 25 ---- src/lib/helpers/shouldCopyOrRenderFile.ts | 33 +++++ 9 files changed, 168 insertions(+), 96 deletions(-) delete mode 100644 src/lib/helpers/__tests__/isFileToIgnore.ts create mode 100644 src/lib/helpers/__tests__/shouldCopyOrRenderFile.ts delete mode 100644 src/lib/helpers/isFileToIgnore.ts create mode 100644 src/lib/helpers/shouldCopyOrRenderFile.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 245a0f4..8a9f729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +### 5.62.1 04/03/2025 +fix: _tpl_testing_ ignore split out into copy and render ignore patterns + ### 5.62.0 04/03/2025 feat: _tpl_testing_ added to the default ignore allowing a tpl to hold own test files diff --git a/package-lock.json b/package-lock.json index 5fabcc4..b2d85c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "generate-it", - "version": "5.62.0", + "version": "5.62.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "generate-it", - "version": "5.62.0", + "version": "5.62.1", "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.7.2", diff --git a/package.json b/package.json index 512ca1f..7780bc9 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "generate-it", - "version": "5.62.0", + "version": "5.62.1", "description": "Generate-it, will generate servers, clients, web-socket and anything else you can template with nunjucks from yml files (openapi/asyncapi)", "author": "Acrontum GmbH & Liffery Ltd", "license": "MIT", diff --git a/src/lib/FileIterator.ts b/src/lib/FileIterator.ts index 570c00e..990478d 100644 --- a/src/lib/FileIterator.ts +++ b/src/lib/FileIterator.ts @@ -6,7 +6,7 @@ import { ConfigExtendedBase } from '@/interfaces/ConfigExtendedBase'; import FileTypeCheck from '@/lib/FileTypeCheck'; import generateFile from '@/lib/generate/generateFile'; import GenerateInterfaceFiles from '@/lib/generate/GenerateInterfaceFiles'; -import isFileToIgnore from '@/lib/helpers/isFileToIgnore'; +import shouldCopyOrRenderFile from '@/lib/helpers/shouldCopyOrRenderFile'; import GenerateOperation from '@/lib/generate/GenerateOperation'; import { GenerateOperationFileConfig } from '@/interfaces/GenerateOperationFileConfig'; import TemplateRenderer from '@/lib/template/TemplateRenderer'; @@ -32,9 +32,15 @@ class FileWalker { if (err) { throw err; } - if (isFileToIgnore(fullpath, dirent.name, providedConfig.nodegenRc)) { + if (!shouldCopyOrRenderFile({ + ignoreForWhichAction: 'render', + directoryPathContainingFilename: fullpath, + filenameBeingProcessed: dirent.name, + nodegenRc: providedConfig.nodegenRc + })) { return Promise.resolve(false); } + if (dirent.isDirectory()) { return; } diff --git a/src/lib/generate/generateBaseStructure.ts b/src/lib/generate/generateBaseStructure.ts index 62bc590..084518e 100644 --- a/src/lib/generate/generateBaseStructure.ts +++ b/src/lib/generate/generateBaseStructure.ts @@ -2,7 +2,7 @@ import * as fs from 'fs-extra'; import path from 'path'; import { mergePackageJsonFiles } from '@/lib/helpers/mergePackageJsonFiles'; import { ConfigExtendedBase } from '@/interfaces'; -import isFileToIgnore from '@/lib/helpers/isFileToIgnore'; +import shouldCopyOrRenderFile from '@/lib/helpers/shouldCopyOrRenderFile'; /** * Creates the base structure @@ -33,11 +33,13 @@ export default (targetDir: string, templatesDir: string, config: ConfigExtendedB } const dir = src.substring(0, src.lastIndexOf(path.sep)); const file = src.substr(src.lastIndexOf(path.sep) + 1); - if (isFileToIgnore(dir, file, config.nodegenRc)) { - return false; - } - return true; + return shouldCopyOrRenderFile({ + directoryPathContainingFilename: dir, + filenameBeingProcessed: file, + ignoreForWhichAction: 'copy', + nodegenRc: config.nodegenRc + }); }, }); diff --git a/src/lib/helpers/__tests__/isFileToIgnore.ts b/src/lib/helpers/__tests__/isFileToIgnore.ts deleted file mode 100644 index 4e6397c..0000000 --- a/src/lib/helpers/__tests__/isFileToIgnore.ts +++ /dev/null @@ -1,61 +0,0 @@ -import isFileToIgnore from '@/lib/helpers/isFileToIgnore'; -import { NodegenRc } from '@/interfaces'; - -describe('Should not allow directories on black list, eg git idea vscode, even as a file', () => { - it('should skip .git, node_modules, and editor files', () => { - expect(isFileToIgnore('som/dir/.git', 'config')).toBe(true); - expect(isFileToIgnore('som/dir/.idea', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/.vscode', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/vscode', '.vscode')).toBe(true); - expect(isFileToIgnore('som/dir/.vscode/blah', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/node_modules/blah', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/node_modules', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/node_modules/', 'workspace')).toBe(true); - expect(isFileToIgnore('som/dir/_tpl_testing_/', 'workspace')).toBe(true); - expect(isFileToIgnore('som/_tpl_testing_/nested/dir', 'workspace')).toBe(true); - }); - - it('should match exactly', () => { - expect(isFileToIgnore('som/dir/.gitignore', 'config')).toBe(false); - }); - - it('should use configuration from Nodegenrc', () => { - const nodegenRc: NodegenRc = { - nodegenDir: '', - nodegenType: '', - ignoreFiles: [ - 'gradle', - ] - }; - - expect(isFileToIgnore('.git/dir/', 'config', nodegenRc)).toBe(false); - expect(isFileToIgnore('som/dir/.idea', 'workspace', nodegenRc)).toBe(false); - expect(isFileToIgnore('som/dir/.vscode', 'workspace', nodegenRc)).toBe(false); - expect(isFileToIgnore('som/dir/node_modules/blah', 'workspace', nodegenRc)).toBe(false); - expect(isFileToIgnore('gradle/dir/test', 'gradle.jar', nodegenRc)).toBe(true); - expect(isFileToIgnore('.gradle/dir/test', 'file.png', nodegenRc)).toBe(true); - }); - - it('should match files using regex', () => { - const nodegenRc: NodegenRc = { - nodegenDir: '', - nodegenType: '', - ignoreFiles: [ - '\\.\\w{3}$', // Ignores any file whose extension is 3 chars - ] - }; - - expect(isFileToIgnore('src', 'node.js', nodegenRc)).toBe(false); - expect(isFileToIgnore('src/main/java', '.Dockerfile', nodegenRc)).toBe(false); - expect(isFileToIgnore('src/main/test', 'gradle.jar', nodegenRc)).toBe(true); - expect(isFileToIgnore('gradle/dir/test', 'gradle.jar', nodegenRc)).toBe(true); - expect(isFileToIgnore('.gradle/dir/test', 'file.png', nodegenRc)).toBe(true); - }); -}); - -describe('Should other directories in and .njk files', () => { - it('should allow http paths', () => { - expect(isFileToIgnore('som/dir/http', 'config')).toBe(false); - expect(isFileToIgnore('som/dir/http', '___op.njk')).toBe(false); - }); -}); diff --git a/src/lib/helpers/__tests__/shouldCopyOrRenderFile.ts b/src/lib/helpers/__tests__/shouldCopyOrRenderFile.ts new file mode 100644 index 0000000..3cbafad --- /dev/null +++ b/src/lib/helpers/__tests__/shouldCopyOrRenderFile.ts @@ -0,0 +1,114 @@ +import shouldCopyOrRenderFile from '@/lib/helpers/shouldCopyOrRenderFile'; +import { NodegenRc } from '@/interfaces'; + +describe('File Ignore Functionality', () => { + it('should skip .git, node_modules, and editor files', () => { + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/.git', + filenameBeingProcessed: 'config' + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/.idea', + filenameBeingProcessed: 'workspace' + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/.vscode', + filenameBeingProcessed: 'workspace' + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/node_modules', + filenameBeingProcessed: 'workspace' + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/_tpl_testing_/something', + filenameBeingProcessed: 'workspace' + })).toBe(false); + }); + // + it('should render _tpl_testing_ but not copy them over', () => { + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'render', + directoryPathContainingFilename: 'som/dir/_tpl_testing_/something', + filenameBeingProcessed: 'workspace' + })).toBe(true); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/_tpl_testing_/something', + filenameBeingProcessed: 'workspace' + })).toBe(false); + }); + + it('should match exactly', () => { + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/.gitignore', + filenameBeingProcessed: 'config' + })).toBe(true); + }); + + it('should use configuration from NodegenRc', () => { + const nodegenRc: NodegenRc = { + nodegenDir: '', + nodegenType: '', + ignoreFiles: ['gradle'] + }; + + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'gradle/dir/test', + filenameBeingProcessed: 'gradle.jar', + nodegenRc + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: '.gradle/dir/test', + filenameBeingProcessed: 'file.png', + nodegenRc + })).toBe(false); + }); + + it('should match files using regex', () => { + const nodegenRc: NodegenRc = { + nodegenDir: '', + nodegenType: '', + ignoreFiles: ['\\.\\w{3}$'] // Ignores any file whose extension is 3 chars + }; + + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'src/main/test', + filenameBeingProcessed: 'gradle.jar', + nodegenRc + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'gradle/dir/test', + filenameBeingProcessed: 'gradle.jar', + nodegenRc + })).toBe(false); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: '.gradle/dir/test', + filenameBeingProcessed: 'file.png', + nodegenRc + })).toBe(false); + }); + + it('should allow http paths and .njk files', () => { + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/http', + filenameBeingProcessed: 'config' + })).toBe(true); + expect(shouldCopyOrRenderFile({ + ignoreForWhichAction: 'copy', + directoryPathContainingFilename: 'som/dir/http', + filenameBeingProcessed: '___op.njk' + })).toBe(true); + }); +}); diff --git a/src/lib/helpers/isFileToIgnore.ts b/src/lib/helpers/isFileToIgnore.ts deleted file mode 100644 index 61e1797..0000000 --- a/src/lib/helpers/isFileToIgnore.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NodegenRc } from '@/interfaces'; -import path from 'path'; - -const defaultIgnoreList = [`(\\.idea|\\.git|\\.vscode|node_modules|build|dist|_tpl_testing_)\\b`]; -let ignoreList: string; -let fullRegex: RegExp; - -/** - * Finds if the file should be ignored during copying - * @param dir The dir that contains the file - * @param filename The filename, not much to add here - * @param [nodegenRc] The template configuration data - */ -export default (dir: string, filename: string, nodegenRc?: NodegenRc) => { - let filesToIgnore = nodegenRc?.ignoreFiles ?? defaultIgnoreList; - filesToIgnore = Array.isArray(filesToIgnore) ? filesToIgnore : [filesToIgnore]; - filesToIgnore = filesToIgnore.join('|'); - - if (!fullRegex || filesToIgnore !== ignoreList) { - ignoreList = filesToIgnore; - fullRegex = new RegExp(filesToIgnore); - } - - return fullRegex.test(path.join(dir, filename)); -}; diff --git a/src/lib/helpers/shouldCopyOrRenderFile.ts b/src/lib/helpers/shouldCopyOrRenderFile.ts new file mode 100644 index 0000000..9fec503 --- /dev/null +++ b/src/lib/helpers/shouldCopyOrRenderFile.ts @@ -0,0 +1,33 @@ +import { NodegenRc } from '@/interfaces'; +import path from 'path'; + +const defaultCopyIgnoreList = [`(\\.idea|\\.git|\\.vscode|node_modules|build|dist|_tpl_testing_)\\b`]; +const defaultRenderIgnoreList = [`(\\.idea|\\.git|\\.vscode|node_modules|build|dist)\\b`]; +let ignoreList: string; +let fullRegex: RegExp; + +export default (input: { + ignoreForWhichAction: 'copy' | 'render' + directoryPathContainingFilename: string, + filenameBeingProcessed: string, + nodegenRc?: NodegenRc +}) => { + + let filesToIgnore = input.nodegenRc?.ignoreFiles ?? + (input.ignoreForWhichAction === 'copy' ? defaultCopyIgnoreList : + input.ignoreForWhichAction === 'render' ? defaultRenderIgnoreList : undefined); + + console.log(filesToIgnore); + + filesToIgnore = Array.isArray(filesToIgnore) ? filesToIgnore : [filesToIgnore]; + filesToIgnore = filesToIgnore.join('|'); + + if (!fullRegex || filesToIgnore !== ignoreList) { + ignoreList = filesToIgnore; + fullRegex = new RegExp(filesToIgnore); + } + + return !fullRegex.test( + path.join(input.directoryPathContainingFilename, input.filenameBeingProcessed) + ); +};