From 1096ea37a596c774eb6d5af4606dba49a6ebb995 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 14 Aug 2026 20:55:47 +0500 Subject: [PATCH] =?UTF-8?q?feat(specs):=20FEEDBACK-374=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D0=B6=D0=B8=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D1=87=D0=B5=D1=82=D1=8B=D1=80=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B5=D1=86=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Курс HTTP API уже собирался из спецификации, а Postman, Playwright и HTTP-протокол оставались за моком prism на данных faker'а. В курсе Postman это ломало урок целиком: `?limit=2` отдавал четыре записи с `limit` равным 10928880, `?skip=3&limit=2` ноль записей, а `/users/3` пользователя 52956988 с латинским именем. Теперь плагин openapi-spec.ts регистрируется по разу на каждую спецификацию, имя приходит параметром из app.config.json. Обработчики одни на все четыре: имена интерфейсов совпадают, значит совпадают и operationId, а js-playwright просто подмножество. Отсутствующий обработчик glue находит на старте и падает громко. В три спецификации добавлены @operationId и подключён @typespec/openapi, без которого декоратор неизвестен. Заодно они приведены к тому же виду, что http-api: skip и limit объявлены uint16 со значениями по умолчанию, у чтения одной записи, обновления и удаления объявлен 404, у создания CreatedResponse. Значения по умолчанию тут не украшение: их применяет валидатор, и без них пагинация не работает вовсе. Скрытая правка одного этого места и была причиной, по которой skip применялся, а limit нет. Создание приведено к 201 во всех четырёх. Три спецификации объявляли обычный ответ, то есть 200, и урок 850-api-testing курса Playwright из-за этого не проходил, хотя учил правильному коду и ассертил 201. BasicAuth добавлен в securityHandlers: задачи курса Postman закрыты именно им, и включая чтение одной задачи. Схема берётся из спецификации, как и остальные. authService у http-protocol удалён. По адресу /http-protocol/login живёт рукописный эндпоинт: курс разбирает отправку формы через telnet и печатает ответ `Done!` с Content-Length 5. Спецификация же описывала выдачу токена, то есть то, чего этот адрес никогда не отдавал, и glue из-за этого падал на дубле маршрута. Моков prism больше нет ни одного, зависимость снята. Caddy направляет все четыре префикса приложению. Отдельно починен адрес документации со слешем на конце: swagger-ui регистрирует на него и GET, и добавленный fastify HEAD, а fastify-allow запоминает по маршруту последний метод, поэтому в Allow оставался только HEAD и браузерный GET получал 405. Ссылка живая, урок crud ведёт на /http-api-openapi/#/Tasks. Нормализуется через redir в Caddy. Прогон вырос до 168 проверок и проверяет все четыре префикса. Co-Authored-By: Claude Opus 5 (1M context) --- AGENTS.md | 99 +- Caddyfile | 49 +- bin/smoke-test.js | 119 + bin/start.sh | 12 +- custom-server/src/index.js | 13 +- .../src/{http-api.ts => openapi-spec.ts} | 34 +- package-lock.json | 2213 ++--------------- package.json | 1 - typespec/http-protocol/main.tsp | 5 +- .../http-protocol/services/authService.tsp | 14 - .../services/commentsService.tsp | 19 +- .../http-protocol/services/coursesService.tsp | 23 +- .../http-protocol/services/postsService.tsp | 20 +- .../http-protocol/services/tasksService.tsp | 23 +- .../http-protocol/services/usersService.tsp | 25 +- .../js-playwright/services/authService.tsp | 9 +- .../js-playwright/services/coursesService.tsp | 23 +- .../js-playwright/services/tasksService.tsp | 23 +- .../js-playwright/services/usersService.tsp | 23 +- typespec/postman/services/authService.tsp | 9 +- typespec/postman/services/commentsService.tsp | 19 +- typespec/postman/services/coursesService.tsp | 23 +- typespec/postman/services/postsService.tsp | 20 +- typespec/postman/services/tasksService.tsp | 23 +- typespec/postman/services/usersService.tsp | 25 +- 25 files changed, 626 insertions(+), 2240 deletions(-) rename custom-server/src/{http-api.ts => openapi-spec.ts} (58%) delete mode 100644 typespec/http-protocol/services/authService.tsp diff --git a/AGENTS.md b/AGENTS.md index b94dc88..40eecaa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,54 +12,66 @@ HTTP API, протокол HTTP, Postman, js-playwright. Уроки и само ## Как собран сервер Четыре спецификации на TypeSpec (`typespec//`) компилируются в OpenAPI -(`make compile` → `tsp-output/`). Три из них отдаёт мок prism, а спецификацию -`http-api` целиком обслуживает приложение на fastify (`custom-server/`): мок -возвращает пример дословно и запрос не разбирает, а уроки курса HTTP API учат -как раз на `skip`, `limit`, `select` и идентификаторе в пути. +(`make compile` → `tsp-output/`), по одной на курс: `http-api`, `http-protocol`, +`js-playwright`, `postman`. Все четыре целиком обслуживает приложение на fastify +(`custom-server/`). Мока prism больше нет ни у одной: он возвращал пример +дословно и запрос не разбирал, а уроки учат как раз на `skip`, `limit`, `select` +и идентификаторе в пути. Маршруты, валидация запроса и проверка авторизации при этом **не написаны руками**. Их строит из той же спецификации `fastify-openapi-glue` -(`custom-server/src/http-api.ts`), а типы обработчиков и моделей генерирует +(`custom-server/src/openapi-spec.ts`, плагин регистрируется по разу на каждую из +четырёх), а типы обработчиков и моделей генерирует `@hey-api/openapi-ts` (`make generate` → `custom-server/src/generated/`). Написанного руками остаётся ровно столько, сколько в OpenAPI не выражается: сами -данные, выборка страницы и полей, `/http-api/rpc`, `/http-api/echo`, стрим и -куки для курса про протокол, статика. +данные, выборка страницы и полей, `/http-api/rpc`, `/http-api/echo`, +`/http-protocol/login`, стрим и куки для курса про протокол, статика. + +Обработчики одни на все четыре спецификации: имена интерфейсов в них совпадают, +значит совпадают и `operationId`, а `js-playwright` просто подмножество, у него +нет постов и комментариев. Лишние ключи glue не смотрит, а отсутствующий +обработчик находит на старте и падает громко. Типы генерируются по `http-api`, +как по самой полной. Снаружи всё сшивает Caddy на `$PORT`. ```text Caddy :$PORT -├── :4010 fastify весь http-api, rpc, echo, стрим, куки, статика, swagger-ui -├── :4012 prism http-protocol -├── :4013 prism js-playwright -└── :4014 prism postman +└── :4010 fastify все четыре спецификации, rpc, echo, стрим, куки, + статика, swagger-ui ``` Список приложений и путь к документации задаёт `app.config.json`: имя приложения плюс `docRoute` дают маршрут вида `/http-api-openapi`. -В `Caddyfile` два разных механизма, и разница между ними решает, какой путь -увидит бэкенд. Директива `handle_path /http-protocol/*` **срезает** префикс, -поэтому prism получает `/tasks`. Директива `handle /http-api/*` префикс -оставляет, поэтому приложение регистрирует полные пути. Префикс приложению -подставляет не Caddy, а опция `prefix` у glue: в спецификации он вынесен в -`servers` (`@server("/http-api")`), а сам glue `servers` не применяет. +В `Caddyfile` везде `handle`, а не `handle_path`: префикс не срезается, и +приложение регистрирует полные пути. Подставляет его не Caddy, а опция `prefix` +у glue: в спецификации префикс вынесен в `servers` (`@server("/http-api")`), а +сам glue `servers` не применяет. + +Отдельно в `Caddyfile` стоят четыре `redir` на адреса документации со слешем на +конце. Причина не в Caddy: `swagger-ui` регистрирует на этот путь и `GET`, и +и `HEAD`, который добавляет fastify, а `fastify-allow` запоминает последний +метод, поэтому в `Allow` остаётся только `HEAD`, а браузерный `GET` получает 405. +Ссылка со слешем живая: урок `crud` курса http-api ведёт на +`/http-api-openapi/#/Tasks`, а фрагмент после решётки до сервера не доходит. -## У `http-api` мока нет, у остальных трёх он динамический +## Мока prism больше нет -В `bin/start.sh` подняты три мока, и все с флагом `-d`. Спецификации `http-api` -среди них нет. +`bin/start.sh` поднимает приложение и Caddy, и больше ничего. Зависимость на +`@stoplight/prism-cli` снята. -Динамический режим генерирует данные faker'ом: тот не смотрит на объявленный -тип, поэтому при `uint16` (0..65535) выдавал `"id":-39177245`, а ответы менялись -на каждый запрос. Статичный режим отдаёт примеры из спецификации дословно, то -есть на любой `/tasks/{id}` приходит одна и та же запись, а `skip` и `limit` -возвращаются такими, как записаны в примере. Уроки курса http-api не работают ни -на том, ни на другом, поэтому эта спецификация ушла в приложение целиком. +Ответ приходил без разбора запроса, и режимов было два, оба негодные. +Динамический генерировал данные faker'ом: тот не смотрит на объявленный тип, +поэтому при `uint16` (0..65535) выдавал `"id":-39177245`, а ответы менялись на +каждый запрос. Статичный отдавал примеры дословно, то есть на любой `/tasks/{id}` +приходила одна и та же запись, а `skip` и `limit` возвращались такими, как +записаны в примере. -Три остальные остаются динамическими, потому что примеров в них нет: статичный -режим отдал бы вместо данных заглушки вида `"string"`. Чтобы перевести любую из -них на статику, сначала заводят `@example` во всех её моделях. +Уроки всех четырёх курсов учат ровно на том, чего мок не умеет. В курсе Postman +это было особенно заметно: урок `200-complex-requests` просит `?limit=2` и +получал четыре записи с `limit` равным 10928880, а `/users/3` отдавал +пользователя 52956988 с латинским именем. ## Спецификация задаёт поведение, а не описывает его @@ -120,7 +132,8 @@ Caddy :$PORT ## Коды ответов несут уроки -На этих кодах построены самостоятельные работы: +На этих кодах построены самостоятельные работы. Таблица действует на все четыре +спецификации, различия между ними только в том, какие операции чем закрыты: | Запрос | Код | Кто отдаёт | | --- | --- | --- | @@ -130,6 +143,7 @@ Caddy :$PORT | `?skip=-1` | 422 | формат `uint16`, объявленный в `index.js` | | `POST /posts` без токена | 401 | `securityHandlers` по `@useAuth` | | `GET /courses` без ключа | 401 | `securityHandlers` по `@useAuth` | +| `GET /postman/tasks/1` без Basic | 401 | `securityHandlers` по `@useAuth` | | `GET /tasks/999` | 404 | обработчик в `handlers.ts` | | `POST /posts` с токеном | 201 | обработчик в `handlers.ts` | | `DELETE /tasks/1` | 204 | обработчик в `handlers.ts` | @@ -143,14 +157,11 @@ Caddy :$PORT ## Версии прибиты не для порядка -`@stoplight/prism-cli` стоит **точной** версией `5.14.2`: начиная с 5.15 в -ответы дописываются случайные поля, которых нет в схеме, и флаг -`--json-schema-faker-fillProperties=false` этого не снимает. Для учебного сервера -это мусор в примерах уроков. - -`--multiprocess=false` тоже обязателен: многопроцессный режим prism обращается к -`cluster.default.isPrimary`, которого на текущих node нет, и контейнер падает на -старте. +Зависимости на prism больше нет. Если мок когда-нибудь вернут, с ним вернутся и +две прибитые мины: версия нужна точная, `5.14.2`, потому что с 5.15 он дописывает +в ответы случайные поля вне схемы, и обязателен `--multiprocess=false`, потому что +многопроцессный режим обращается к `cluster.default.isPrimary`, которого на +текущих node нет, и контейнер падает на старте. `@typespec/*` держатся диапазоном, а не `latest`. На `latest` очередной релиз сломал сборку молча: в 1.x пакеты `versioning` и `openapi` выделены в отдельные, @@ -160,9 +171,15 @@ Caddy :$PORT `make test` сначала перегенерирует типы и падает, если сгенерированное в репозитории отстало от спецификации, затем поднимает приложение и проверяет -ответы запросами: -совпадение данных REST и RPC, коды из таблицы выше, границы `uint16`. Нужна -скомпилированная спецификация, то есть сначала `make setup` либо `make compile`. +ответы запросами по всем четырём префиксам: пагинацию, `select`, отбор по пути, +вложенные ресурсы, состав коллекций, схемы авторизации, коды из таблицы выше, +границы `uint16`, совпадение данных REST и RPC и совпадение примеров +спецификации с наборами. Нужна скомпилированная спецификация, то есть сначала +`make setup` либо `make compile`. + +Устаревший `tsp-output/` виден именно здесь: `check-generated` перегенерирует +типы из него и падает на `git diff`, хотя спецификации в репозитории не менялись. +Лечится `make compile`. Caddy в прогоне не участвует, в раннере его нет: порты опрашиваются напрямую, как это делает Caddy со срезанным префиксом. Сборка гоняется и на пуллреквестах, diff --git a/Caddyfile b/Caddyfile index b92dab3..7a19f9e 100644 --- a/Caddyfile +++ b/Caddyfile @@ -3,6 +3,16 @@ # Апстримы указаны адресом, а не именем localhost: и prism, и приложение слушают # только IPv4 (0.0.0.0), а localhost резолвится ещё и в ::1, где не слушает никто. +# Документация со слешем на конце отвечает 405, а не страницей: swagger-ui +# регистрирует и GET, и добавленный фастифаем HEAD на один путь, а fastify-allow +# запоминает по маршруту последний метод, и в Allow остаётся только HEAD. Ссылка +# со слешем живая, урок crud курса http-api ведёт на /http-api-openapi/#/Tasks, +# поэтому адрес нормализуется здесь. +redir /http-api-openapi/ /http-api-openapi 301 +redir /http-protocol-openapi/ /http-protocol-openapi 301 +redir /js-playwright-openapi/ /js-playwright-openapi 301 +redir /postman-openapi/ /postman-openapi 301 + # http-api course # Весь курс обслуживает приложение, мока у этой спецификации больше нет. Мок # отдавал пример дословно, поэтому не применял skip, limit и select и не отбирал @@ -19,19 +29,10 @@ handle /http-api/* { } # http-protocol course -handle /http-protocol/example { - reverse_proxy 127.0.0.1:4010 -} - -handle /http-protocol/login { - reverse_proxy 127.0.0.1:4010 -} - -handle /http-protocol/stream { - reverse_proxy 127.0.0.1:4010 -} - -handle /http-protocol/removed { +# Мока у этой спецификации больше нет, весь префикс обслуживает приложение. +# Отдельный блок на /http-protocol нужен потому, что путь без слеша под +# /http-protocol/* не попадает: по нему отдаётся страница урока. +handle /http-protocol-openapi* { reverse_proxy 127.0.0.1:4010 } @@ -39,38 +40,26 @@ handle /http-protocol { reverse_proxy 127.0.0.1:4010 } -handle /http-protocol-openapi* { +handle /http-protocol/* { reverse_proxy 127.0.0.1:4010 } -handle_path /http-protocol/* { - reverse_proxy 127.0.0.1:4012 -} - # js-playwright course -handle /js-playwright/users-list { - reverse_proxy 127.0.0.1:4010 -} - handle /js-playwright-openapi* { reverse_proxy 127.0.0.1:4010 } -handle_path /js-playwright/* { - reverse_proxy 127.0.0.1:4013 -} - -# postman course -handle /postman/cookie { +handle /js-playwright/* { reverse_proxy 127.0.0.1:4010 } +# postman course handle /postman-openapi* { reverse_proxy 127.0.0.1:4010 } -handle_path /postman/* { - reverse_proxy 127.0.0.1:4014 +handle /postman/* { + reverse_proxy 127.0.0.1:4010 } # js-dom-testing-library course diff --git a/bin/smoke-test.js b/bin/smoke-test.js index acf7d78..c170593 100755 --- a/bin/smoke-test.js +++ b/bin/smoke-test.js @@ -465,6 +465,125 @@ const run = async () => { `Allow: ${allowHeader.headers.get('allow')}`, ); + console.log('\nОстальные три спецификации ведут себя так же'); + // Ожидания выписаны здесь заново, а не взяты из кода: прогон утверждает + // поведение спецификаций. Матрица снята с typespec//services/, и различия + // в ней настоящие: задачи курса Postman закрыты Basic, включая чтение одной + // задачи, а у js-playwright есть только задачи с пользователями и всё открыто. + const OTHER_SPECS = [ + { + prefix: 'http-protocol', + collections: ['tasks', 'users', 'posts', 'comments'], + nested: true, + guarded: [['DELETE', '/users/1', 'bearer'], ['POST', '/posts', 'bearer']], + open: [['GET', '/tasks/1'], ['POST', '/tasks']], + }, + { + prefix: 'js-playwright', + collections: ['tasks', 'users'], + nested: false, + guarded: [], + open: [['GET', '/tasks/1'], ['POST', '/users'], ['DELETE', '/users/1']], + }, + { + prefix: 'postman', + collections: ['tasks', 'users', 'posts', 'comments'], + nested: true, + guarded: [['GET', '/tasks/1', 'basic'], ['POST', '/tasks', 'basic'], ['DELETE', '/users/1', 'bearer']], + open: [['GET', '/tasks'], ['POST', '/users']], + }, + ]; + + const bodyFor = (path) => { + if (path.startsWith('/tasks')) return { title: 'title', description: 'description' }; + if (path.startsWith('/users')) { + return { email: 'john@mail.com', firstName: 'John', lastName: 'Doe', password: 'secret' }; + } + if (path.startsWith('/posts')) return { title: 'title', body: 'body' }; + return { postId: 1, body: 'body' }; + }; + + const credentials = { + bearer: 'Bearer any-value', + basic: `Basic ${Buffer.from('user:pass').toString('base64')}`, + }; + + for (const spec of OTHER_SPECS) { + const send = (method, path, scheme) => { + const headers = {}; + if (scheme) headers.Authorization = credentials[scheme]; + const hasBody = method === 'POST' || method === 'PATCH'; + if (hasBody) headers['Content-Type'] = 'application/json'; + return getJson(`${APP}/${spec.prefix}${path}`, { + method, + headers, + body: hasBody ? JSON.stringify(bodyFor(path)) : undefined, + }); + }; + + const page = await send('GET', '/users?skip=3&limit=2'); + check( + `${spec.prefix}: skip=3&limit=2 применяются`, + JSON.stringify(page.body?.users) === JSON.stringify(expectedUsers.slice(3, 5)) + && page.body?.total === expectedUsers.length, + JSON.stringify(page.body), + ); + const selected = await send('GET', '/users?select=firstName'); + check( + `${spec.prefix}: select оставляет id и запрошенное поле`, + JSON.stringify(Object.keys(selected.body?.users?.[0] ?? {})) === JSON.stringify(['id', 'firstName']), + JSON.stringify(selected.body?.users?.[0]), + ); + const third = await send('GET', '/users/3'); + check( + `${spec.prefix}: /users/3 отдаёт третьего пользователя`, + JSON.stringify(third.body) === JSON.stringify(expectedUsers[2]), + JSON.stringify(third.body), + ); + const missing = await send('GET', '/users/999'); + check(`${spec.prefix}: /users/999 → 404`, missing.status === 404, `получено ${missing.status}`); + const wrongMethod = await send('DELETE', '/users'); + check(`${spec.prefix}: DELETE по коллекции → 405`, wrongMethod.status === 405, `получено ${wrongMethod.status}`); + const badRange = await send('GET', '/users?skip=-1'); + check(`${spec.prefix}: отрицательный skip → 422`, badRange.status === 422, `получено ${badRange.status}`); + + for (const name of ['tasks', 'users', 'posts', 'comments']) { + const declared = spec.collections.includes(name); + const { status } = await send('GET', `/${name}`); + check( + `${spec.prefix}/${name} ${declared ? 'отвечает 200' : 'не объявлена'}`, + declared ? status === 200 : status === 404, + `получено ${status}`, + ); + } + + if (spec.nested) { + const own = await send('GET', '/users/1/posts'); + check( + `${spec.prefix}: /users/1/posts отбирает по автору`, + JSON.stringify(own.body?.posts) === JSON.stringify(expectedPosts.filter((post) => post.authorId === 1)), + `постов ${own.body?.posts?.length}`, + ); + } + + for (const [method, path, scheme] of spec.guarded) { + const without = await send(method, path); + check(`${spec.prefix}: ${method} ${path} без ${scheme} → 401`, without.status === 401, `получено ${without.status}`); + const withCreds = await send(method, path, scheme); + check(`${spec.prefix}: ${method} ${path} с ${scheme} проходит`, withCreds.status < 400, `получено ${withCreds.status}`); + } + + for (const [method, path] of spec.open) { + const { status } = await send(method, path); + check(`${spec.prefix}: ${method} ${path} открыт`, status < 400, `получено ${status}`); + } + + // Создание везде 201: три спецификации объявляли обычный ответ, и урок + // api-testing курса Playwright из-за этого не проходил. + const created = await send('POST', '/users'); + check(`${spec.prefix}: POST /users → 201`, created.status === 201, `получено ${created.status}`); + } + console.log('\nЧисла в ответах не выходят за uint16'); for (const url of [TASKS, `${TASKS}/1`, USERS, `${USERS}/1`, POSTS, `${POSTS}/1`, COMMENTS]) { const path = url.replace(APP, ''); diff --git a/bin/start.sh b/bin/start.sh index 4282c39..c054262 100755 --- a/bin/start.sh +++ b/bin/start.sh @@ -23,14 +23,10 @@ stop_all() { trap 'stop_all' INT TERM -# У спецификации http-api мока нет: все её маршруты обслуживает приложение, см. -# custom-server/src/resources.js. Мок отдаёт ответ, не разбирая запрос, а уроки -# курса построены на skip, limit, select и на идентификаторе в пути. -# Остальные три спецификации остаются на -d осознанно: примеров в них нет, и -# статичный режим отдал бы вместо данных заглушки вида "string". -start_service prism-http-protocol "npx prism mock --multiprocess=false -d --json-schema-faker-fillProperties=false -p 4012 --host 0.0.0.0 ./tsp-output/http-protocol/@typespec/openapi3/openapi.1.0.yaml" -start_service prism-js-playwright "npx prism mock --multiprocess=false -d --json-schema-faker-fillProperties=false -p 4013 --host 0.0.0.0 ./tsp-output/js-playwright/@typespec/openapi3/openapi.1.0.yaml" -start_service prism-postman "npx prism mock --multiprocess=false -d --json-schema-faker-fillProperties=false -p 4014 --host 0.0.0.0 ./tsp-output/postman/@typespec/openapi3/openapi.1.0.yaml" +# Моков prism больше нет ни у одной спецификации: все четыре обслуживает +# приложение, маршруты строятся по самой спецификации. Мок отдавал ответ, не +# разбирая запрос, а уроки построены на skip, limit, select и на идентификаторе +# в пути. start_service app "npm start" start_service caddy "caddy run" diff --git a/custom-server/src/index.js b/custom-server/src/index.js index 4f1a3e2..1e56bcd 100644 --- a/custom-server/src/index.js +++ b/custom-server/src/index.js @@ -9,7 +9,7 @@ import fastifyCookie from '@fastify/cookie'; import appConfig from '../../app.config.json' with {type: 'json'} import setUpRpc from './rpc.js'; -import setUpHttpApi from './http-api.ts'; +import setUpSpec from './openapi-spec.ts'; const { dirname } = import.meta; @@ -48,6 +48,7 @@ const setupDocs = async (app) => { }) await app.register(fp((instance) => Promise.all(getPromises(instance)))); + }; // Опции самого экземпляра fastify: fastify-cli подхватывает этот экспорт, но // только с флагом --options. Без флага ajv не узнает про формат ниже, сборка @@ -159,10 +160,12 @@ export default async (app, _options) => { // REST-маршруты коллекций обслуживаются приложением, а не моком prism: см. // шапку custom-server/src/routes.js. - // Маршруты курса HTTP API. Отдельным плагином, потому что внутри свой - // обработчик ошибок: валидация по спецификации отвечает 400, а уроки учат - // на 422. - await app.register(setUpHttpApi); + // Маршруты всех четырёх спецификаций. Каждая своим плагином, потому что внутри + // свой обработчик ошибок: валидация по спецификации отвечает 400, а уроки учат + // на 422. Список тот же, что задаёт маршруты документации. + for (const name of appConfig.apps) { + await app.register(setUpSpec, { name }); + } app.get('/postman/cookie', (req, res) => { res.setCookie('myCookie', 'cookieValue', { diff --git a/custom-server/src/http-api.ts b/custom-server/src/openapi-spec.ts similarity index 58% rename from custom-server/src/http-api.ts rename to custom-server/src/openapi-spec.ts index abefd29..f7fbb65 100644 --- a/custom-server/src/http-api.ts +++ b/custom-server/src/openapi-spec.ts @@ -1,10 +1,16 @@ -// Эндпоинты курса HTTP API. +// Эндпоинты одной спецификации. Плагин регистрируется по разу на каждую из +// четырёх: http-api, http-protocol, js-playwright, postman. Имя приходит +// параметром, список лежит в app.config.json, он же задаёт маршруты документации. // // Маршруты, валидация запроса и проверка авторизации не написаны здесь, а // взяты из спецификации: fastify-openapi-glue строит по ней конфигурацию // fastify. Спецификация при этом остаётся той же, что читает студент в // документации, поэтому поведение и документация не могут разъехаться. // +// Отдельным плагином на спецификацию, а не одним на все: внутри свой обработчик +// ошибок и свои хуки, и они должны действовать только на маршруты этой +// спецификации. +// // Раньше эти же маршруты отдавал мок prism. Мок возвращает пример дословно и // запрос не разбирает: skip, limit и select не применялись, а на любой // /tasks/{id} приходила одна и та же запись. Уроки курса учат ровно на этом. @@ -15,12 +21,17 @@ import glue from 'fastify-openapi-glue'; import serviceHandlers from './handlers.ts'; -const SPEC = 'tsp-output/http-api/@typespec/openapi3/openapi.1.0.yaml'; +// Обработчики одни на все четыре спецификации: имена интерфейсов в них совпадают, +// поэтому совпадают и operationId, а js-playwright просто подмножество, у него нет +// постов и комментариев. Лишние ключи glue не смотрит, а отсутствующий обработчик +// он находит на старте и падает громко. -// Значения токена и ключа сервер не проверяет, важно только наличие заголовка: -// урок authentication показывает разницу между запросом с ним и без него, а не -// работу настоящей проверки. Схемы взяты из спецификации, там это -// @useAuth(BearerAuth) у постов с комментариями и ApiKeyAuth у курсов. +// Значения токена, ключа и пароля сервер не проверяет, важно только наличие +// заголовка: урок authentication показывает разницу между запросом с ним и без +// него, а не работу настоящей проверки. Схемы взяты из спецификаций, там это +// @useAuth(BearerAuth) у постов с комментариями, ApiKeyAuth у курсов и BasicAuth +// у задач курса Postman. Basic встречается только там, и снимать его нельзя: +// урок про авторизацию в Postman разбирает именно этот способ. const securityHandlers = { BearerAuth: async (req) => { if (!/^Bearer\s+\S/i.test(req.headers.authorization ?? '')) { @@ -32,9 +43,14 @@ const securityHandlers = { throw new Error('нужен заголовок X-API-KEY'); } }, + BasicAuth: async (req) => { + if (!/^Basic\s+\S/i.test(req.headers.authorization ?? '')) { + throw new Error('нужен заголовок Authorization со схемой Basic'); + } + }, }; -export default async (app) => { +export default async (app, { name }) => { // Схема ответа снимается там, где у операции есть select. OpenAPI не умеет // сказать «набор полей ответа зависит от параметра запроса», поэтому // сериализатор падает на записи без lastName, хотя ответ верный. Валидация @@ -60,11 +76,11 @@ export default async (app) => { }); await app.register(glue, { - specification: SPEC, + specification: `tsp-output/${name}/@typespec/openapi3/openapi.1.0.yaml`, serviceHandlers, securityHandlers, // Пути в спецификации записаны без префикса, он вынесен в servers // (@server("/http-api") в TypeSpec). Сам glue servers не применяет. - prefix: 'http-api', + prefix: name, }); }; diff --git a/package-lock.json b/package-lock.json index 8f209ad..505fcf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@fastify/swagger": "^9.8.1", "@fastify/swagger-ui": "^6.1.1", "@openapitools/openapi-generator-cli": "^2.40.1", - "@stoplight/prism-cli": "5.14.2", "@typespec/compiler": "^1.15.0", "@typespec/http": "^1.15.0", "@typespec/openapi": "^1.15.0", @@ -81,22 +80,6 @@ "node": ">=12" } }, - "node_modules/@faker-js/faker": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.5.0.tgz", - "integrity": "sha512-bsxD8WLS5lIj7aaoCx1YJkktqYj5vlBUE6HWzu2Q51ksrGJ0H737ECCKlFU7Yf8Br45z9t99frBp/J7kzbMPAg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0", - "npm": ">=10" - } - }, "node_modules/@fastify/accept-negotiator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.0.0.tgz", @@ -1421,32 +1404,9 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, "license": "MIT" }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", @@ -1564,18 +1524,6 @@ } } }, - "node_modules/@nodable/entities": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", - "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, "node_modules/@nuxtjs/opencollective": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", @@ -1707,13 +1655,6 @@ "node": ">=22" } }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "hasInstallScript": true, - "license": "Apache-2.0" - }, "node_modules/@seriousme/openapi-schema-validator": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.1.tgz", @@ -1730,852 +1671,181 @@ "validate-api": "bin/validate-api-cli.js" } }, - "node_modules/@stoplight/http-spec": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@stoplight/http-spec/-/http-spec-7.1.0.tgz", - "integrity": "sha512-Z2XqKX2SV8a1rrgSzFqccX2TolfcblT+l4pNvUU+THaLl50tKDoeidwWWZTzYUzqU0+UV97ponvqEbWWN3PaXg==", - "license": "Apache-2.0", + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", "dependencies": { - "@stoplight/json": "^3.18.1", - "@stoplight/json-schema-generator": "1.0.2", - "@stoplight/types": "14.1.0", - "@types/json-schema": "7.0.11", - "@types/swagger-schema-official": "~2.0.22", - "@types/type-is": "^1.6.3", - "fnv-plus": "^1.3.1", - "lodash": "^4.17.21", - "openapi3-ts": "^2.0.2", - "postman-collection": "^4.1.3", - "tslib": "^2.6.2", - "type-is": "^1.6.18" + "debug": "^4.4.3", + "token-types": "^6.1.1" }, "engines": { - "node": ">=14.13" - } - }, - "node_modules/@stoplight/http-spec/node_modules/@stoplight/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.0.tgz", - "integrity": "sha512-fL8Nzw03+diALw91xHEHA5Q0WCGeW9WpPgZQjodNUWogAgJ56aJs03P9YzsQ1J6fT7/XjDqHMgn7/RlsBzB/SQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" + "node": ">=18" }, - "engines": { - "node": "^12.20 || >=14.13" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@stoplight/json": { - "version": "3.21.7", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", - "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", - "license": "Apache-2.0", - "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.3", - "@stoplight/path": "^1.3.2", - "@stoplight/types": "^13.6.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" - }, - "engines": { - "node": ">=8.3.0" - } + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" }, - "node_modules/@stoplight/json-schema-generator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-generator/-/json-schema-generator-1.0.2.tgz", - "integrity": "sha512-FzSLFoIZc6Lmw3oRE7kU6YUrl5gBmUs//rY59jdFipBoSyTPv5NyqeyTg5mvT6rY1F3qTLU3xgzRi/9Pb9eZpA==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "json-promise": "1.1.x", - "minimist": "1.2.6", - "mkdirp": "0.5.x", - "pretty-data": "0.40.x" - }, - "bin": { - "json-schema-generator": "bin/cli.js" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" }, - "node_modules/@stoplight/json-schema-generator/node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, "license": "MIT" }, - "node_modules/@stoplight/json-schema-merge-allof": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-merge-allof/-/json-schema-merge-allof-0.7.8.tgz", - "integrity": "sha512-JTDt6GYpCWQSb7+UW1P91IAp/pcLWis0mmEzWVFcLsrNgtUYK7JLtYYz0ZPSR4QVL0fJ0YQejM+MPq5iNDFO4g==", - "license": "MIT", - "dependencies": { - "compute-lcm": "^1.1.0", - "json-schema-compare": "^0.2.2", - "lodash": "^4.17.4" - } + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" }, - "node_modules/@stoplight/json-schema-ref-parser": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-10.0.0.tgz", - "integrity": "sha512-EibmayoGsMCIJOEKNvmsrAq37/M7A/rceY8ZAKX8rhwPThgkJ4QTPF0VhgGyfuq9P6i0EQQXM/x6nL7S2uPGsQ==", - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@stoplight/path": "^1.3.2", - "@stoplight/yaml": "^4.0.2", - "call-me-maybe": "^1.0.1", - "url": "^0.11.3" - } + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" }, - "node_modules/@stoplight/json-schema-sampler": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-sampler/-/json-schema-sampler-0.3.0.tgz", - "integrity": "sha512-G7QImi2xr9+8iPEg0D9YUi1BWhIiiEm19aMb91oWBSdxuhezOAqqRP3XNY6wczHV9jLWW18f+KkghTy9AG0BQA==", + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.7", - "json-pointer": "^0.6.1" + "@types/node": "*" } }, - "node_modules/@stoplight/json/node_modules/@stoplight/types": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", - "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", - "license": "Apache-2.0", + "node_modules/@types/node": { + "version": "22.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", + "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" - }, - "engines": { - "node": "^12.20 || >=14.13" + "undici-types": "~6.19.2" } }, - "node_modules/@stoplight/json/node_modules/safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", "license": "MIT" }, - "node_modules/@stoplight/ordered-object-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", - "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/@stoplight/path": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", - "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", - "license": "Apache-2.0", + "node_modules/@typespec/asset-emitter": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@typespec/asset-emitter/-/asset-emitter-0.79.1.tgz", + "integrity": "sha512-53s3GLu5BwNkl7Itr/OizfhymTV2u7k5/cwjUOAt03AUDfiKlwbsp+iCIsq1vccJuoDOiXOceJOfL8rAf4/9LQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "^1.10.0" } }, - "node_modules/@stoplight/prism-cli": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/@stoplight/prism-cli/-/prism-cli-5.14.2.tgz", - "integrity": "sha512-S/x47zQa7NgoGAD0Q1JlijV7GRDd1zP/FcIpxSh+cJRUUImfALJJm1R3ONLweP97oG/b9BrwRyC+0GNYuzrviw==", - "license": "Apache-2.0", + "node_modules/@typespec/compiler": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-1.15.0.tgz", + "integrity": "sha512-NbCIRAIzyozchlSaGPVuyV43bC+y+OpXYCuT+8M8kt35Ln9zWzLFcIt7irofQ5QUXBZrHsBFpI5fTOFdCGeWCA==", + "license": "MIT", "dependencies": { - "@stoplight/json": "3.21.7", - "@stoplight/json-schema-ref-parser": "9.2.7", - "@stoplight/prism-core": "^5.8.0", - "@stoplight/prism-http": "5.12.0", - "@stoplight/prism-http-server": "^5.12.0", - "@stoplight/types": "^14.1.0", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "fp-ts": "^2.11.5", - "json-schema-faker": "0.5.8", - "jsonrepair": "^3.12.0", - "lodash": "^4.17.21", - "node-fetch": "^2.6.5", - "pino": "^6.13.3", - "signale": "^1.4.0", - "split2": "^4.2.0", - "tslib": "^2.3.1", - "uri-template-lite": "^22.9.0", - "urijs": "^1.19.11", - "yargs": "^16.2.0" + "@babel/code-frame": "^7.29.0", + "@inquirer/prompts": "^8.4.1", + "ajv": "^8.18.0", + "change-case": "^5.4.4", + "env-paths": "^4.0.0", + "is-unicode-supported": "^2.1.0", + "mustache": "^4.2.0", + "picocolors": "^1.1.1", + "prettier": "^3.9.5", + "semver": "^7.7.4", + "tar": "^7.5.21", + "temporal-polyfill": "^1.0.1", + "vscode-languageserver": "^10.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "yaml": "^2.8.3", + "yargs": "^18.0.0" }, "bin": { - "prism": "dist/index.js" + "tsp": "cmd/tsp.js", + "tsp-server": "cmd/tsp-server.js" }, "engines": { - "node": ">=18.20.1" + "node": ">=22.0.0" } }, - "node_modules/@stoplight/prism-cli/node_modules/@faker-js/faker": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-6.3.1.tgz", - "integrity": "sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ==", - "license": "MIT", + "node_modules/@typespec/compiler/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/@stoplight/json-schema-ref-parser": { - "version": "9.2.7", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-9.2.7.tgz", - "integrity": "sha512-1vNzJ7iSrFTAFNbZHPyhI6GiJJw74+WaV61bARUQEDR4Jm80f9s0Tq9uCvGoMYwIFmWDJAoTiyegnUs6SvVxDw==", - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@stoplight/path": "^1.3.2", - "@stoplight/yaml": "^4.0.2", - "call-me-maybe": "^1.0.1", - "fastestsmallesttextencoderdecoder": "^1.0.22", - "isomorphic-fetch": "^3.0.0", - "node-abort-controller": "^3.0.1" + "node": ">=10" } }, - "node_modules/@stoplight/prism-cli/node_modules/@stoplight/prism-http": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@stoplight/prism-http/-/prism-http-5.12.0.tgz", - "integrity": "sha512-H+B/SO4SgQ6DT3CHIDCMQFGOe48Yecj0Eu+6rXwrs5m1JFyA2nlDwz+r73QJLGQanN4Biod2s0V9pZRcs2JnPA==", - "license": "Apache-2.0", - "dependencies": { - "@faker-js/faker": "^6.0.0", - "@stoplight/http-spec": "^7.0.3", - "@stoplight/json": "3.21.7", - "@stoplight/json-schema-merge-allof": "0.7.8", - "@stoplight/json-schema-ref-parser": "9.2.7", - "@stoplight/json-schema-sampler": "0.3.0", - "@stoplight/prism-core": "^5.8.0", - "@stoplight/types": "^14.1.0", - "@stoplight/yaml": "^4.2.3", - "abstract-logging": "^2.0.1", - "accepts": "^1.3.7", - "ajv": "^8.4.0", - "ajv-formats": "^2.1.1", - "caseless": "^0.12.0", - "chalk": "^4.1.2", - "content-type": "^1.0.4", - "fp-ts": "^2.11.5", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "json-schema-faker": "0.5.8", - "lodash": "^4.17.21", - "node-fetch": "^2.6.5", - "parse-multipart-data": "^1.5.0", - "pino": "^6.13.3", - "seedrandom": "^3.0.5", - "tslib": "^2.3.1", - "type-is": "^1.6.18", - "uri-template-lite": "^22.9.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=18.20.1" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@typespec/http": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-1.15.0.tgz", + "integrity": "sha512-LNyzYHyX3C0xyQQ262jhvIaVzTn7DqiDB2gz45w1m6ngJH9ArGU8XjO3o7PaZkl/nuB5MTpImnsXpHIV1rbi4Q==", "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=22.0.0" }, "peerDependencies": { - "ajv": "^8.0.0" + "@typespec/compiler": "^1.15.0", + "@typespec/streams": "^0.85.0" }, "peerDependenciesMeta": { - "ajv": { + "@typespec/streams": { "optional": true } } }, - "node_modules/@stoplight/prism-cli/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, + "node_modules/@typespec/openapi": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-1.15.0.tgz", + "integrity": "sha512-lHd3H5W23KOIGKyBPKpBLPHVOxcxuvqOBXGqlyPvGmHDgmD74mrUtHWxNoGx+QQESjx4tS8Tu6URNQBU6y6Q1Q==", + "license": "MIT", "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=22.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "peerDependencies": { + "@typespec/compiler": "^1.15.0", + "@typespec/http": "^1.15.0" } }, - "node_modules/@stoplight/prism-cli/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/@typespec/openapi3": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-1.15.0.tgz", + "integrity": "sha512-Gc6OjBiAtPo3ohlkrDxQKt8+xdeR54tC+Cgu3YLlxUxrWHWYOfWQXzp4NX+sraiFjF6kX7t0G1A1kY7rgy73qw==", "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/pino": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", - "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", - "dependencies": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.8", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^1.0.2" + "@scalar/json-magic": "^0.12.15", + "@scalar/openapi-parser": "^0.28.6", + "@scalar/openapi-types": "^0.9.1", + "@typespec/asset-emitter": "^0.79.1", + "yaml": "^2.8.3" }, "bin": { - "pino": "bin.js" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" - }, - "node_modules/@stoplight/prism-cli/node_modules/process-warning": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" - }, - "node_modules/@stoplight/prism-cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@stoplight/prism-cli/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@stoplight/prism-core": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@stoplight/prism-core/-/prism-core-5.16.0.tgz", - "integrity": "sha512-akuIOfe2jvyPbAu9XOIXP+UpiVl+rctU8laJsxvWsFX2X4m8rANTWC2/682/f35MtJv3h5jCYB4tAt8qJWx/OA==", - "license": "Apache-2.0", - "dependencies": { - "@scarf/scarf": "^1.4.0", - "fp-ts": "^2.11.5", - "lodash": "^4.17.21", - "pino": "^6.13.3", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=24.18.0" - } - }, - "node_modules/@stoplight/prism-core/node_modules/pino": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", - "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", - "license": "MIT", - "dependencies": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.8", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^1.0.2" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/@stoplight/prism-core/node_modules/pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", - "license": "MIT" - }, - "node_modules/@stoplight/prism-core/node_modules/process-warning": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "license": "MIT" - }, - "node_modules/@stoplight/prism-core/node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "node_modules/@stoplight/prism-http": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@stoplight/prism-http/-/prism-http-5.16.0.tgz", - "integrity": "sha512-+ZDU+33I3K7+uO2Ma1dZBgQRD4RarfBzHQcU/o3VMA850ez39H7AqJpMugeG2xKnzzzs8DNA442K2wfT1Ve9NA==", - "license": "Apache-2.0", - "dependencies": { - "@faker-js/faker": "^10.4.0", - "@scarf/scarf": "^1.4.0", - "@stoplight/http-spec": "^7.1.0", - "@stoplight/json": "3.21.7", - "@stoplight/json-schema-merge-allof": "0.7.8", - "@stoplight/json-schema-ref-parser": "10.0.0", - "@stoplight/json-schema-sampler": "0.3.0", - "@stoplight/prism-core": "^5.16.0", - "@stoplight/types": "^14.1.0", - "@stoplight/yaml": "^4.2.3", - "abstract-logging": "^2.0.1", - "accepts": "^1.3.7", - "ajv": "^8.20.0", - "ajv-formats": "^2.1.1", - "caseless": "^0.12.0", - "chalk": "^4.1.2", - "content-type": "^1.0.4", - "fp-ts": "^2.11.5", - "http-proxy-agent": "^9.0.0", - "https-proxy-agent": "^9.0.0", - "json-schema-faker": "0.5.8", - "lodash": "^4.17.23", - "node-fetch": "^2.6.5", - "parse-multipart-data": "^1.5.0", - "pino": "^6.13.3", - "seedrandom": "^3.0.5", - "tslib": "^2.3.1", - "type-is": "^1.6.18", - "uri-template-lite": "^22.9.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=24.18.0" - } - }, - "node_modules/@stoplight/prism-http-server": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@stoplight/prism-http-server/-/prism-http-server-5.16.0.tgz", - "integrity": "sha512-vdbxE45cNjm4DNg/4igLqrS+9LyL5TSrf3FUYGDLBRcW5YGd5JvDdoMOi7nlAnilK9gpa2cHQbxEYkomZkJj7Q==", - "license": "Apache-2.0", - "dependencies": { - "@scarf/scarf": "^1.4.0", - "@stoplight/prism-core": "^5.16.0", - "@stoplight/prism-http": "^5.16.0", - "@stoplight/types": "^14.1.0", - "fast-xml-parser": "^5.5.7", - "fp-ts": "^2.11.5", - "io-ts": "^2.2.16", - "lodash": "^4.17.23", - "micri": "^4.3.0", - "node-fetch": "^2.6.5", - "parse-prefer-header": "1.0.0", - "tslib": "^2.3.1", - "type-is": "^1.6.18" - }, - "engines": { - "node": ">=24.18.0" - } - }, - "node_modules/@stoplight/prism-http/node_modules/agent-base": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", - "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@stoplight/prism-http/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@stoplight/prism-http/node_modules/https-proxy-agent": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", - "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", - "license": "MIT", - "dependencies": { - "agent-base": "9.0.0", - "debug": "^4.3.4", - "proxy-agent-negotiate": "1.1.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@stoplight/prism-http/node_modules/pino": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", - "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", - "license": "MIT", - "dependencies": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.8", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^1.0.2" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/@stoplight/prism-http/node_modules/pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", - "license": "MIT" - }, - "node_modules/@stoplight/prism-http/node_modules/process-warning": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "license": "MIT" - }, - "node_modules/@stoplight/prism-http/node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "node_modules/@stoplight/types": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", - "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" - }, - "engines": { - "node": "^12.20 || >=14.13" - } - }, - "node_modules/@stoplight/yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz", - "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==", - "license": "Apache-2.0", - "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.5", - "@stoplight/types": "^14.1.1", - "@stoplight/yaml-ast-parser": "0.0.50", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=10.8" - } - }, - "node_modules/@stoplight/yaml-ast-parser": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz", - "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==", - "license": "Apache-2.0" - }, - "node_modules/@tokenizer/inflate": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "token-types": "^6.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" - }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "license": "MIT" - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "22.7.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", - "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/swagger-schema-official": { - "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.25.tgz", - "integrity": "sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==", - "license": "MIT" - }, - "node_modules/@types/type-is": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.7.tgz", - "integrity": "sha512-gEsh7n8824nusZ2Sidh6POxNsIdTSvIAl5gXbeFj+TUaD1CO2r4i7MQYNMfEQkChU42s2bVWAda6x6BzIhtFbQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "license": "MIT" - }, - "node_modules/@typespec/asset-emitter": { - "version": "0.79.1", - "resolved": "https://registry.npmjs.org/@typespec/asset-emitter/-/asset-emitter-0.79.1.tgz", - "integrity": "sha512-53s3GLu5BwNkl7Itr/OizfhymTV2u7k5/cwjUOAt03AUDfiKlwbsp+iCIsq1vccJuoDOiXOceJOfL8rAf4/9LQ==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@typespec/compiler": "^1.10.0" - } - }, - "node_modules/@typespec/compiler": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-1.15.0.tgz", - "integrity": "sha512-NbCIRAIzyozchlSaGPVuyV43bC+y+OpXYCuT+8M8kt35Ln9zWzLFcIt7irofQ5QUXBZrHsBFpI5fTOFdCGeWCA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@inquirer/prompts": "^8.4.1", - "ajv": "^8.18.0", - "change-case": "^5.4.4", - "env-paths": "^4.0.0", - "is-unicode-supported": "^2.1.0", - "mustache": "^4.2.0", - "picocolors": "^1.1.1", - "prettier": "^3.9.5", - "semver": "^7.7.4", - "tar": "^7.5.21", - "temporal-polyfill": "^1.0.1", - "vscode-languageserver": "^10.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "yaml": "^2.8.3", - "yargs": "^18.0.0" - }, - "bin": { - "tsp": "cmd/tsp.js", - "tsp-server": "cmd/tsp-server.js" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@typespec/compiler/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typespec/http": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@typespec/http/-/http-1.15.0.tgz", - "integrity": "sha512-LNyzYHyX3C0xyQQ262jhvIaVzTn7DqiDB2gz45w1m6ngJH9ArGU8XjO3o7PaZkl/nuB5MTpImnsXpHIV1rbi4Q==", - "license": "MIT", - "engines": { - "node": ">=22.0.0" - }, - "peerDependencies": { - "@typespec/compiler": "^1.15.0", - "@typespec/streams": "^0.85.0" - }, - "peerDependenciesMeta": { - "@typespec/streams": { - "optional": true - } - } - }, - "node_modules/@typespec/openapi": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-1.15.0.tgz", - "integrity": "sha512-lHd3H5W23KOIGKyBPKpBLPHVOxcxuvqOBXGqlyPvGmHDgmD74mrUtHWxNoGx+QQESjx4tS8Tu6URNQBU6y6Q1Q==", - "license": "MIT", - "engines": { - "node": ">=22.0.0" - }, - "peerDependencies": { - "@typespec/compiler": "^1.15.0", - "@typespec/http": "^1.15.0" - } - }, - "node_modules/@typespec/openapi3": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-1.15.0.tgz", - "integrity": "sha512-Gc6OjBiAtPo3ohlkrDxQKt8+xdeR54tC+Cgu3YLlxUxrWHWYOfWQXzp4NX+sraiFjF6kX7t0G1A1kY7rgy73qw==", - "license": "MIT", - "dependencies": { - "@scalar/json-magic": "^0.12.15", - "@scalar/openapi-parser": "^0.28.6", - "@scalar/openapi-types": "^0.9.1", - "@typespec/asset-emitter": "^0.79.1", - "yaml": "^2.8.3" - }, - "bin": { - "tsp-openapi3": "cmd/tsp-openapi3.js" + "tsp-openapi3": "cmd/tsp-openapi3.js" }, "engines": { "node": ">=22.0.0" @@ -2642,19 +1912,6 @@ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", @@ -2789,30 +2046,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anynum": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", - "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -2894,23 +2127,6 @@ "node": ">=10.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", @@ -2923,18 +2139,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -2993,34 +2197,6 @@ "node": ">= 0.4" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3049,15 +2225,6 @@ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, - "node_modules/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -3279,27 +2446,6 @@ "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "license": "MIT" }, - "node_modules/compute-gcd": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", - "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "node_modules/compute-lcm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", - "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", - "dependencies": { - "compute-gcd": "^1.2.1", - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, "node_modules/concurrently": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.4.tgz", @@ -3380,15 +2526,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -3405,15 +2542,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3654,14 +2782,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3838,15 +2958,6 @@ "fast-decode-uri-component": "^1.0.1" } }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -3893,51 +3004,6 @@ "fast-string-width": "^3.0.2" } }, - "node_modules/fast-xml-builder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", - "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.6.2", - "xml-naming": "^0.3.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.1.tgz", - "integrity": "sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^3.0.0", - "fast-xml-builder": "^1.2.0", - "is-unsafe": "^2.0.0", - "path-expression-matcher": "^1.6.2", - "strnum": "^2.4.1", - "xml-naming": "^0.3.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0" - }, "node_modules/fastify": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.12.0.tgz", @@ -4179,27 +3245,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-my-way": { "version": "9.7.0", "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.7.0.tgz", @@ -4226,17 +3271,6 @@ "node": ">=6" } }, - "node_modules/flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, - "node_modules/fnv-plus": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz", - "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==", - "license": "MIT" - }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -4257,12 +3291,6 @@ } } }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "license": "MIT" - }, "node_modules/form-data": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", @@ -4279,18 +3307,6 @@ "node": ">= 6" } }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "license": "MIT" - }, - "node_modules/fp-ts": { - "version": "2.16.11", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz", - "integrity": "sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==", - "license": "MIT" - }, "node_modules/fs-extra": { "version": "11.4.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", @@ -4305,19 +3321,6 @@ "node": ">=14.14" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4454,18 +3457,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -4484,12 +3475,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/handler-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/handler-agent/-/handler-agent-0.2.0.tgz", - "integrity": "sha512-cUduQxa5p3TFtGmb55mrRbkk/3EJCsLSeFrCIuTakQHQlYVWXeW2L9IUQUHyoHLI4UgpBNaN2JrZ0He1jPu+vg==", - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4587,12 +3572,6 @@ "node": ">= 20" } }, - "node_modules/http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "license": "Apache-2.0" - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -4606,18 +3585,6 @@ "node": ">= 6" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4644,15 +3611,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/io-ts": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz", - "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==", - "license": "MIT", - "peerDependencies": { - "fp-ts": "^2.5.0" - } - }, "node_modules/ip-address": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", @@ -4671,22 +3629,6 @@ "node": ">= 10" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -4702,34 +3644,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-in-ssh": { @@ -4780,15 +3701,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-safe-filename": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", @@ -4813,18 +3725,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-unsafe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", - "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/is-wsl": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", @@ -4860,16 +3760,6 @@ "dev": true, "license": "ISC" }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "node_modules/iterare": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", @@ -4927,94 +3817,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "license": "MIT", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-promise": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/json-promise/-/json-promise-1.1.8.tgz", - "integrity": "sha512-rz31P/7VfYnjQFrF60zpPTT0egMPlc8ZvIQHWs4ZtNZNnAXRmXo6oS+6eyWr5sEMG03OVhklNrTXxiIRYzoUgQ==", - "license": "MIT", - "dependencies": { - "bluebird": "*" - } - }, - "node_modules/json-schema-compare": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", - "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.4" - } - }, - "node_modules/json-schema-faker": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.8.tgz", - "integrity": "sha512-sqzPEbEDlpiH8U1tfmJHScXHy52onvMxITPsHyhe/jhS83g8TX6ruvRqt/ot1bXUPRsh7Ps1sWqJiBxIXmW5Xw==", - "license": "MIT", - "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^10.1.0" - }, - "bin": { - "jsf": "bin/gen.cjs" - } - }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "node_modules/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-schema-ref-resolver": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", @@ -5047,12 +3849,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/jsonc-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", - "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", - "license": "MIT" - }, "node_modules/jsonfile": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", @@ -5065,24 +3861,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonpath-plus": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", - "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==", - "license": "MIT", - "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", @@ -5092,15 +3870,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsonrepair": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.13.2.tgz", - "integrity": "sha512-Leuly0nbM4R+S5SVJk3VHfw1oxnlEK9KygdZvfUtEtTawNDyzB4qa1xWTmFt1aeoA7sXZkVTRuIixJ8bAvqVUg==", - "license": "ISC", - "bin": { - "jsonrepair": "bin/cli.js" - } - }, "node_modules/leven": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-4.1.0.tgz", @@ -5124,15 +3893,6 @@ "set-cookie-parser": "^2.6.0" } }, - "node_modules/liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, "node_modules/load-esm": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", @@ -5152,20 +3912,6 @@ "node": ">=13.2.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -5185,12 +3931,6 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, "node_modules/lru-cache": { "version": "11.4.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.4.0.tgz", @@ -5225,27 +3965,6 @@ "node": ">= 0.4" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micri": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/micri/-/micri-4.5.1.tgz", - "integrity": "sha512-AtvnSBGFglNr+iqs5gufpHT9xRXUabgu9vYEnQYPXSBs+nLSBvmUS5Mzg+3LJ9eQBrNA1o5M49WeqiX1f+d2sg==", - "license": "MIT", - "dependencies": { - "handler-agent": "0.2.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -5267,15 +3986,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-format": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", - "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", - "license": "Apache-2.0", - "dependencies": { - "charset": "^1.0.0" - } - }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", @@ -5333,18 +4043,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5369,15 +4067,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/netmask": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", @@ -5387,12 +4076,6 @@ "node": ">= 0.4.0" } }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -5413,14 +4096,6 @@ } } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-check-updates": { "version": "23.0.2", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-23.0.2.tgz", @@ -5436,18 +4111,6 @@ "npm": ">=10.0.0" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ohash": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", @@ -5473,15 +4136,6 @@ "wrappy": "1" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "license": "MIT", - "dependencies": { - "format-util": "^1.0.3" - } - }, "node_modules/open": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", @@ -5509,24 +4163,6 @@ "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", "license": "MIT" }, - "node_modules/openapi3-ts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", - "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", - "license": "MIT", - "dependencies": { - "yaml": "^1.10.2" - } - }, - "node_modules/openapi3-ts/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5621,33 +4257,6 @@ "quickjs-wasi": "^2.2.0" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-multipart-data": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz", - "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==", - "license": "MIT" - }, - "node_modules/parse-prefer-header": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-prefer-header/-/parse-prefer-header-1.0.0.tgz", - "integrity": "sha512-+WJ3ncCrKOExuxF06XyKWS8bLkLttnlm6YPMZIFIUXNd09Xy0N2JISudxCaY+luDm43yTnHMHVU3zte4G2gN4g==", - "license": "MIT", - "dependencies": { - "lodash.camelcase": "^4.3.0" - } - }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5657,21 +4266,6 @@ "node": ">=4" } }, - "node_modules/path-expression-matcher": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", - "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5727,26 +4321,6 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "engines": { - "node": ">=4" - } - }, "node_modules/pino": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", @@ -5803,100 +4377,35 @@ "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", - "secure-json-parse": "^4.0.0", - "sonic-boom": "^4.0.1", - "strip-json-comments": "^5.0.2" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, - "node_modules/pino-std-serializers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", - "license": "MIT" - }, - "node_modules/pino/node_modules/process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dependencies": { - "p-limit": "^1.1.0" + "secure-json-parse": "^4.0.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^5.0.2" }, - "engines": { - "node": ">=4" + "bin": { + "pino-pretty": "bin.js" } }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/pkg-types": { "version": "2.3.1", @@ -5922,53 +4431,6 @@ "node": ">=8" } }, - "node_modules/postman-collection": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", - "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", - "license": "Apache-2.0", - "dependencies": { - "@faker-js/faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.35", - "postman-url-encoder": "3.0.5", - "semver": "7.6.3", - "uuid": "8.3.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection/node_modules/@faker-js/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "deprecated": "Please update to a newer version.", - "license": "MIT" - }, - "node_modules/postman-collection/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/postman-url-encoder": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", - "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", - "license": "Apache-2.0", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/powershell-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", @@ -5997,15 +4459,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-data": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", - "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/process-warning": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", @@ -6099,31 +4552,6 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -6189,15 +4617,6 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6355,12 +4774,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" - }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -6420,78 +4833,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -6504,86 +4845,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -6659,12 +4920,6 @@ "readable-stream": "^3.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -6709,14 +4964,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-json-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", @@ -6729,21 +4976,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", - "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "anynum": "^1.0.1" - } - }, "node_modules/strtok3": { "version": "10.3.5", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", @@ -6828,18 +5060,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause" }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toad-cache": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", @@ -6953,19 +5173,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -7019,61 +5226,12 @@ "node": ">= 10.0.0" } }, - "node_modules/uri-template-lite": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.9.0.tgz", - "integrity": "sha512-cmGZaykSWEQ5UXKaGKnUS8zFvfp8j1Jvn7dlq3P7tGd5XeybXcfo0xnVBRWiNEp80nO1GYgCLwoaRJ8WMmmk3Q==", - "license": "MIT" - }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" - }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -7081,39 +5239,6 @@ "dev": true, "license": "MIT" }, - "node_modules/validate.io-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", - "license": "MIT" - }, - "node_modules/validate.io-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" - }, - "node_modules/validate.io-integer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", - "dependencies": { - "validate.io-number": "^1.0.3" - } - }, - "node_modules/validate.io-integer-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", - "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-integer": "^1.0.4" - } - }, - "node_modules/validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" - }, "node_modules/vscode-jsonrpc": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", @@ -7182,21 +5307,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -7260,21 +5370,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xml-naming": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", - "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 284e8d8..6682785 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "@fastify/swagger": "^9.8.1", "@fastify/swagger-ui": "^6.1.1", "@openapitools/openapi-generator-cli": "^2.40.1", - "@stoplight/prism-cli": "5.14.2", "@typespec/compiler": "^1.15.0", "@typespec/http": "^1.15.0", "@typespec/openapi": "^1.15.0", diff --git a/typespec/http-protocol/main.tsp b/typespec/http-protocol/main.tsp index 45fb3ac..fc0edff 100644 --- a/typespec/http-protocol/main.tsp +++ b/typespec/http-protocol/main.tsp @@ -2,10 +2,13 @@ import "@typespec/http"; import "@typespec/rest"; import "@typespec/versioning"; +// authService здесь не подключён намеренно. По адресу /http-protocol/login +// живёт рукописный эндпоинт: курс про протокол разбирает отправку формы через +// telnet и печатает в уроке ответ `Done!` с Content-Length: 5. Спецификация же +// описывала выдачу токена, то есть то, чего этот адрес никогда не отдавал. import "./services/usersService.tsp"; import "./services/postsService.tsp"; import "./services/commentsService.tsp"; -import "./services/authService.tsp"; import "./services/coursesService.tsp"; import "./services/tasksService.tsp"; diff --git a/typespec/http-protocol/services/authService.tsp b/typespec/http-protocol/services/authService.tsp deleted file mode 100644 index b9532c5..0000000 --- a/typespec/http-protocol/services/authService.tsp +++ /dev/null @@ -1,14 +0,0 @@ -import "@typespec/http"; -import "../models/error.tsp"; -import "../models/auth.tsp"; - -using TypeSpec.Http; - -namespace AppService; - -@tag("Auth") -@route("/login") -interface AuthService { - @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...AuthData): AuthToken; -} diff --git a/typespec/http-protocol/services/commentsService.tsp b/typespec/http-protocol/services/commentsService.tsp index 6c3101c..66b12e7 100644 --- a/typespec/http-protocol/services/commentsService.tsp +++ b/typespec/http-protocol/services/commentsService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/comment.tsp"; import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,6 +18,7 @@ namespace AppService; @route("/comments") interface CommentService { @get + @operationId("commentServiceList") op list( @query skip?: uint16 = 0, @query limit?: uint16 = 30, @@ -19,21 +26,25 @@ interface CommentService { ): Comments; @get + @operationId("commentServiceGet") op get( @path id: string, @query select?: string - ): Comment; + ): Comment | NotFoundResponse; @useAuth(BearerAuth) @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCommentDto): Comment; + @operationId("commentServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCommentDto): CreatedResponse & Comment; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCommentDto): Comment; + @operationId("commentServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCommentDto): Comment | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("commentServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/http-protocol/services/coursesService.tsp b/typespec/http-protocol/services/coursesService.tsp index 31f2a0a..1c95d4c 100644 --- a/typespec/http-protocol/services/coursesService.tsp +++ b/typespec/http-protocol/services/coursesService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/course.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -13,24 +19,29 @@ namespace AppService; @useAuth(ApiKeyAuth) interface CourseService { @get + @operationId("courseServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Courses; @get + @operationId("courseServiceGet") op get( @path id: string, @query select?: string - ): Course; + ): Course | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): Course; + @operationId("courseServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): CreatedResponse & Course; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course; + @operationId("courseServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("courseServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/http-protocol/services/postsService.tsp b/typespec/http-protocol/services/postsService.tsp index 4ef969e..9a003da 100644 --- a/typespec/http-protocol/services/postsService.tsp +++ b/typespec/http-protocol/services/postsService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/post.tsp"; import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,6 +18,7 @@ namespace AppService; @route("/posts") interface PostService { @get + @operationId("postServiceList") op list( @query skip?: uint16 = 0, @query limit?: uint16 = 30, @@ -19,24 +26,29 @@ interface PostService { ): Posts; @get + @operationId("postServiceGet") op get( @path id: string, @query select?: string - ): Post; + ): Post | NotFoundResponse; @useAuth(BearerAuth) @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewPostDto): Post; + @operationId("postServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewPostDto): CreatedResponse & Post; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditPostDto): Post; + @operationId("postServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditPostDto): Post | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("postServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; @route("/{postId}/comments") + @operationId("postServiceGetComments") op getComments( @path postId: string, @query skip?: uint16 = 0, diff --git a/typespec/http-protocol/services/tasksService.tsp b/typespec/http-protocol/services/tasksService.tsp index 9a35b0a..901fbea 100644 --- a/typespec/http-protocol/services/tasksService.tsp +++ b/typespec/http-protocol/services/tasksService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/task.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,24 +18,29 @@ namespace AppService; @route("/tasks") interface TaskService { @get + @operationId("taskServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Tasks; @get + @operationId("taskServiceGet") op get( @path id: string, @query select?: string - ): Task; + ): Task | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): Task; + @operationId("taskServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): CreatedResponse & Task; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task; + @operationId("taskServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("taskServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/http-protocol/services/usersService.tsp b/typespec/http-protocol/services/usersService.tsp index c2e23cd..5d0367b 100644 --- a/typespec/http-protocol/services/usersService.tsp +++ b/typespec/http-protocol/services/usersService.tsp @@ -1,4 +1,9 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/user.tsp"; import "../models/post.tsp"; @@ -7,6 +12,7 @@ import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -15,30 +21,36 @@ namespace AppService; @route("/users") interface UserService { @get + @operationId("userServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Users; @get + @operationId("userServiceGet") op get( @path id: string, @query select?: string - ): User; + ): User | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): User; + @operationId("userServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): CreatedResponse & User; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User; + @operationId("userServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("userServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; @route("/{authorId}/posts") + @operationId("userServiceGetPosts") op getPosts( @path authorId: string, @query skip?: uint16 = 0, @@ -47,6 +59,7 @@ interface UserService { ): Posts; @route("/{authorId}/comments") + @operationId("userServiceGetComments") op getComments( @path authorId: string, @query skip?: uint16 = 0, diff --git a/typespec/js-playwright/services/authService.tsp b/typespec/js-playwright/services/authService.tsp index b9532c5..70b8fd5 100644 --- a/typespec/js-playwright/services/authService.tsp +++ b/typespec/js-playwright/services/authService.tsp @@ -1,8 +1,14 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "../models/error.tsp"; import "../models/auth.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; namespace AppService; @@ -10,5 +16,6 @@ namespace AppService; @route("/login") interface AuthService { @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...AuthData): AuthToken; + @operationId("authServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...AuthData): CreatedResponse & AuthToken; } diff --git a/typespec/js-playwright/services/coursesService.tsp b/typespec/js-playwright/services/coursesService.tsp index 31f2a0a..1c95d4c 100644 --- a/typespec/js-playwright/services/coursesService.tsp +++ b/typespec/js-playwright/services/coursesService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/course.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -13,24 +19,29 @@ namespace AppService; @useAuth(ApiKeyAuth) interface CourseService { @get + @operationId("courseServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Courses; @get + @operationId("courseServiceGet") op get( @path id: string, @query select?: string - ): Course; + ): Course | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): Course; + @operationId("courseServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): CreatedResponse & Course; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course; + @operationId("courseServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("courseServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/js-playwright/services/tasksService.tsp b/typespec/js-playwright/services/tasksService.tsp index 9a35b0a..901fbea 100644 --- a/typespec/js-playwright/services/tasksService.tsp +++ b/typespec/js-playwright/services/tasksService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/task.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,24 +18,29 @@ namespace AppService; @route("/tasks") interface TaskService { @get + @operationId("taskServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Tasks; @get + @operationId("taskServiceGet") op get( @path id: string, @query select?: string - ): Task; + ): Task | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): Task; + @operationId("taskServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): CreatedResponse & Task; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task; + @operationId("taskServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("taskServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/js-playwright/services/usersService.tsp b/typespec/js-playwright/services/usersService.tsp index fcb7fe7..9cc169d 100644 --- a/typespec/js-playwright/services/usersService.tsp +++ b/typespec/js-playwright/services/usersService.tsp @@ -1,10 +1,16 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/user.tsp"; import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -13,24 +19,29 @@ namespace AppService; @route("/users") interface UserService { @get + @operationId("userServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Users; @get + @operationId("userServiceGet") op get( @path id: string, @query select?: string - ): User; + ): User | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): User; + @operationId("userServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): CreatedResponse & User; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User; + @operationId("userServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("userServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/postman/services/authService.tsp b/typespec/postman/services/authService.tsp index b9532c5..70b8fd5 100644 --- a/typespec/postman/services/authService.tsp +++ b/typespec/postman/services/authService.tsp @@ -1,8 +1,14 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "../models/error.tsp"; import "../models/auth.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; namespace AppService; @@ -10,5 +16,6 @@ namespace AppService; @route("/login") interface AuthService { @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...AuthData): AuthToken; + @operationId("authServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...AuthData): CreatedResponse & AuthToken; } diff --git a/typespec/postman/services/commentsService.tsp b/typespec/postman/services/commentsService.tsp index 6c3101c..66b12e7 100644 --- a/typespec/postman/services/commentsService.tsp +++ b/typespec/postman/services/commentsService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/comment.tsp"; import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,6 +18,7 @@ namespace AppService; @route("/comments") interface CommentService { @get + @operationId("commentServiceList") op list( @query skip?: uint16 = 0, @query limit?: uint16 = 30, @@ -19,21 +26,25 @@ interface CommentService { ): Comments; @get + @operationId("commentServiceGet") op get( @path id: string, @query select?: string - ): Comment; + ): Comment | NotFoundResponse; @useAuth(BearerAuth) @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCommentDto): Comment; + @operationId("commentServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCommentDto): CreatedResponse & Comment; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCommentDto): Comment; + @operationId("commentServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCommentDto): Comment | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("commentServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/postman/services/coursesService.tsp b/typespec/postman/services/coursesService.tsp index 31f2a0a..1c95d4c 100644 --- a/typespec/postman/services/coursesService.tsp +++ b/typespec/postman/services/coursesService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/course.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -13,24 +19,29 @@ namespace AppService; @useAuth(ApiKeyAuth) interface CourseService { @get + @operationId("courseServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Courses; @get + @operationId("courseServiceGet") op get( @path id: string, @query select?: string - ): Course; + ): Course | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): Course; + @operationId("courseServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewCourseDto): CreatedResponse & Course; @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course; + @operationId("courseServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditCourseDto): Course | NotFoundResponse; @delete - op delete(@path id: string): void; + @operationId("courseServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/postman/services/postsService.tsp b/typespec/postman/services/postsService.tsp index 4ef969e..9a003da 100644 --- a/typespec/postman/services/postsService.tsp +++ b/typespec/postman/services/postsService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/post.tsp"; import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,6 +18,7 @@ namespace AppService; @route("/posts") interface PostService { @get + @operationId("postServiceList") op list( @query skip?: uint16 = 0, @query limit?: uint16 = 30, @@ -19,24 +26,29 @@ interface PostService { ): Posts; @get + @operationId("postServiceGet") op get( @path id: string, @query select?: string - ): Post; + ): Post | NotFoundResponse; @useAuth(BearerAuth) @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewPostDto): Post; + @operationId("postServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewPostDto): CreatedResponse & Post; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditPostDto): Post; + @operationId("postServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditPostDto): Post | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("postServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; @route("/{postId}/comments") + @operationId("postServiceGetComments") op getComments( @path postId: string, @query skip?: uint16 = 0, diff --git a/typespec/postman/services/tasksService.tsp b/typespec/postman/services/tasksService.tsp index 87bbb0e..d8bdf52 100644 --- a/typespec/postman/services/tasksService.tsp +++ b/typespec/postman/services/tasksService.tsp @@ -1,9 +1,15 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/task.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -12,28 +18,33 @@ namespace AppService; @route("/tasks") interface TaskService { @get + @operationId("taskServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Tasks; @useAuth(BasicAuth) @get + @operationId("taskServiceGet") op get( @path id: string, @query select?: string - ): Task; + ): Task | NotFoundResponse; @useAuth(BasicAuth) @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): Task; + @operationId("taskServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewTaskDto): CreatedResponse & Task; @useAuth(BasicAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task; + @operationId("taskServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditTaskDto): Task | NotFoundResponse; @useAuth(BasicAuth) @delete - op delete(@path id: string): void; + @operationId("taskServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; } diff --git a/typespec/postman/services/usersService.tsp b/typespec/postman/services/usersService.tsp index c2e23cd..5d0367b 100644 --- a/typespec/postman/services/usersService.tsp +++ b/typespec/postman/services/usersService.tsp @@ -1,4 +1,9 @@ +// Эти маршруты обслуживает приложение, а не мок prism, см. custom-server/src/openapi-spec.ts. +// Спецификация описывает настоящее поведение: skip, limit и select применяются, +// вложенные ресурсы отбирают записи по родителю, а запрос несуществующей записи +// отвечает 404. import "@typespec/http"; +import "@typespec/openapi"; import "@typespec/rest"; import "../models/user.tsp"; import "../models/post.tsp"; @@ -7,6 +12,7 @@ import "../models/error.tsp"; using TypeSpec.Http; +using TypeSpec.OpenAPI; using TypeSpec.Rest; namespace AppService; @@ -15,30 +21,36 @@ namespace AppService; @route("/users") interface UserService { @get + @operationId("userServiceList") op list( - @query skip?: string, - @query limit?: string, + @query skip?: uint16 = 0, + @query limit?: uint16 = 30, @query select?: string[] ): Users; @get + @operationId("userServiceGet") op get( @path id: string, @query select?: string - ): User; + ): User | NotFoundResponse; @post - op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): User; + @operationId("userServiceCreate") + op create(@header contentType: "application/json" | "application/x-www-form-urlencoded", ...NewUserDto): CreatedResponse & User; @useAuth(BearerAuth) @patch - op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User; + @operationId("userServiceUpdate") + op update(@header contentType: "application/json" | "application/x-www-form-urlencoded", @path id: string, ...EditUserDto): User | NotFoundResponse; @useAuth(BearerAuth) @delete - op delete(@path id: string): void; + @operationId("userServiceDelete") + op delete(@path id: string): NoContentResponse | NotFoundResponse; @route("/{authorId}/posts") + @operationId("userServiceGetPosts") op getPosts( @path authorId: string, @query skip?: uint16 = 0, @@ -47,6 +59,7 @@ interface UserService { ): Posts; @route("/{authorId}/comments") + @operationId("userServiceGetComments") op getComments( @path authorId: string, @query skip?: uint16 = 0,