diff --git a/_gulp/modules/setupQuestions.test.ts b/_gulp/modules/setupQuestions.test.ts new file mode 100644 index 0000000..e7747fe --- /dev/null +++ b/_gulp/modules/setupQuestions.test.ts @@ -0,0 +1,31 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { questions } from './setupQuestions'; +import { markupChoices, scriptChoices, styleChoices } from './userChoicesValidation'; + +function questionByName(name: string): Record { + const question = questions.find((item) => item.name === name); + assert.ok(question, `Expected question '${name}' to exist`); + return question as Record; +} + +test('setup questions expose strict script/style/markup choice lists', () => { + const scriptQuestion = questionByName('script'); + const styleQuestion = questionByName('style'); + const markupQuestion = questionByName('markup'); + + assert.deepEqual(scriptQuestion.choices, [...scriptChoices]); + assert.deepEqual(styleQuestion.choices, [...styleChoices]); + assert.deepEqual(markupQuestion.choices, [...markupChoices]); +}); + +test('setup questions include boolean toggles with safe defaults', () => { + const addNormalizeQuestion = questionByName('addNormalize'); + const addResetQuestion = questionByName('addReset'); + + assert.equal(addNormalizeQuestion.type, 'confirm'); + assert.equal(addNormalizeQuestion.default, false); + + assert.equal(addResetQuestion.type, 'confirm'); + assert.equal(addResetQuestion.default, false); +}); diff --git a/_gulp/modules/setupQuestions.ts b/_gulp/modules/setupQuestions.ts index a990c9b..f0f60c5 100644 --- a/_gulp/modules/setupQuestions.ts +++ b/_gulp/modules/setupQuestions.ts @@ -1,10 +1,11 @@ import inquirer from 'inquirer'; import { UserChoices } from '../types'; +import { markupChoices, scriptChoices, styleChoices } from './userChoicesValidation'; export const questions = [ - { type: 'list', name: 'script', message: 'Choose JavaScript or TypeScript:', choices: ['JavaScript', 'TypeScript'] }, - { type: 'list', name: 'style', message: 'Choose Sass or SCSS:', choices: ['Sass', 'SCSS'] }, - { type: 'list', name: 'markup', message: 'Choose HTML or Pug:', choices: ['HTML', 'Pug'] }, + { type: 'list', name: 'script', message: 'Choose JavaScript or TypeScript:', choices: [...scriptChoices] }, + { type: 'list', name: 'style', message: 'Choose Sass or SCSS:', choices: [...styleChoices] }, + { type: 'list', name: 'markup', message: 'Choose HTML or Pug:', choices: [...markupChoices] }, { type: 'confirm', name: 'addNormalize', message: 'Add normalize.css?', default: false }, { type: 'confirm', name: 'addReset', message: 'Add reset.css?', default: false } ]; @@ -18,4 +19,4 @@ export async function confirmProjectDeletion(): Promise { { type: 'confirm', name: 'deleteProject', message: 'DELETE existing project and start new?', default: false } ]); return deleteProject; -} \ No newline at end of file +} diff --git a/_gulp/modules/userChoicesValidation.ts b/_gulp/modules/userChoicesValidation.ts index a4b92cb..7adb223 100644 --- a/_gulp/modules/userChoicesValidation.ts +++ b/_gulp/modules/userChoicesValidation.ts @@ -1,8 +1,12 @@ import { UserChoices } from '../types'; -const validScripts = new Set(['JavaScript', 'TypeScript']); -const validStyles = new Set(['Sass', 'SCSS']); -const validMarkups = new Set(['HTML', 'Pug']); +export const scriptChoices = ['JavaScript', 'TypeScript'] as const; +export const styleChoices = ['Sass', 'SCSS'] as const; +export const markupChoices = ['HTML', 'Pug'] as const; + +const validScripts = new Set(scriptChoices); +const validStyles = new Set(styleChoices); +const validMarkups = new Set(markupChoices); function isObjectRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null;