const config={
 $schema:'https://biomejs.dev/schemas/2.6.7/schema.json',
 formatter:{enabled:true,indentStyle:'space',indentWidth:2,lineWidth:80},
 linter:{enabled:true,rules:{preset:'recommended'}},
 assist:{enabled:true,actions:{source:{organizeImports:'on'}}}
};
const js='export function invoice(items){return items.map(item=>({name:item.name,amount:item.price*item.quantity,currency:"RUB"}))}\n';
export const definitions=[
 {id:'format',title:'Форматирование JS/TS',use:'Единый стиль pull request без ручных споров',goal:'Сравните обычный формат, узкую строку и ошибку синтаксиса.',variants:[['default','JS: отступы и переносы'],['narrow','TS: строка 50 символов'],['parse','Синтаксис сломан']],lesson:'Formatter меняет оформление корректного кода; сломанный синтаксис требует решения автора.'},
 {id:'logic',title:'Подозрительная логика',use:'Замечать ошибку до запуска интерфейса',goal:'Посмотрите правило, участок кода и причину диагностики.',variants:[['assignment','Присваивание в условии'],['equality','Нестрогое сравнение']],lesson:'Linter находит шаблоны риска, но не доказывает правильность бизнес-логики.'},
 {id:'fix',title:'Safe и unsafe fixes',use:'Автоисправления с проверкой смысла',goal:'Сравните безопасное let → const и изменение == → ===.',variants:[['safe','Safe: useConst'],['blocked','Unsafe без разрешения'],['unsafe','Unsafe с разрешением']],lesson:'Unsafe может менять результат программы. Запись содержит настоящий запуск примера до и после.'},
 {id:'a11y',title:'Доступность JSX',use:'Поля, картинки и кнопки формы',goal:'Сравните проблемную и исправленную разметку.',variants:[['broken','Форма с ошибками'],['fixed','Подписи и тип кнопки']],lesson:'Статический анализ помогает, но не заменяет клавиатуру, screen reader и проверку интерфейса в браузере.'},
 {id:'languages',title:'JSON и CSS',use:'Настройки проекта и таблица стилей',goal:'Проверьте формат файлов разных языков и отдельную ошибку JSON.',variants:[['json','Формат JSON'],['css','Формат CSS'],['invalid','JSON без значения']],lesson:'Поддержка formatter и набор linter-правил различаются по языкам. Синтаксис важнее внешнего оформления.'},
 {id:'imports',title:'Организация imports',use:'Читаемые зависимости модуля',goal:'Посмотрите assist-сортировку отдельно от удаления неиспользуемого импорта.',variants:[['organize','Упорядочить imports'],['unused','Неиспользуемый import']],lesson:'Сортировка и удаление — разные действия. Side-effect import в опыте сохранён; его назначение нужно понимать.'},
 {id:'scope',title:'Границы конфигурации',use:'Не проверять generated и объяснять исключения',goal:'Сравните исключение каталога, override для тестов и точечное подавление.',variants:[['generated','Исключить generated'],['override','Override для *.test.js'],['suppression','Подавить одно правило']],lesson:'Уменьшайте область исключения и оставляйте причину. Отключение всего linter скрывает будущие ошибки.'},
 {id:'ci',title:'Проверка CI',use:'Одинаковый контроль на компьютере и сервере',goal:'Сравните коды выхода чистого и ошибочного checkout.',variants:[['broken','CI: ошибка'],['clean','CI: всё чисто']],lesson:'biome ci проверяет и не исправляет файлы. Успешный lint не заменяет тесты и type-check.'}
];
export function makeCase(id,variant){
 let c=structuredClone(config),files={},args=['check','--write','.'];
 if(id==='format'){
  c.linter.enabled=false;c.assist.enabled=false;files[variant==='narrow'?'sample.ts':'sample.js']=variant==='parse'?'export const total = ;\n':variant==='narrow'?'export type Item={name:string;price:number;quantity:number};\n'+js.replace('(items)','(items: Item[])'):js;
  if(variant==='narrow'){c.formatter.lineWidth=50;c.javascript={formatter:{quoteStyle:'single'}};}args=['format','--write','.'];
 }
 if(id==='logic'){c.formatter.enabled=false;c.assist.enabled=false;files['sample.js']=variant==='assignment'?'export function ready(flag) { if (flag = true) return "yes"; return "no"; }\n':'export const equal = (left, right) => left == right;\n';args=['lint','.'];}
 if(id==='fix'){c.formatter.enabled=false;c.assist.enabled=false;files['sample.js']=variant==='safe'?'let count = 3;\nexport { count };\n':'export const equal = (left, right) => left == right;\n';args=['lint','--write',...(variant==='unsafe'?['--unsafe']:[]),'.'];}
 if(id==='a11y'){c.formatter.enabled=false;c.assist.enabled=false;files['sample.jsx']=variant==='broken'?'export const Form = () => <form><img src="/avatar.png"/><label>Имя</label><input/><button>Сохранить</button></form>;\n':'export const Form = () => <form><img src="/avatar.png" alt="Аватар клиента"/><label htmlFor="name">Имя</label><input id="name" name="name"/><button type="submit">Сохранить</button></form>;\n';args=['lint','.'];}
 if(id==='languages'){c.linter.enabled=false;c.assist.enabled=false;files[variant==='css'?'sample.css':'sample.json']=variant==='css'?'.card{display:grid;gap:16px;padding:24px;background:#fff} @media(max-width:600px){.card{padding:12px}}\n':variant==='json'?'{"name":"workshop","ports":[8560,8561],"enabled":true}\n':'{"name": }\n';args=['format','--write','.'];}
 if(id==='imports'){c.linter.enabled=variant==='unused';c.formatter.enabled=false;files['sample.js']=variant==='organize'?'import "./register.js";\nimport { zebra, alpha } from "./items.js";\nimport { join } from "node:path";\nexport const result = [join("a", "b"), alpha, zebra];\n':'import { join } from "node:path";\nexport const ready = true;\n';args=variant==='organize'?['check','--write','.']:['lint','.'];}
 if(id==='scope'){
  c.formatter.enabled=false;c.assist.enabled=false;c.linter.rules={preset:'recommended',suspicious:{noConsole:'error'}};
  if(variant==='generated'){c.files={includes:['**','!generated']};files={'src/main.js':'export const ready = true;\n','generated/broken.js':'const = not valid;\n'};}
  if(variant==='override'){c.overrides=[{includes:['**/*.test.js'],linter:{rules:{suspicious:{noConsole:'off'}}}}];files={'main.test.js':'console.log("fixture trace");\n'};}
  if(variant==='suppression')files={'sample.js':'// biome-ignore lint/suspicious/noConsole: диагностический вывод учебного CLI\nconsole.log("fixture trace");\n'};
  args=['lint','.'];
 }
 if(id==='ci'){files['sample.js']=variant==='clean'?'export const total = (a, b) => a + b;\n':'export const total=(a,b)=>a+b\n';args=['ci','.'];}
 if(!Object.keys(files).length)throw new Error('Unknown case');return{config:c,files,args};
}
