<!doctype html><html lang="ru"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Ajv — мастерская JSON Schema</title><link rel="stylesheet" href="bootstrap.min.css"><link rel="stylesheet" href="style.css"></head><body><main class="container py-4"><header><p class="eyebrow">AJV · КОНТРАКТЫ ДАННЫХ</p><h1>JSON, которому<br>можно доверять</h1><p class="lead">Девять практических задач: от формы клиента до отчёта об импорте.</p><p class="note">Настоящий Ajv 8.20.0 работает в вашем браузере. Данные остаются во вкладке. Схемы заранее заданы автором; PHP или Node.js на сервере сайта здесь не запускаются. Node API и CLI есть в исходниках.</p></header><section class="panel"><label for="lesson" class="form-label">Практическая задача</label><select id="lesson" class="form-select"></select><p id="why" class="mt-3 fw-semibold"></p><p id="guide"></p><div class="toolbar"><button id="good" class="btn btn-outline-dark">Корректные данные</button><button id="bad" class="btn btn-outline-dark">Данные с ошибками</button><button id="reset" class="btn btn-outline-dark">Сбросить задачу</button></div></section><div class="row g-3"><section class="col-lg-6"><div class="panel"><h2>1. Измените данные</h2><div id="form-fields" hidden><label for="name" class="form-label">Имя</label><input id="name" class="form-control" aria-describedby="name-error" maxlength="100"><p id="name-error" class="field-error"></p><label for="email" class="form-label">Email</label><input id="email" class="form-control" type="email" aria-describedby="email-error" maxlength="254"><p id="email-error" class="field-error"></p><label for="age" class="form-label">Возраст</label><input id="age" class="form-control" type="number" aria-describedby="age-error"><p id="age-error" class="field-error"></p></div><label for="input" class="form-label" id="input-label">JSON для проверки</label><textarea id="input" class="form-control editor" spellcheck="false" rows="15" maxlength="65536" aria-describedby="limits"></textarea><p class="small mt-2" id="limits">До 64 КиБ, глубина до 24 уровней. В импорте — до 200 строк NDJSON.</p><div id="normalize-options" class="form-check my-3" hidden><input id="mutate" type="checkbox" class="form-check-input"><label for="mutate" class="form-check-label">Нормализовать копию: defaults, coerceTypes, removeAdditional</label></div><button id="validate" class="btn btn-primary">Проверить данные</button></div></section><section class="col-lg-6"><div class="panel"><h2>2. Прочитайте результат</h2><p id="status" class="result" role="status" aria-live="polite">Готово к проверке</p><ul id="errors" class="error-list"></ul><div id="rows"></div><p id="changes" class="small"></p><details><summary>Данные после проверки</summary><pre id="output"></pre></details><button id="report" class="btn btn-outline-dark mt-3">Скачать отчёт JSON</button><p class="small mt-3">Соответствие схеме не подтверждает права пользователя, наличие товара или уникальность email. Эти правила проверяет приложение отдельно.</p></div></section></div><section class="panel"><h2>3. Возьмите контракт и код</h2><details><summary>JSON Schema draft 2020-12</summary><pre id="schema"></pre></details><details><summary>Готовый пример Node.js</summary><pre id="code"></pre></details><div class="toolbar mt-3"><button id="save-schema" class="btn btn-outline-dark">Скачать schema.json</button><button id="save-code" class="btn btn-outline-dark">Скачать validate.mjs</button><a href="../ajv-project.zip" class="btn btn-primary">Весь проект ZIP</a></div><p class="small mt-3">Пример содержит схему выбранной задачи и авторский корректный объект. Для полного построчного импорта, CLI и HTTP API используйте проект. Windows и Linux: инструкции в README.</p></section><footer><p>Авторский код MIT · <a href="THIRD-PARTY-LICENSES.txt">Лицензии</a> · <a href="https://ajv.js.org/guide/getting-started.html">Документация Ajv</a></p></footer></main><script type="module" src="app.js"></script></body></html>
