@kollors/react-codegen 2.0.0-alpha.1 → 2.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -1
- package/README.ru.md +60 -1
- package/dist/cli.js +16 -13
- package/dist/cli.js.map +1 -1
- package/dist/generate.d.ts +1 -0
- package/dist/generate.js +131 -53
- package/dist/generate.js.map +1 -1
- package/dist/graphql-fetcher.d.ts +24 -2
- package/dist/graphql-fetcher.js +112 -24
- package/dist/graphql-fetcher.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/openapi/document.d.ts +15 -0
- package/dist/openapi/document.js +113 -0
- package/dist/openapi/document.js.map +1 -0
- package/dist/openapi/generate.d.ts +3 -0
- package/dist/openapi/generate.js +65 -0
- package/dist/openapi/generate.js.map +1 -0
- package/dist/openapi/names.d.ts +6 -0
- package/dist/openapi/names.js +24 -0
- package/dist/openapi/names.js.map +1 -0
- package/dist/openapi/operations.d.ts +10 -0
- package/dist/openapi/operations.js +319 -0
- package/dist/openapi/operations.js.map +1 -0
- package/dist/openapi/schema.d.ts +16 -0
- package/dist/openapi/schema.js +242 -0
- package/dist/openapi/schema.js.map +1 -0
- package/dist/openapi-fetcher.d.ts +3 -14
- package/dist/openapi-fetcher.js +2 -35
- package/dist/openapi-fetcher.js.map +1 -1
- package/dist/openapi-runtime.d.ts +45 -0
- package/dist/openapi-runtime.js +291 -0
- package/dist/openapi-runtime.js.map +1 -0
- package/dist/openapi-runtime.source +302 -0
- package/dist/path-utils.d.ts +2 -0
- package/dist/path-utils.js +5 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/package.json +4 -5
- package/templates/graphql.template +5 -8
- package/templates/openapi.template +0 -45
package/README.md
CHANGED
|
@@ -18,14 +18,22 @@ Create `codegen.config.js`:
|
|
|
18
18
|
|
|
19
19
|
```js
|
|
20
20
|
export default {
|
|
21
|
+
auth: {
|
|
22
|
+
storage: 'localStorage', // 'localStorage' | 'sessionStorage' | 'cookie' | 'none'
|
|
23
|
+
key: 'accessToken',
|
|
24
|
+
scheme: 'Bearer', // false sends the token without a scheme
|
|
25
|
+
credentials: 'same-origin', // 'omit' | 'same-origin' | 'include'
|
|
26
|
+
},
|
|
21
27
|
openapi: {
|
|
22
28
|
schema: './openapi.yaml',
|
|
23
29
|
output: './src/api/openapi.ts',
|
|
30
|
+
baseUrl: 'https://api.example.com',
|
|
24
31
|
},
|
|
25
32
|
graphql: {
|
|
26
33
|
schema: './schema.graphql',
|
|
27
34
|
documents: './src/graphql',
|
|
28
35
|
output: './src/api/graphql.ts',
|
|
36
|
+
endpoint: 'https://api.example.com/graphql',
|
|
29
37
|
},
|
|
30
38
|
};
|
|
31
39
|
```
|
|
@@ -36,20 +44,61 @@ Run both configured generators with:
|
|
|
36
44
|
npx react-codegen codegen.config.js
|
|
37
45
|
```
|
|
38
46
|
|
|
39
|
-
Paths are resolved relative to the config file. A configured `openapi` section enables OpenAPI generation; a configured `graphql` section enables GraphQL generation. Omit a section to skip it. At least one section is required. Each section writes one TypeScript file. `documents` is a directory; all `.graphql` files under it, including nested directories, are included.
|
|
47
|
+
Paths are resolved relative to the config file. A configured `openapi` section enables OpenAPI generation; a configured `graphql` section enables GraphQL generation. Omit a section to skip it. At least one section is required. Each section writes one TypeScript file. `documents` is a directory; all `.graphql` files under it, including nested directories, are included. The built-in OpenAPI generator reads and generates in memory, without third-party generators, subprocesses or intermediate files. GraphQL still uses its existing generator and a temporary subdirectory inside the package's `.react-codegen-temp` directory, removed after generation. Each completed output is staged beside its destination and published with an atomic rename.
|
|
40
48
|
|
|
41
49
|
Schema values may be local paths or URLs. `output` directories are created when needed.
|
|
42
50
|
|
|
51
|
+
## OpenAPI generator
|
|
52
|
+
|
|
53
|
+
Only `schema` and `output` are required. One OpenAPI 3.0.x or 3.1.x document in YAML/JSON produces one `.ts` file with types, a fetcher, request functions and TanStack Query 5 hooks. Swagger 2.0 is rejected. The generated client does not import this package. `yaml` only parses input during generation.
|
|
54
|
+
|
|
55
|
+
For `operationId: getPet`, the output includes:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { useGetPet, getPetQuery, getPetQueryKey, fetchGetPet } from './api/openapi';
|
|
59
|
+
|
|
60
|
+
const variables = { pathParams: { id: '42' } };
|
|
61
|
+
const query = useGetPet(variables, { select: pet => pet.name });
|
|
62
|
+
await queryClient.fetchQuery(getPetQuery(variables));
|
|
63
|
+
await queryClient.invalidateQueries({ queryKey: getPetQueryKey(variables) });
|
|
64
|
+
await fetchGetPet(variables, abortController.signal);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
GET generates `useX`, `useSuspenseX`, `xQuery`, `xQueryKey` and `fetchX`. Other methods generate `useX` mutations and `fetchX`, e.g. `useCreatePet().mutate({ body: pet })`. Variables group `pathParams`, `queryParams`, `headers` and `body`; required groups follow the schema. Calls with no required variables can omit the argument. Regular queries accept TanStack's `skipToken`; suspense queries require variables. Names use `operationId`, falling back to method and path; collisions report both locations.
|
|
68
|
+
|
|
69
|
+
### Supported features
|
|
70
|
+
|
|
71
|
+
- Primitive types, arrays, objects, dictionaries, enums, internal `$ref`, recursive component types, `allOf` intersections, `oneOf`/`anyOf` unions. OpenAPI 3.1 also supports boolean schemas, `const` and type arrays.
|
|
72
|
+
- `required` controls optional properties. `null` is included only when allowed by the schema. No blanket replacement of `null` with `undefined`. `readOnly`/`writeOnly` produce input/output variants when needed.
|
|
73
|
+
- Path/header `simple` parameters; query `form`, flat `deepObject` with `explode: true`, array `spaceDelimited`/`pipeDelimited` with `explode: false`. Operation parameters override path-level parameters.
|
|
74
|
+
- JSON/`+json`, text/XML as strings, binary bodies/responses as `Blob`, multipart and URL-encoded object bodies. Multiple request formats are selected in this order: JSON, `+json`, URL-encoded, multipart, other supported formats alphabetically. Responses use their actual Content-Type; successful response types form a union. `default` is a success fallback only when no explicit 2xx exists. Empty mutation responses return `undefined` with type `void`.
|
|
75
|
+
- Descriptions become comments. Dates remain strings. Numeric bounds, patterns and lengths do not add runtime validation. `oneOf` becomes a TypeScript union without checking exclusivity. `discriminator` does not invent properties or values: describe the discriminator field in the schema.
|
|
76
|
+
|
|
77
|
+
### Current limits
|
|
78
|
+
|
|
79
|
+
Generation fails with a schema location before replacing output for unsupported constructs: external `$ref` (bundle first), callbacks/webhooks, cookie parameters, parameter `content`, nested parameter objects/arrays, `allowReserved`, path `label`/`matrix`, custom form encoding, unsupported media types, and advanced JSON Schema keywords such as conditionals, `not`, dynamic references, `prefixItems`, `patternProperties` and `unevaluatedProperties`. Typed `additionalProperties` alongside named properties are rejected because a TypeScript index signature would also constrain named properties; use a separate dictionary property. Recursive types must be components; circular aliases and cyclic YAML aliases are rejected.
|
|
80
|
+
|
|
81
|
+
Fetch cannot send GET/HEAD bodies or TRACE requests. A GET response declared without a body is rejected because React Query cannot cache `undefined`; the generator does not replace it with `null`. Schema `servers` and `security` do not override configuration: use `baseUrl` and `auth`. Response headers are not returned separately. Generated types do not validate server responses at runtime.
|
|
82
|
+
|
|
83
|
+
### Migration
|
|
84
|
+
|
|
85
|
+
Regenerate the client. Usual camelCase operation names and grouped variables remain, but full export compatibility is not guaranteed. Empty context, `deepMerge`, `QueryOperation`, shared `queryKeyFn` and `@ts-nocheck` are removed. Query keys now use `[operationName, variables]`: use `xQueryKey` and clear persisted caches when upgrading. Type names use PascalCase; punctuation and underscores separate words. Errors use `OpenapiHttpError` or ordinary `Error` instead of `ErrorWrapper`. Stricter types may require call-site fixes.
|
|
86
|
+
|
|
43
87
|
## Programmatic API
|
|
44
88
|
|
|
45
89
|
```ts
|
|
46
90
|
import { generate, type CodegenConfig } from '@kollors/react-codegen';
|
|
47
91
|
|
|
48
92
|
const config: CodegenConfig = {
|
|
93
|
+
auth: {
|
|
94
|
+
storage: 'localStorage',
|
|
95
|
+
key: 'accessToken',
|
|
96
|
+
},
|
|
49
97
|
graphql: {
|
|
50
98
|
schema: './schema.graphql',
|
|
51
99
|
documents: './src/graphql',
|
|
52
100
|
output: './src/api/graphql.ts',
|
|
101
|
+
endpoint: '/graphql',
|
|
53
102
|
},
|
|
54
103
|
};
|
|
55
104
|
|
|
@@ -59,6 +108,16 @@ console.log(result.outputs);
|
|
|
59
108
|
|
|
60
109
|
Programmatic relative paths resolve from the current working directory. `generate` returns the generated output paths.
|
|
61
110
|
|
|
111
|
+
## Authentication and errors
|
|
112
|
+
|
|
113
|
+
The top-level `auth` settings apply to both generated clients. Add `auth` inside `openapi` or `graphql` to replace them for that client. Supported `storage` values are `localStorage`, `sessionStorage`, `cookie`, and `none`. If `auth` is present, `storage` is required. `key` names the stored token and is required for `localStorage`, `sessionStorage`, and `cookie`; it is not used with `none`. `scheme` defaults to `Bearer`; set it to `false` to send the token unchanged. `credentials` is optional and uses the Fetch API's default `same-origin` behavior unless set to `omit` or `include`.
|
|
114
|
+
|
|
115
|
+
If no top-level or per-section `auth` is configured, generated clients do not add an `Authorization` header. JavaScript cannot read `HttpOnly` cookies; for those, use `auth: { storage: 'none', credentials: 'include' }` and let the browser send the cookie. `graphql.endpoint` defaults to `/api/graphql`. `openapi.baseUrl` defaults to an empty prefix, leaving generated paths relative.
|
|
116
|
+
|
|
117
|
+
When using the fetcher factories directly, `getToken` may provide a custom token getter; it should return the complete `Authorization` header value.
|
|
118
|
+
|
|
119
|
+
HTTP failures are reported as `GraphqlHttpError` or `OpenapiHttpError`, with status and response details. GraphQL execution errors are reported as `GraphqlResponseError` and include all messages returned by the server.
|
|
120
|
+
|
|
62
121
|
## Development
|
|
63
122
|
|
|
64
123
|
```sh
|
package/README.ru.md
CHANGED
|
@@ -18,14 +18,22 @@ npm install -D @kollors/react-codegen@alpha
|
|
|
18
18
|
|
|
19
19
|
```js
|
|
20
20
|
export default {
|
|
21
|
+
auth: {
|
|
22
|
+
storage: 'localStorage', // 'localStorage' | 'sessionStorage' | 'cookie' | 'none'
|
|
23
|
+
key: 'accessToken',
|
|
24
|
+
scheme: 'Bearer', // false — отправлять токен без схемы
|
|
25
|
+
credentials: 'same-origin', // 'omit' | 'same-origin' | 'include'
|
|
26
|
+
},
|
|
21
27
|
openapi: {
|
|
22
28
|
schema: './openapi.yaml',
|
|
23
29
|
output: './src/api/openapi.ts',
|
|
30
|
+
baseUrl: 'https://api.example.com',
|
|
24
31
|
},
|
|
25
32
|
graphql: {
|
|
26
33
|
schema: './schema.graphql',
|
|
27
34
|
documents: './src/graphql',
|
|
28
35
|
output: './src/api/graphql.ts',
|
|
36
|
+
endpoint: 'https://api.example.com/graphql',
|
|
29
37
|
},
|
|
30
38
|
};
|
|
31
39
|
```
|
|
@@ -36,20 +44,61 @@ export default {
|
|
|
36
44
|
npx react-codegen codegen.config.js
|
|
37
45
|
```
|
|
38
46
|
|
|
39
|
-
Пути разрешаются относительно файла конфигурации. Наличие секции `openapi` запускает генерацию OpenAPI, наличие `graphql` — GraphQL. Отсутствующую секцию можно опустить; нужна хотя бы одна. Каждая секция создаёт один TypeScript-файл. `documents` — каталог: в нём и всех подпапках рекурсивно ищутся файлы `.graphql`.
|
|
47
|
+
Пути разрешаются относительно файла конфигурации. Наличие секции `openapi` запускает генерацию OpenAPI, наличие `graphql` — GraphQL. Отсутствующую секцию можно опустить; нужна хотя бы одна. Каждая секция создаёт один TypeScript-файл. `documents` — каталог: в нём и всех подпапках рекурсивно ищутся файлы `.graphql`. Собственный OpenAPI-генератор работает в памяти, без сторонних генераторов, дочерних процессов и промежуточных файлов. GraphQL пока использует прежний генератор и временную подпапку внутри `.react-codegen-temp` в каталоге пакета; после генерации она удаляется. Готовые файлы сначала записываются рядом с назначением, затем публикуются атомарным переименованием.
|
|
40
48
|
|
|
41
49
|
В `schema` можно передавать локальный путь или URL. Каталоги для `output` создаются автоматически.
|
|
42
50
|
|
|
51
|
+
## Генератор OpenAPI
|
|
52
|
+
|
|
53
|
+
Обязательны только `schema` и `output`. Один документ OpenAPI 3.0.x или 3.1.x в YAML/JSON превращается в один `.ts`-файл с типами, fetcher, функциями запросов и хуками TanStack Query 5. Swagger 2.0 не поддерживается. Готовый клиент не импортирует наш пакет. `yaml` нужен только для чтения схемы при генерации.
|
|
54
|
+
|
|
55
|
+
Для операции с `operationId: getPet`:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { useGetPet, getPetQuery, getPetQueryKey, fetchGetPet } from './api/openapi';
|
|
59
|
+
|
|
60
|
+
const variables = { pathParams: { id: '42' } };
|
|
61
|
+
const query = useGetPet(variables, { select: pet => pet.name });
|
|
62
|
+
await queryClient.fetchQuery(getPetQuery(variables));
|
|
63
|
+
await queryClient.invalidateQueries({ queryKey: getPetQueryKey(variables) });
|
|
64
|
+
await fetchGetPet(variables, abortController.signal);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Для GET создаются `useX`, `useSuspenseX`, `xQuery`, `xQueryKey` и `fetchX`. Для остальных методов — мутация `useX` и функция `fetchX`, например `useCreatePet().mutate({ body: pet })`. Аргументы сгруппированы в `pathParams`, `queryParams`, `headers` и `body`; обязательность задаёт схема. Если обязательных аргументов нет, вызов возможен без них. Обычные query принимают `skipToken` из TanStack; suspense-query требуют аргументы. Имена строятся из `operationId`, а при его отсутствии — из метода и пути. Коллизия имён сообщает оба места в схеме.
|
|
68
|
+
|
|
69
|
+
### Что поддерживается
|
|
70
|
+
|
|
71
|
+
- Примитивы, массивы, объекты, словари, enum, внутренние `$ref`, рекурсивные компоненты, пересечения `allOf`, объединения `oneOf`/`anyOf`. В OpenAPI 3.1 — также булевы схемы, `const` и массивы типов.
|
|
72
|
+
- `required` определяет необязательные поля. `null` появляется только там, где разрешён схемой. Массовой замены `null` на `undefined` нет. Для `readOnly`/`writeOnly` при необходимости создаются входные и выходные типы.
|
|
73
|
+
- Параметры пути/заголовков `simple`; query-параметры `form`, плоский `deepObject` с `explode: true`, массивы `spaceDelimited`/`pipeDelimited` с `explode: false`. Параметры операции переопределяют параметры уровня пути.
|
|
74
|
+
- JSON/`+json`, текст/XML как строки, бинарные тела/ответы как `Blob`, multipart и URL-encoded тела из объектов. При нескольких форматах запроса порядок выбора: JSON, `+json`, URL-encoded, multipart, остальные поддерживаемые форматы по алфавиту. Ответ читается по фактическому Content-Type; типы успешных ответов объединяются. `default` используется как успешный ответ только при отсутствии явных 2xx. Пустые ответы мутаций имеют тип `void` и возвращают `undefined`.
|
|
75
|
+
- Описания становятся комментариями. Даты остаются строками. Числовые границы, паттерны и длины не добавляют проверок во время выполнения. `oneOf` становится union без проверки исключительности. `discriminator` не добавляет выдуманных полей и значений: поле-дискриминатор нужно описать в схеме.
|
|
76
|
+
|
|
77
|
+
### Текущие ограничения
|
|
78
|
+
|
|
79
|
+
Неподдерживаемые конструкции вызывают ошибку с местом в схеме до замены выходного файла: внешние `$ref` (сначала объедините схему), callbacks/webhooks, cookie-параметры, `content` у параметров, вложенные объекты/массивы параметров, `allowReserved`, стили пути `label`/`matrix`, пользовательский encoding форм, неподдерживаемые Content-Type и сложные ключевые слова JSON Schema: условия, `not`, динамические ссылки, `prefixItems`, `patternProperties`, `unevaluatedProperties`. Типизированные `additionalProperties` вместе с именованными свойствами отклоняются: индексная сигнатура TypeScript ошибочно ограничила бы и именованные свойства; словарь можно вынести в отдельное свойство. Рекурсивные типы должны быть компонентами; циклические цепочки алиасов и циклические YAML-ссылки отклоняются.
|
|
80
|
+
|
|
81
|
+
Fetch не позволяет отправлять тело с GET/HEAD и выполнять TRACE. GET с описанным ответом без тела отклоняется: React Query не кеширует `undefined`, и генератор не заменяет его на `null`. `servers` и `security` из схемы не заменяют настройки: используйте `baseUrl` и `auth`. Заголовки ответа отдельно не возвращаются. Сгенерированные типы не проверяют фактические ответы сервера во время выполнения.
|
|
82
|
+
|
|
83
|
+
### Переход с прежнего генератора
|
|
84
|
+
|
|
85
|
+
Перегенерируйте клиент. Привычные camelCase имена операций и группы аргументов сохраняются, но полной совместимости всех экспортов нет. Удалены пустой контекст, `deepMerge`, `QueryOperation`, общий `queryKeyFn` и `@ts-nocheck`. Ключи кеша теперь имеют вид `[operationName, variables]`: используйте `xQueryKey` и очистите сохранённый кеш при обновлении. Имена типов приводятся к PascalCase, пунктуация и подчёркивания разделяют слова. Ошибки представлены `OpenapiHttpError` или обычным `Error` вместо `ErrorWrapper`. Более строгие типы могут потребовать исправить места вызова.
|
|
86
|
+
|
|
43
87
|
## Программный API
|
|
44
88
|
|
|
45
89
|
```ts
|
|
46
90
|
import { generate, type CodegenConfig } from '@kollors/react-codegen';
|
|
47
91
|
|
|
48
92
|
const config: CodegenConfig = {
|
|
93
|
+
auth: {
|
|
94
|
+
storage: 'localStorage',
|
|
95
|
+
key: 'accessToken',
|
|
96
|
+
},
|
|
49
97
|
graphql: {
|
|
50
98
|
schema: './schema.graphql',
|
|
51
99
|
documents: './src/graphql',
|
|
52
100
|
output: './src/api/graphql.ts',
|
|
101
|
+
endpoint: '/graphql',
|
|
53
102
|
},
|
|
54
103
|
};
|
|
55
104
|
|
|
@@ -59,6 +108,16 @@ console.log(result.outputs);
|
|
|
59
108
|
|
|
60
109
|
В программном API относительные пути считаются от текущей рабочей директории. `generate` возвращает пути созданных файлов.
|
|
61
110
|
|
|
111
|
+
## Авторизация и ошибки
|
|
112
|
+
|
|
113
|
+
Общие настройки `auth` применяются к обоим клиентам. Чтобы заменить их для одного клиента, укажите `auth` внутри `openapi` или `graphql`. Поддерживаются `storage`: `localStorage`, `sessionStorage`, `cookie` и `none`. Если секция `auth` указана, `storage` обязателен. В `key` указывается имя записи с токеном; ключ обязателен для `localStorage`, `sessionStorage` и `cookie`, но не используется с `none`. `scheme` необязателен и по умолчанию равен `Bearer`; значение `false` отправляет токен без схемы. `credentials` необязателен и по умолчанию использует поведение Fetch API `same-origin`; также доступны `omit` и `include`.
|
|
114
|
+
|
|
115
|
+
Если `auth` не задан ни глобально, ни в секции клиента, сгенерированный клиент не добавляет заголовок `Authorization`. JavaScript не может прочитать cookie с флагом `HttpOnly`; для них укажите `auth: { storage: 'none', credentials: 'include' }`, и браузер отправит cookie сам. `graphql.endpoint` по умолчанию равен `/api/graphql`. `openapi.baseUrl` по умолчанию пустой, поэтому пути из схемы остаются относительными.
|
|
116
|
+
|
|
117
|
+
При прямом использовании фабрик fetcher можно передать `getToken`; функция должна вернуть полное значение заголовка `Authorization`.
|
|
118
|
+
|
|
119
|
+
Ошибки HTTP представлены классами `GraphqlHttpError` и `OpenapiHttpError`; они содержат статус и данные ответа. Ошибки выполнения GraphQL представлены `GraphqlResponseError` со всеми сообщениями сервера.
|
|
120
|
+
|
|
62
121
|
## Разработка
|
|
63
122
|
|
|
64
123
|
```sh
|
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { dirname, isAbsolute, resolve } from 'node:path';
|
|
4
4
|
import { pathToFileURL } from 'node:url';
|
|
5
|
-
import { generate } from './generate.js';
|
|
5
|
+
import { generate, validateCodegenConfig } from './generate.js';
|
|
6
|
+
import { isUrl } from './path-utils.js';
|
|
6
7
|
const help = `Usage: react-codegen <codegen.config.js>
|
|
7
8
|
|
|
8
9
|
Generate configured OpenAPI and GraphQL clients.
|
|
@@ -15,7 +16,7 @@ function resolvePath(value, directory) {
|
|
|
15
16
|
return isAbsolute(value) ? value : resolve(directory, value);
|
|
16
17
|
}
|
|
17
18
|
function resolveSchema(value, directory) {
|
|
18
|
-
return
|
|
19
|
+
return isUrl(value) ? value : resolvePath(value, directory);
|
|
19
20
|
}
|
|
20
21
|
async function main(args) {
|
|
21
22
|
if (args.includes('--help') || args.includes('-h')) {
|
|
@@ -32,25 +33,27 @@ async function main(args) {
|
|
|
32
33
|
}
|
|
33
34
|
const configPath = resolve(args[0]);
|
|
34
35
|
const configModule = (await import(pathToFileURL(configPath).href));
|
|
35
|
-
if (!configModule.default || typeof configModule.default !== 'object') {
|
|
36
|
+
if (!configModule.default || typeof configModule.default !== 'object' || Array.isArray(configModule.default)) {
|
|
36
37
|
throw new TypeError(`${configPath} must export a configuration object as default.`);
|
|
37
38
|
}
|
|
39
|
+
validateCodegenConfig(configModule.default);
|
|
40
|
+
const sourceConfig = configModule.default;
|
|
38
41
|
const directory = dirname(configPath);
|
|
39
42
|
const config = {
|
|
40
|
-
...
|
|
41
|
-
...(
|
|
43
|
+
...sourceConfig,
|
|
44
|
+
...(sourceConfig.openapi && {
|
|
42
45
|
openapi: {
|
|
43
|
-
...
|
|
44
|
-
schema: resolveSchema(
|
|
45
|
-
output: resolvePath(
|
|
46
|
+
...sourceConfig.openapi,
|
|
47
|
+
schema: resolveSchema(sourceConfig.openapi.schema, directory),
|
|
48
|
+
output: resolvePath(sourceConfig.openapi.output, directory),
|
|
46
49
|
},
|
|
47
50
|
}),
|
|
48
|
-
...(
|
|
51
|
+
...(sourceConfig.graphql && {
|
|
49
52
|
graphql: {
|
|
50
|
-
...
|
|
51
|
-
schema: resolveSchema(
|
|
52
|
-
documents: resolvePath(
|
|
53
|
-
output: resolvePath(
|
|
53
|
+
...sourceConfig.graphql,
|
|
54
|
+
schema: resolveSchema(sourceConfig.graphql.schema, directory),
|
|
55
|
+
documents: resolvePath(sourceConfig.graphql.documents, directory),
|
|
56
|
+
output: resolvePath(sourceConfig.graphql.output, directory),
|
|
54
57
|
},
|
|
55
58
|
}),
|
|
56
59
|
};
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { CodegenConfig, CodegenResult } from './types.js';
|
|
2
2
|
/** Generate configured OpenAPI and GraphQL clients into one TypeScript file per enabled section. */
|
|
3
3
|
export declare function generate(config: CodegenConfig): Promise<CodegenResult>;
|
|
4
|
+
export declare function validateCodegenConfig(config: unknown): asserts config is CodegenConfig;
|
package/dist/generate.js
CHANGED
|
@@ -1,101 +1,139 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
|
-
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import {
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
4
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { generateOpenapiSource } from './openapi/generate.js';
|
|
7
|
+
import { isUrl } from './path-utils.js';
|
|
5
8
|
const packageDirectory = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
6
9
|
const templatesDirectory = join(packageDirectory, 'templates');
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
7
11
|
function outputPath(path, cwd) {
|
|
8
12
|
return isAbsolute(path) ? path : resolve(cwd, path);
|
|
9
13
|
}
|
|
10
14
|
function schemaValue(schema, cwd) {
|
|
11
|
-
return
|
|
15
|
+
return isUrl(schema) ? schema : outputPath(schema, cwd);
|
|
12
16
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
return { source: 'url', url: schema };
|
|
16
|
-
return { source: 'file', relativePath: relative(packageDirectory, schemaValue(schema, cwd)) };
|
|
17
|
+
function runCli(entryPoint, args, cwd) {
|
|
18
|
+
execFileSync(process.execPath, [entryPoint, ...args], { cwd, stdio: 'inherit' });
|
|
17
19
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
function createProjectTempDirectory(cwd, prefix) {
|
|
22
|
-
const baseDirectory = join(cwd, '.react-codegen-temp');
|
|
20
|
+
function createTempDirectory(prefix) {
|
|
21
|
+
const baseDirectory = join(packageDirectory, '.react-codegen-temp');
|
|
23
22
|
mkdirSync(baseDirectory, { recursive: true });
|
|
24
23
|
return mkdtempSync(join(baseDirectory, prefix));
|
|
25
24
|
}
|
|
26
|
-
function generateOpenapi(config, cwd) {
|
|
27
|
-
const tempDirectory = createProjectTempDirectory(packageDirectory, 'openapi-');
|
|
28
|
-
const output = outputPath(config.output, cwd);
|
|
25
|
+
async function generateOpenapi(config, auth, cwd) {
|
|
29
26
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
writeFileSync(fetcherPath, fetcher);
|
|
36
|
-
const template = readFileSync(join(templatesDirectory, 'openapi.template'), 'utf8');
|
|
37
|
-
const configText = template
|
|
38
|
-
.replaceAll('%OPENAPI_SOURCE%', JSON.stringify(openapiSource(config.schema, cwd)))
|
|
39
|
-
.replaceAll('%FILENAME%', JSON.stringify(output))
|
|
40
|
-
.replaceAll('%OUTPUT_DIR%', JSON.stringify(relative(packageDirectory, join(tempDirectory, 'output'))))
|
|
41
|
-
.replaceAll('%FETCHER_PATH%', JSON.stringify(fetcherPath));
|
|
42
|
-
const configPath = join(tempDirectory, 'openapi.codegen.ts');
|
|
43
|
-
writeFileSync(configPath, configText);
|
|
44
|
-
run('openapi-codegen', ['gen', 'openapi', '-c', relative(packageDirectory, configPath)], packageDirectory);
|
|
45
|
-
return output;
|
|
27
|
+
const content = await generateOpenapiSource(schemaValue(config.schema, cwd), {
|
|
28
|
+
...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),
|
|
29
|
+
...(auth ? { auth } : {}),
|
|
30
|
+
});
|
|
31
|
+
return { path: outputPath(config.output, cwd), content };
|
|
46
32
|
}
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Could not generate OpenAPI client from ${schemaValue(config.schema, cwd)}: ${errorMessage(error)}`, { cause: error });
|
|
49
35
|
}
|
|
50
36
|
}
|
|
51
|
-
function generateGraphql(config, cwd) {
|
|
52
|
-
const tempDirectory = createProjectTempDirectory(packageDirectory, 'graphql-');
|
|
37
|
+
function generateGraphql(config, auth, cwd) {
|
|
53
38
|
const output = outputPath(config.output, cwd);
|
|
39
|
+
const documentsDirectory = outputPath(config.documents, cwd);
|
|
40
|
+
if (!existsSync(documentsDirectory) || !statSync(documentsDirectory).isDirectory()) {
|
|
41
|
+
throw new Error(`GraphQL documents path must be an existing directory: ${documentsDirectory}`);
|
|
42
|
+
}
|
|
43
|
+
const tempDirectory = createTempDirectory('graphql-');
|
|
54
44
|
try {
|
|
55
|
-
|
|
56
|
-
const template = readFileSync(join(templatesDirectory, 'graphql.template'), 'utf8');
|
|
57
|
-
const configText = template
|
|
45
|
+
const configText = readFileSync(join(templatesDirectory, 'graphql.template'), 'utf8')
|
|
58
46
|
.replaceAll('%SCHEMA%', JSON.stringify(schemaValue(config.schema, cwd)))
|
|
59
|
-
.replaceAll('%DOCUMENTS%', JSON.stringify(`${
|
|
60
|
-
.replaceAll('%FILENAME%', JSON.stringify(
|
|
47
|
+
.replaceAll('%DOCUMENTS%', JSON.stringify(`${documentsDirectory.replace(/\/$/, '')}/**/*.graphql`))
|
|
48
|
+
.replaceAll('%FILENAME%', JSON.stringify(join(tempDirectory, 'generated.ts')));
|
|
61
49
|
const configPath = join(tempDirectory, 'graphql.codegen.ts');
|
|
62
50
|
writeFileSync(configPath, configText);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
51
|
+
const cli = join(dirname(require.resolve('@graphql-codegen/cli/package.json')), 'esm', 'bin.js');
|
|
52
|
+
runCli(cli, ['--config', configPath], packageDirectory);
|
|
53
|
+
const generatedFile = readFileSync(join(tempDirectory, 'generated.ts'), 'utf8');
|
|
54
|
+
const fetcherConfiguration = JSON.stringify({
|
|
55
|
+
...(config.endpoint ? { endpoint: config.endpoint } : {}),
|
|
56
|
+
...(auth ? { auth } : {}),
|
|
57
|
+
});
|
|
58
|
+
const fetcher = readFileSync(join(packageDirectory, 'dist', 'graphql-fetcher.js'), 'utf8')
|
|
59
|
+
.replace(/\n?\/\/# sourceMappingURL=.*$/, '')
|
|
60
|
+
.replace('createGraphqlFetcher()', `createGraphqlFetcher(${fetcherConfiguration})`);
|
|
66
61
|
const importLine = "import { graphqlFetcher } from '@kollors/react-codegen/graphql-fetcher';";
|
|
67
62
|
if (!generatedFile.includes(importLine)) {
|
|
68
63
|
throw new Error('Generated GraphQL client does not contain the expected fetcher import.');
|
|
69
64
|
}
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
const content = generatedFile
|
|
66
|
+
.replace(importLine, `${fetcher}\n`)
|
|
67
|
+
.replace(/import\s+\{\s*DocumentTypeDecoration\s*}\s+from\s+(['"])@graphql-typed-document-node\/core\1;\s*/g, '')
|
|
68
|
+
.replaceAll('DocumentTypeDecoration', 'GraphqlDocumentTypeDecoration');
|
|
69
|
+
const documentType = `interface GraphqlDocumentTypeDecoration<TResult, TVariables> {\n __apiType?: (variables: TVariables) => TResult;\n}\n\n`;
|
|
70
|
+
return { path: output, content: `// @ts-nocheck\n/* eslint-disable */\n${documentType}${content}` };
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new Error(`Could not generate GraphQL client using schema ${schemaValue(config.schema, cwd)} and documents ${outputPath(config.documents, cwd)}: ${errorMessage(error)}`, { cause: error });
|
|
72
74
|
}
|
|
73
75
|
finally {
|
|
74
76
|
rmSync(tempDirectory, { force: true, recursive: true });
|
|
75
77
|
}
|
|
76
78
|
}
|
|
79
|
+
function errorMessage(error) {
|
|
80
|
+
return error instanceof Error ? error.message : String(error);
|
|
81
|
+
}
|
|
77
82
|
function validateConfig(config) {
|
|
78
83
|
if (config === null || typeof config !== 'object' || Array.isArray(config)) {
|
|
79
84
|
throw new TypeError('Codegen config must be an object.');
|
|
80
85
|
}
|
|
81
86
|
const keys = Object.keys(config);
|
|
82
|
-
if (keys.some((key) => key !== 'openapi' && key !== 'graphql')) {
|
|
83
|
-
throw new Error(`Unknown codegen config section: ${keys.find((key) => key !== 'openapi' && key !== 'graphql')}`);
|
|
87
|
+
if (keys.some((key) => key !== 'auth' && key !== 'openapi' && key !== 'graphql')) {
|
|
88
|
+
throw new Error(`Unknown codegen config section: ${keys.find((key) => key !== 'auth' && key !== 'openapi' && key !== 'graphql')}`);
|
|
84
89
|
}
|
|
85
90
|
if (!config.openapi && !config.graphql) {
|
|
86
91
|
throw new Error('Codegen config must contain an openapi or graphql section.');
|
|
87
92
|
}
|
|
88
|
-
|
|
93
|
+
const validateAuth = (auth, location) => {
|
|
94
|
+
if (!auth || typeof auth !== 'object' || Array.isArray(auth))
|
|
95
|
+
throw new TypeError(`${location} must be an object.`);
|
|
96
|
+
const allowedAuthKeys = ['storage', 'key', 'scheme', 'credentials'];
|
|
97
|
+
const unknownKey = Object.keys(auth).find((key) => !allowedAuthKeys.includes(key));
|
|
98
|
+
if (unknownKey)
|
|
99
|
+
throw new Error(`Unknown ${location} option: ${unknownKey}`);
|
|
100
|
+
if (!['localStorage', 'sessionStorage', 'cookie', 'none'].includes(auth.storage)) {
|
|
101
|
+
throw new TypeError(`${location}.storage must be localStorage, sessionStorage, cookie, or none.`);
|
|
102
|
+
}
|
|
103
|
+
if (auth.storage !== 'none' && (typeof auth.key !== 'string' || !auth.key.trim())) {
|
|
104
|
+
throw new TypeError(`${location}.key must be a non-empty string unless storage is "none".`);
|
|
105
|
+
}
|
|
106
|
+
if (auth.key !== undefined && (typeof auth.key !== 'string' || !auth.key.trim())) {
|
|
107
|
+
throw new TypeError(`${location}.key must be a non-empty string.`);
|
|
108
|
+
}
|
|
109
|
+
if (auth.scheme !== undefined && auth.scheme !== false && (typeof auth.scheme !== 'string' || !auth.scheme.trim())) {
|
|
110
|
+
throw new TypeError(`${location}.scheme must be a non-empty string or false.`);
|
|
111
|
+
}
|
|
112
|
+
if (auth.credentials !== undefined && !['omit', 'same-origin', 'include'].includes(auth.credentials)) {
|
|
113
|
+
throw new TypeError(`${location}.credentials must be omit, same-origin, or include.`);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
if (config.auth !== undefined)
|
|
117
|
+
validateAuth(config.auth, 'config.auth');
|
|
118
|
+
for (const [kind, section] of Object.entries({ openapi: config.openapi, graphql: config.graphql })) {
|
|
119
|
+
if (section === undefined)
|
|
120
|
+
continue;
|
|
89
121
|
if (!section || typeof section !== 'object' || Array.isArray(section)) {
|
|
90
122
|
throw new TypeError(`config.${kind} must be an object.`);
|
|
91
123
|
}
|
|
92
|
-
const expectedKeys = kind === 'openapi' ? ['schema', 'output'] : ['schema', 'documents', 'output'];
|
|
124
|
+
const expectedKeys = kind === 'openapi' ? ['schema', 'output', 'baseUrl', 'auth'] : ['schema', 'documents', 'output', 'endpoint', 'auth'];
|
|
93
125
|
for (const key of Object.keys(section)) {
|
|
94
126
|
if (!expectedKeys.includes(key))
|
|
95
127
|
throw new Error(`Unknown config.${kind} option: ${key}`);
|
|
96
128
|
}
|
|
97
129
|
for (const key of expectedKeys) {
|
|
98
130
|
const value = section[key];
|
|
131
|
+
if ((key === 'baseUrl' || key === 'endpoint' || key === 'auth') && value === undefined)
|
|
132
|
+
continue;
|
|
133
|
+
if (key === 'auth') {
|
|
134
|
+
validateAuth(value, `config.${kind}.auth`);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
99
137
|
if (typeof value !== 'string' || !value.trim())
|
|
100
138
|
throw new TypeError(`config.${kind}.${key} must be a non-empty string.`);
|
|
101
139
|
}
|
|
@@ -105,15 +143,55 @@ function validateConfig(config) {
|
|
|
105
143
|
throw new Error('OpenAPI and GraphQL outputs must use different files.');
|
|
106
144
|
}
|
|
107
145
|
}
|
|
146
|
+
function publishOutputs(outputs) {
|
|
147
|
+
const staged = new Map();
|
|
148
|
+
const previous = new Map();
|
|
149
|
+
const published = [];
|
|
150
|
+
try {
|
|
151
|
+
for (const output of outputs) {
|
|
152
|
+
mkdirSync(dirname(output.path), { recursive: true });
|
|
153
|
+
const directory = mkdtempSync(join(dirname(output.path), '.react-codegen-publish-'));
|
|
154
|
+
const filename = join(directory, 'generated.ts');
|
|
155
|
+
staged.set(output.path, { directory, filename });
|
|
156
|
+
previous.set(output.path, existsSync(output.path) ? readFileSync(output.path) : undefined);
|
|
157
|
+
writeFileSync(filename, output.content);
|
|
158
|
+
}
|
|
159
|
+
for (const output of outputs) {
|
|
160
|
+
const stage = staged.get(output.path);
|
|
161
|
+
if (!stage)
|
|
162
|
+
throw new Error(`Could not stage generated output ${output.path}.`);
|
|
163
|
+
renameSync(stage.filename, output.path);
|
|
164
|
+
published.push(output.path);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
for (const path of published.reverse()) {
|
|
169
|
+
const oldContent = previous.get(path);
|
|
170
|
+
if (oldContent === undefined)
|
|
171
|
+
rmSync(path, { force: true });
|
|
172
|
+
else
|
|
173
|
+
writeFileSync(path, oldContent);
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
for (const { directory } of staged.values())
|
|
179
|
+
rmSync(directory, { force: true, recursive: true });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
108
182
|
/** Generate configured OpenAPI and GraphQL clients into one TypeScript file per enabled section. */
|
|
109
183
|
export async function generate(config) {
|
|
110
184
|
validateConfig(config);
|
|
111
185
|
const cwd = process.cwd();
|
|
112
|
-
const
|
|
186
|
+
const generated = [];
|
|
113
187
|
if (config.openapi)
|
|
114
|
-
|
|
188
|
+
generated.push(await generateOpenapi(config.openapi, config.openapi.auth ?? config.auth, cwd));
|
|
115
189
|
if (config.graphql)
|
|
116
|
-
|
|
117
|
-
|
|
190
|
+
generated.push(generateGraphql(config.graphql, config.graphql.auth ?? config.auth, cwd));
|
|
191
|
+
publishOutputs(generated);
|
|
192
|
+
return { outputs: generated.map(({ path }) => path) };
|
|
193
|
+
}
|
|
194
|
+
export function validateCodegenConfig(config) {
|
|
195
|
+
validateConfig(config);
|
|
118
196
|
}
|
|
119
197
|
//# sourceMappingURL=generate.js.map
|
package/dist/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,29 @@
|
|
|
1
|
+
import type { AuthConfig } from './types.js';
|
|
1
2
|
export interface GraphqlFetcherConfiguration {
|
|
3
|
+
/** GraphQL endpoint; defaults to `/api/graphql`. */
|
|
2
4
|
endpoint?: string;
|
|
5
|
+
/** Custom value for the `Authorization` header. When omitted, no authorization header is added unless `auth` is configured. */
|
|
3
6
|
getToken?: () => string | null | undefined;
|
|
7
|
+
/** Token storage and fetch credential settings. */
|
|
8
|
+
auth?: AuthConfig;
|
|
9
|
+
/** Headers applied after the authorization header, so callers can replace it explicitly. */
|
|
4
10
|
headers?: HeadersInit;
|
|
5
11
|
}
|
|
6
|
-
export declare
|
|
7
|
-
|
|
12
|
+
export declare class GraphqlHttpError extends Error {
|
|
13
|
+
readonly status: number;
|
|
14
|
+
readonly statusText: string;
|
|
15
|
+
readonly endpoint: string;
|
|
16
|
+
readonly body: unknown;
|
|
17
|
+
constructor(status: number, statusText: string, endpoint: string, body: unknown);
|
|
18
|
+
}
|
|
19
|
+
export declare class GraphqlResponseError extends Error {
|
|
20
|
+
readonly errors: Array<{
|
|
21
|
+
message: string;
|
|
22
|
+
}>;
|
|
23
|
+
readonly data: unknown;
|
|
24
|
+
constructor(errors: Array<{
|
|
25
|
+
message: string;
|
|
26
|
+
}>, data: unknown);
|
|
27
|
+
}
|
|
28
|
+
export declare function createGraphqlFetcher(configuration?: GraphqlFetcherConfiguration): <TData, TVariables>(query: string, variables?: TVariables) => () => Promise<TData>;
|
|
29
|
+
export declare const graphqlFetcher: <TData, TVariables>(query: string, variables?: TVariables) => () => Promise<TData>;
|