diff --git a/_gulp/modules/fileSetup.ts b/_gulp/modules/fileSetup.ts index 18fbc10..2b6e2c2 100644 --- a/_gulp/modules/fileSetup.ts +++ b/_gulp/modules/fileSetup.ts @@ -1,12 +1,15 @@ +import { resolveProjectPaths } from './pathConfig'; import { UserChoices } from '../types'; import { copyFile, createDirectory, writeFile } from '../utils/fileSystem'; export function createProjectStructure(choices: UserChoices): void { + const paths = resolveProjectPaths(choices); + const dirs = [ 'src', - `src/${choices.script === 'JavaScript' ? 'js' : 'ts'}`, - `src/${choices.style === 'Sass' ? 'sass/base' : 'scss/base'}`, // Updated path for base - `src/${choices.markup === 'HTML' ? 'html' : 'pug'}`, + `src/${paths.scriptFolder}`, + `src/${paths.styleBaseFolder}`, + `src/${paths.markupFolder}`, 'src/img', 'dist/css' ]; @@ -15,35 +18,34 @@ export function createProjectStructure(choices: UserChoices): void { } export function createProjectFiles(choices: UserChoices): void { - const scriptExt = choices.script === 'JavaScript' ? 'js' : 'ts'; - const styleExt = choices.style === 'Sass' ? 'sass' : 'scss'; + const paths = resolveProjectPaths(choices); const scriptContent = choices.script === 'JavaScript' ? 'console.log("Hello, World!");' : 'console.log("Hello, TypeScript!");'; - writeFile(`src/${scriptExt}/main.${scriptExt}`, scriptContent); + writeFile(`src/${paths.scriptFolder}/main.${paths.scriptExtension}`, scriptContent); let styleContent = `// Main ${choices.style} file\n`; if (choices.addNormalize) styleContent += choices.style === 'Sass' ? "@import 'base/normalize'\n" : "@import 'base/normalize';\n"; if (choices.addReset) styleContent += choices.style === 'Sass' ? "@import 'base/reset'\n" : "@import 'base/reset';\n"; - writeFile(`src/${styleExt}/main.${styleExt}`, styleContent); + writeFile(`src/${paths.styleFolder}/main.${paths.styleExtension}`, styleContent); const markupContent = choices.markup === 'HTML' ? getHtmlTemplate() : getPugTemplate(); - const markupFilePath = choices.markup === 'HTML' ? 'src/html/index.html' : 'src/pug/index.pug'; - - writeFile(markupFilePath, markupContent); + writeFile(`src/${paths.markupFolder}/index.${paths.markupExtension}`, markupContent); writeFile('src/favicon.ico', ''); } export function copyVendorCSS(choices: UserChoices): void { + const paths = resolveProjectPaths(choices); + const vendorFiles = [ - { type: 'Normalize', src: `_gulp/vendors/normalize.${choices.style === 'Sass' ? 'sass' : 'scss'}` }, - { type: 'Reset', src: `_gulp/vendors/reset.${choices.style === 'Sass' ? 'sass' : 'scss'}` } + { type: 'Normalize', src: `_gulp/vendors/normalize.${paths.styleExtension}` }, + { type: 'Reset', src: `_gulp/vendors/reset.${paths.styleExtension}` } ]; vendorFiles.forEach(file => { if (choices[`add${file.type}` as keyof UserChoices]) { - const dest = `src/${choices.style === 'Sass' ? 'sass/base' : 'scss/base'}/_${file.type.toLowerCase()}.${choices.style === 'Sass' ? 'sass' : 'scss'}`; // Save in base folder + const dest = `src/${paths.styleBaseFolder}/_${file.type.toLowerCase()}.${paths.styleExtension}`; copyFile(file.src, dest); } }); diff --git a/_gulp/modules/pathConfig.test.ts b/_gulp/modules/pathConfig.test.ts new file mode 100644 index 0000000..7717307 --- /dev/null +++ b/_gulp/modules/pathConfig.test.ts @@ -0,0 +1,37 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { resolveProjectPaths } from './pathConfig'; + +test('resolveProjectPaths returns correct folders/extensions for Sass + JavaScript + HTML', () => { + const result = resolveProjectPaths({ + script: 'JavaScript', + style: 'Sass', + markup: 'HTML', + addNormalize: false, + addReset: false, + }); + + assert.equal(result.scriptFolder, 'js'); + assert.equal(result.scriptExtension, 'js'); + assert.equal(result.styleFolder, 'sass'); + assert.equal(result.styleBaseFolder, 'sass/base'); + assert.equal(result.markupFolder, 'html'); + assert.equal(result.markupExtension, 'html'); +}); + +test('resolveProjectPaths returns correct folders/extensions for SCSS + TypeScript + Pug', () => { + const result = resolveProjectPaths({ + script: 'TypeScript', + style: 'SCSS', + markup: 'Pug', + addNormalize: true, + addReset: true, + }); + + assert.equal(result.scriptFolder, 'ts'); + assert.equal(result.scriptExtension, 'ts'); + assert.equal(result.styleFolder, 'scss'); + assert.equal(result.styleBaseFolder, 'scss/base'); + assert.equal(result.markupFolder, 'pug'); + assert.equal(result.markupExtension, 'pug'); +}); diff --git a/_gulp/modules/pathConfig.ts b/_gulp/modules/pathConfig.ts new file mode 100644 index 0000000..407e2e7 --- /dev/null +++ b/_gulp/modules/pathConfig.ts @@ -0,0 +1,25 @@ +import { UserChoices } from '../types'; + +export interface ResolvedProjectPaths { + scriptFolder: 'js' | 'ts'; + scriptExtension: 'js' | 'ts'; + styleFolder: 'sass' | 'scss'; + styleExtension: 'sass' | 'scss'; + styleBaseFolder: 'sass/base' | 'scss/base'; + markupFolder: 'html' | 'pug'; + markupExtension: 'html' | 'pug'; +} + +export function resolveProjectPaths(choices: UserChoices): ResolvedProjectPaths { + const styleFolder = choices.style === 'Sass' ? 'sass' : 'scss'; + + return { + scriptFolder: choices.script === 'TypeScript' ? 'ts' : 'js', + scriptExtension: choices.script === 'TypeScript' ? 'ts' : 'js', + styleFolder, + styleExtension: styleFolder, + styleBaseFolder: choices.style === 'Sass' ? 'sass/base' : 'scss/base', + markupFolder: choices.markup === 'Pug' ? 'pug' : 'html', + markupExtension: choices.markup === 'Pug' ? 'pug' : 'html', + }; +} diff --git a/_gulp/templates/gulpfile/types.ts b/_gulp/templates/gulpfile/types.ts index 490225f..909d61f 100644 --- a/_gulp/templates/gulpfile/types.ts +++ b/_gulp/templates/gulpfile/types.ts @@ -1,23 +1,13 @@ +import { resolveProjectPaths, ResolvedProjectPaths } from '../../modules/pathConfig'; import { UserChoices } from '../../types'; -export interface GulpTemplateContext { +export interface GulpTemplateContext extends ResolvedProjectPaths { choices: UserChoices; - styleFolder: 'sass' | 'scss'; - styleExtension: 'sass' | 'scss'; - scriptFolder: 'js' | 'ts'; - scriptExtension: 'js' | 'ts'; - markupFolder: 'html' | 'pug'; - markupExtension: 'html' | 'pug'; } export function createGulpTemplateContext(choices: UserChoices): GulpTemplateContext { return { choices, - styleFolder: choices.style === 'Sass' ? 'sass' : 'scss', - styleExtension: choices.style === 'Sass' ? 'sass' : 'scss', - scriptFolder: choices.script === 'TypeScript' ? 'ts' : 'js', - scriptExtension: choices.script === 'TypeScript' ? 'ts' : 'js', - markupFolder: choices.markup === 'Pug' ? 'pug' : 'html', - markupExtension: choices.markup === 'Pug' ? 'pug' : 'html', + ...resolveProjectPaths(choices), }; }