@kollors/react-codegen 2.0.0-alpha.1 → 2.0.0-alpha.2
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 +24 -1
- package/README.ru.md +24 -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 +140 -37
- 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-fetcher.d.ts +13 -0
- package/dist/openapi-fetcher.js +149 -21
- package/dist/openapi-fetcher.js.map +1 -1
- 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 +12 -0
- package/package.json +3 -3
- package/templates/graphql.template +4 -8
- package/templates/openapi.template +7 -7
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,7 +44,7 @@ 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. Each generator uses a temporary subdirectory inside the package's `.react-codegen-temp` directory; that subdirectory is 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
|
|
|
@@ -46,10 +54,15 @@ Schema values may be local paths or URLs. `output` directories are created when
|
|
|
46
54
|
import { generate, type CodegenConfig } from '@kollors/react-codegen';
|
|
47
55
|
|
|
48
56
|
const config: CodegenConfig = {
|
|
57
|
+
auth: {
|
|
58
|
+
storage: 'localStorage',
|
|
59
|
+
key: 'accessToken',
|
|
60
|
+
},
|
|
49
61
|
graphql: {
|
|
50
62
|
schema: './schema.graphql',
|
|
51
63
|
documents: './src/graphql',
|
|
52
64
|
output: './src/api/graphql.ts',
|
|
65
|
+
endpoint: '/graphql',
|
|
53
66
|
},
|
|
54
67
|
};
|
|
55
68
|
|
|
@@ -59,6 +72,16 @@ console.log(result.outputs);
|
|
|
59
72
|
|
|
60
73
|
Programmatic relative paths resolve from the current working directory. `generate` returns the generated output paths.
|
|
61
74
|
|
|
75
|
+
## Authentication and errors
|
|
76
|
+
|
|
77
|
+
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`.
|
|
78
|
+
|
|
79
|
+
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.
|
|
80
|
+
|
|
81
|
+
When using the fetcher factories directly, `getToken` may provide a custom token getter; it should return the complete `Authorization` header value.
|
|
82
|
+
|
|
83
|
+
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.
|
|
84
|
+
|
|
62
85
|
## Development
|
|
63
86
|
|
|
64
87
|
```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,7 +44,7 @@ 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`. Для каждого генератора создаётся временная подпапка внутри `.react-codegen-temp` в каталоге пакета; после генерации она удаляется. Готовые файлы сначала записываются рядом с назначением, затем публикуются атомарным переименованием.
|
|
40
48
|
|
|
41
49
|
В `schema` можно передавать локальный путь или URL. Каталоги для `output` создаются автоматически.
|
|
42
50
|
|
|
@@ -46,10 +54,15 @@ npx react-codegen codegen.config.js
|
|
|
46
54
|
import { generate, type CodegenConfig } from '@kollors/react-codegen';
|
|
47
55
|
|
|
48
56
|
const config: CodegenConfig = {
|
|
57
|
+
auth: {
|
|
58
|
+
storage: 'localStorage',
|
|
59
|
+
key: 'accessToken',
|
|
60
|
+
},
|
|
49
61
|
graphql: {
|
|
50
62
|
schema: './schema.graphql',
|
|
51
63
|
documents: './src/graphql',
|
|
52
64
|
output: './src/api/graphql.ts',
|
|
65
|
+
endpoint: '/graphql',
|
|
53
66
|
},
|
|
54
67
|
};
|
|
55
68
|
|
|
@@ -59,6 +72,16 @@ console.log(result.outputs);
|
|
|
59
72
|
|
|
60
73
|
В программном API относительные пути считаются от текущей рабочей директории. `generate` возвращает пути созданных файлов.
|
|
61
74
|
|
|
75
|
+
## Авторизация и ошибки
|
|
76
|
+
|
|
77
|
+
Общие настройки `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`.
|
|
78
|
+
|
|
79
|
+
Если `auth` не задан ни глобально, ни в секции клиента, сгенерированный клиент не добавляет заголовок `Authorization`. JavaScript не может прочитать cookie с флагом `HttpOnly`; для них укажите `auth: { storage: 'none', credentials: 'include' }`, и браузер отправит cookie сам. `graphql.endpoint` по умолчанию равен `/api/graphql`. `openapi.baseUrl` по умолчанию пустой, поэтому пути из схемы остаются относительными.
|
|
80
|
+
|
|
81
|
+
При прямом использовании фабрик fetcher можно передать `getToken`; функция должна вернуть полное значение заголовка `Authorization`.
|
|
82
|
+
|
|
83
|
+
Ошибки HTTP представлены классами `GraphqlHttpError` и `OpenapiHttpError`; они содержат статус и данные ответа. Ошибки выполнения GraphQL представлены `GraphqlResponseError` со всеми сообщениями сервера.
|
|
84
|
+
|
|
62
85
|
## Разработка
|
|
63
86
|
|
|
64
87
|
```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,164 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
|
-
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
3
4
|
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
4
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { isUrl } from './path-utils.js';
|
|
5
7
|
const packageDirectory = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
6
8
|
const templatesDirectory = join(packageDirectory, 'templates');
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
7
10
|
function outputPath(path, cwd) {
|
|
8
11
|
return isAbsolute(path) ? path : resolve(cwd, path);
|
|
9
12
|
}
|
|
10
13
|
function schemaValue(schema, cwd) {
|
|
11
|
-
return
|
|
14
|
+
return isUrl(schema) ? schema : outputPath(schema, cwd);
|
|
12
15
|
}
|
|
13
16
|
function openapiSource(schema, cwd) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const value = schemaValue(schema, cwd);
|
|
18
|
+
if (isUrl(value))
|
|
19
|
+
return { source: 'url', url: value };
|
|
20
|
+
return { source: 'file', relativePath: relative(packageDirectory, value) };
|
|
17
21
|
}
|
|
18
|
-
function
|
|
19
|
-
execFileSync(
|
|
22
|
+
function runCli(entryPoint, args, cwd) {
|
|
23
|
+
execFileSync(process.execPath, [entryPoint, ...args], { cwd, stdio: 'inherit' });
|
|
20
24
|
}
|
|
21
|
-
function
|
|
22
|
-
const baseDirectory = join(
|
|
25
|
+
function createTempDirectory(prefix) {
|
|
26
|
+
const baseDirectory = join(packageDirectory, '.react-codegen-temp');
|
|
23
27
|
mkdirSync(baseDirectory, { recursive: true });
|
|
24
28
|
return mkdtempSync(join(baseDirectory, prefix));
|
|
25
29
|
}
|
|
26
|
-
function generateOpenapi(config, cwd) {
|
|
27
|
-
const tempDirectory =
|
|
30
|
+
function generateOpenapi(config, auth, cwd) {
|
|
31
|
+
const tempDirectory = createTempDirectory('openapi-');
|
|
28
32
|
const output = outputPath(config.output, cwd);
|
|
29
33
|
try {
|
|
30
|
-
mkdirSync(dirname(output), { recursive: true });
|
|
31
34
|
const fetcherPath = join(tempDirectory, 'openapi-fetcher.ts');
|
|
35
|
+
const fetcherConfiguration = JSON.stringify({
|
|
36
|
+
...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),
|
|
37
|
+
...(auth ? { auth } : {}),
|
|
38
|
+
});
|
|
32
39
|
const fetcher = readFileSync(join(packageDirectory, 'dist', 'openapi-fetcher.js'), 'utf8')
|
|
33
40
|
.replace(/\n?\/\/# sourceMappingURL=.*$/, '')
|
|
41
|
+
.replace('createOpenapiFetcher()', `createOpenapiFetcher(${fetcherConfiguration})`)
|
|
34
42
|
.replaceAll('export ', '');
|
|
35
43
|
writeFileSync(fetcherPath, fetcher);
|
|
36
|
-
const
|
|
37
|
-
const configText = template
|
|
44
|
+
const configText = readFileSync(join(templatesDirectory, 'openapi.template'), 'utf8')
|
|
38
45
|
.replaceAll('%OPENAPI_SOURCE%', JSON.stringify(openapiSource(config.schema, cwd)))
|
|
39
|
-
.replaceAll('%FILENAME%', JSON.stringify(
|
|
46
|
+
.replaceAll('%FILENAME%', JSON.stringify(join(tempDirectory, 'generated.ts')))
|
|
40
47
|
.replaceAll('%OUTPUT_DIR%', JSON.stringify(relative(packageDirectory, join(tempDirectory, 'output'))))
|
|
41
48
|
.replaceAll('%FETCHER_PATH%', JSON.stringify(fetcherPath));
|
|
42
49
|
const configPath = join(tempDirectory, 'openapi.codegen.ts');
|
|
43
50
|
writeFileSync(configPath, configText);
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
const cli = join(dirname(require.resolve('@openapi-codegen/cli')), 'cli.js');
|
|
52
|
+
runCli(cli, ['gen', 'openapi', '-c', relative(packageDirectory, configPath)], packageDirectory);
|
|
53
|
+
return { path: output, content: readFileSync(join(tempDirectory, 'generated.ts'), 'utf8') };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Could not generate OpenAPI client from ${schemaValue(config.schema, cwd)}: ${errorMessage(error)}`, { cause: error });
|
|
46
57
|
}
|
|
47
58
|
finally {
|
|
48
59
|
rmSync(tempDirectory, { force: true, recursive: true });
|
|
49
60
|
}
|
|
50
61
|
}
|
|
51
|
-
function generateGraphql(config, cwd) {
|
|
52
|
-
const tempDirectory = createProjectTempDirectory(packageDirectory, 'graphql-');
|
|
62
|
+
function generateGraphql(config, auth, cwd) {
|
|
53
63
|
const output = outputPath(config.output, cwd);
|
|
64
|
+
const documentsDirectory = outputPath(config.documents, cwd);
|
|
65
|
+
if (!existsSync(documentsDirectory) || !statSync(documentsDirectory).isDirectory()) {
|
|
66
|
+
throw new Error(`GraphQL documents path must be an existing directory: ${documentsDirectory}`);
|
|
67
|
+
}
|
|
68
|
+
const tempDirectory = createTempDirectory('graphql-');
|
|
54
69
|
try {
|
|
55
|
-
|
|
56
|
-
const template = readFileSync(join(templatesDirectory, 'graphql.template'), 'utf8');
|
|
57
|
-
const configText = template
|
|
70
|
+
const configText = readFileSync(join(templatesDirectory, 'graphql.template'), 'utf8')
|
|
58
71
|
.replaceAll('%SCHEMA%', JSON.stringify(schemaValue(config.schema, cwd)))
|
|
59
|
-
.replaceAll('%DOCUMENTS%', JSON.stringify(`${
|
|
60
|
-
.replaceAll('%FILENAME%', JSON.stringify(
|
|
72
|
+
.replaceAll('%DOCUMENTS%', JSON.stringify(`${documentsDirectory.replace(/\/$/, '')}/**/*.graphql`))
|
|
73
|
+
.replaceAll('%FILENAME%', JSON.stringify(join(tempDirectory, 'generated.ts')));
|
|
61
74
|
const configPath = join(tempDirectory, 'graphql.codegen.ts');
|
|
62
75
|
writeFileSync(configPath, configText);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
76
|
+
const cli = join(dirname(require.resolve('@graphql-codegen/cli/package.json')), 'esm', 'bin.js');
|
|
77
|
+
runCli(cli, ['--config', configPath], packageDirectory);
|
|
78
|
+
const generatedFile = readFileSync(join(tempDirectory, 'generated.ts'), 'utf8');
|
|
79
|
+
const fetcherConfiguration = JSON.stringify({
|
|
80
|
+
...(config.endpoint ? { endpoint: config.endpoint } : {}),
|
|
81
|
+
...(auth ? { auth } : {}),
|
|
82
|
+
});
|
|
83
|
+
const fetcher = readFileSync(join(packageDirectory, 'dist', 'graphql-fetcher.js'), 'utf8')
|
|
84
|
+
.replace(/\n?\/\/# sourceMappingURL=.*$/, '')
|
|
85
|
+
.replace('createGraphqlFetcher()', `createGraphqlFetcher(${fetcherConfiguration})`);
|
|
66
86
|
const importLine = "import { graphqlFetcher } from '@kollors/react-codegen/graphql-fetcher';";
|
|
67
87
|
if (!generatedFile.includes(importLine)) {
|
|
68
88
|
throw new Error('Generated GraphQL client does not contain the expected fetcher import.');
|
|
69
89
|
}
|
|
70
|
-
|
|
71
|
-
|
|
90
|
+
const content = generatedFile
|
|
91
|
+
.replace(importLine, `${fetcher}\n`)
|
|
92
|
+
.replace(/import\s+\{\s*DocumentTypeDecoration\s*}\s+from\s+(['"])@graphql-typed-document-node\/core\1;\s*/g, '')
|
|
93
|
+
.replaceAll('DocumentTypeDecoration', 'GraphqlDocumentTypeDecoration');
|
|
94
|
+
const documentType = `interface GraphqlDocumentTypeDecoration<TResult, TVariables> {\n __apiType?: (variables: TVariables) => TResult;\n}\n\n`;
|
|
95
|
+
return { path: output, content: `// @ts-nocheck\n/* eslint-disable */\n${documentType}${content}` };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
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
99
|
}
|
|
73
100
|
finally {
|
|
74
101
|
rmSync(tempDirectory, { force: true, recursive: true });
|
|
75
102
|
}
|
|
76
103
|
}
|
|
104
|
+
function errorMessage(error) {
|
|
105
|
+
return error instanceof Error ? error.message : String(error);
|
|
106
|
+
}
|
|
77
107
|
function validateConfig(config) {
|
|
78
108
|
if (config === null || typeof config !== 'object' || Array.isArray(config)) {
|
|
79
109
|
throw new TypeError('Codegen config must be an object.');
|
|
80
110
|
}
|
|
81
111
|
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')}`);
|
|
112
|
+
if (keys.some((key) => key !== 'auth' && key !== 'openapi' && key !== 'graphql')) {
|
|
113
|
+
throw new Error(`Unknown codegen config section: ${keys.find((key) => key !== 'auth' && key !== 'openapi' && key !== 'graphql')}`);
|
|
84
114
|
}
|
|
85
115
|
if (!config.openapi && !config.graphql) {
|
|
86
116
|
throw new Error('Codegen config must contain an openapi or graphql section.');
|
|
87
117
|
}
|
|
88
|
-
|
|
118
|
+
const validateAuth = (auth, location) => {
|
|
119
|
+
if (!auth || typeof auth !== 'object' || Array.isArray(auth))
|
|
120
|
+
throw new TypeError(`${location} must be an object.`);
|
|
121
|
+
const allowedAuthKeys = ['storage', 'key', 'scheme', 'credentials'];
|
|
122
|
+
const unknownKey = Object.keys(auth).find((key) => !allowedAuthKeys.includes(key));
|
|
123
|
+
if (unknownKey)
|
|
124
|
+
throw new Error(`Unknown ${location} option: ${unknownKey}`);
|
|
125
|
+
if (!['localStorage', 'sessionStorage', 'cookie', 'none'].includes(auth.storage)) {
|
|
126
|
+
throw new TypeError(`${location}.storage must be localStorage, sessionStorage, cookie, or none.`);
|
|
127
|
+
}
|
|
128
|
+
if (auth.storage !== 'none' && (typeof auth.key !== 'string' || !auth.key.trim())) {
|
|
129
|
+
throw new TypeError(`${location}.key must be a non-empty string unless storage is "none".`);
|
|
130
|
+
}
|
|
131
|
+
if (auth.key !== undefined && (typeof auth.key !== 'string' || !auth.key.trim())) {
|
|
132
|
+
throw new TypeError(`${location}.key must be a non-empty string.`);
|
|
133
|
+
}
|
|
134
|
+
if (auth.scheme !== undefined && auth.scheme !== false && (typeof auth.scheme !== 'string' || !auth.scheme.trim())) {
|
|
135
|
+
throw new TypeError(`${location}.scheme must be a non-empty string or false.`);
|
|
136
|
+
}
|
|
137
|
+
if (auth.credentials !== undefined && !['omit', 'same-origin', 'include'].includes(auth.credentials)) {
|
|
138
|
+
throw new TypeError(`${location}.credentials must be omit, same-origin, or include.`);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
if (config.auth !== undefined)
|
|
142
|
+
validateAuth(config.auth, 'config.auth');
|
|
143
|
+
for (const [kind, section] of Object.entries({ openapi: config.openapi, graphql: config.graphql })) {
|
|
144
|
+
if (section === undefined)
|
|
145
|
+
continue;
|
|
89
146
|
if (!section || typeof section !== 'object' || Array.isArray(section)) {
|
|
90
147
|
throw new TypeError(`config.${kind} must be an object.`);
|
|
91
148
|
}
|
|
92
|
-
const expectedKeys = kind === 'openapi' ? ['schema', 'output'] : ['schema', 'documents', 'output'];
|
|
149
|
+
const expectedKeys = kind === 'openapi' ? ['schema', 'output', 'baseUrl', 'auth'] : ['schema', 'documents', 'output', 'endpoint', 'auth'];
|
|
93
150
|
for (const key of Object.keys(section)) {
|
|
94
151
|
if (!expectedKeys.includes(key))
|
|
95
152
|
throw new Error(`Unknown config.${kind} option: ${key}`);
|
|
96
153
|
}
|
|
97
154
|
for (const key of expectedKeys) {
|
|
98
155
|
const value = section[key];
|
|
156
|
+
if ((key === 'baseUrl' || key === 'endpoint' || key === 'auth') && value === undefined)
|
|
157
|
+
continue;
|
|
158
|
+
if (key === 'auth') {
|
|
159
|
+
validateAuth(value, `config.${kind}.auth`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
99
162
|
if (typeof value !== 'string' || !value.trim())
|
|
100
163
|
throw new TypeError(`config.${kind}.${key} must be a non-empty string.`);
|
|
101
164
|
}
|
|
@@ -105,15 +168,55 @@ function validateConfig(config) {
|
|
|
105
168
|
throw new Error('OpenAPI and GraphQL outputs must use different files.');
|
|
106
169
|
}
|
|
107
170
|
}
|
|
171
|
+
function publishOutputs(outputs) {
|
|
172
|
+
const staged = new Map();
|
|
173
|
+
const previous = new Map();
|
|
174
|
+
const published = [];
|
|
175
|
+
try {
|
|
176
|
+
for (const output of outputs) {
|
|
177
|
+
mkdirSync(dirname(output.path), { recursive: true });
|
|
178
|
+
const directory = mkdtempSync(join(dirname(output.path), '.react-codegen-publish-'));
|
|
179
|
+
const filename = join(directory, 'generated.ts');
|
|
180
|
+
staged.set(output.path, { directory, filename });
|
|
181
|
+
previous.set(output.path, existsSync(output.path) ? readFileSync(output.path) : undefined);
|
|
182
|
+
writeFileSync(filename, output.content);
|
|
183
|
+
}
|
|
184
|
+
for (const output of outputs) {
|
|
185
|
+
const stage = staged.get(output.path);
|
|
186
|
+
if (!stage)
|
|
187
|
+
throw new Error(`Could not stage generated output ${output.path}.`);
|
|
188
|
+
renameSync(stage.filename, output.path);
|
|
189
|
+
published.push(output.path);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
for (const path of published.reverse()) {
|
|
194
|
+
const oldContent = previous.get(path);
|
|
195
|
+
if (oldContent === undefined)
|
|
196
|
+
rmSync(path, { force: true });
|
|
197
|
+
else
|
|
198
|
+
writeFileSync(path, oldContent);
|
|
199
|
+
}
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
for (const { directory } of staged.values())
|
|
204
|
+
rmSync(directory, { force: true, recursive: true });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
108
207
|
/** Generate configured OpenAPI and GraphQL clients into one TypeScript file per enabled section. */
|
|
109
208
|
export async function generate(config) {
|
|
110
209
|
validateConfig(config);
|
|
111
210
|
const cwd = process.cwd();
|
|
112
|
-
const
|
|
211
|
+
const generated = [];
|
|
113
212
|
if (config.openapi)
|
|
114
|
-
|
|
213
|
+
generated.push(generateOpenapi(config.openapi, config.openapi.auth ?? config.auth, cwd));
|
|
115
214
|
if (config.graphql)
|
|
116
|
-
|
|
117
|
-
|
|
215
|
+
generated.push(generateGraphql(config.graphql, config.graphql.auth ?? config.auth, cwd));
|
|
216
|
+
publishOutputs(generated);
|
|
217
|
+
return { outputs: generated.map(({ path }) => path) };
|
|
218
|
+
}
|
|
219
|
+
export function validateCodegenConfig(config) {
|
|
220
|
+
validateConfig(config);
|
|
118
221
|
}
|
|
119
222
|
//# 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>;
|
package/dist/graphql-fetcher.js
CHANGED
|
@@ -1,32 +1,120 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
1
|
+
function readConfiguredToken(auth) {
|
|
2
|
+
if (auth.storage === 'none')
|
|
3
|
+
return '';
|
|
4
|
+
if (auth.storage === 'cookie') {
|
|
5
|
+
if (typeof document === 'undefined' || !auth.key)
|
|
6
|
+
return '';
|
|
7
|
+
const cookie = document.cookie
|
|
8
|
+
.split(';')
|
|
9
|
+
.map((part) => part.trim())
|
|
10
|
+
.find((part) => part.startsWith(`${auth.key}=`));
|
|
11
|
+
if (!cookie)
|
|
12
|
+
return '';
|
|
13
|
+
const value = cookie.slice(auth.key.length + 1);
|
|
14
|
+
try {
|
|
15
|
+
return decodeURIComponent(value);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (typeof globalThis[auth.storage] === 'undefined' || !auth.key)
|
|
22
|
+
return '';
|
|
23
|
+
return globalThis[auth.storage].getItem(auth.key) ?? '';
|
|
24
|
+
}
|
|
25
|
+
function authorizationValue(configuration) {
|
|
26
|
+
if (configuration.getToken)
|
|
27
|
+
return configuration.getToken() ?? '';
|
|
28
|
+
const auth = configuration.auth;
|
|
29
|
+
if (!auth)
|
|
30
|
+
return '';
|
|
31
|
+
const token = readConfiguredToken(auth);
|
|
32
|
+
if (!token || auth.scheme === false)
|
|
33
|
+
return token;
|
|
34
|
+
const scheme = auth.scheme ?? 'Bearer';
|
|
35
|
+
if (!scheme)
|
|
36
|
+
return token;
|
|
37
|
+
return token.toLowerCase().startsWith(`${scheme.toLowerCase()} `) ? token : `${scheme} ${token}`;
|
|
38
|
+
}
|
|
39
|
+
export class GraphqlHttpError extends Error {
|
|
40
|
+
status;
|
|
41
|
+
statusText;
|
|
42
|
+
endpoint;
|
|
43
|
+
body;
|
|
44
|
+
constructor(status, statusText, endpoint, body) {
|
|
45
|
+
super(`GraphQL request to ${endpoint} failed with HTTP ${status}${statusText ? ` ${statusText}` : ''}.`);
|
|
46
|
+
this.status = status;
|
|
47
|
+
this.statusText = statusText;
|
|
48
|
+
this.endpoint = endpoint;
|
|
49
|
+
this.body = body;
|
|
50
|
+
this.name = 'GraphqlHttpError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class GraphqlResponseError extends Error {
|
|
54
|
+
errors;
|
|
55
|
+
data;
|
|
56
|
+
constructor(errors, data) {
|
|
57
|
+
super(errors
|
|
58
|
+
.map(({ message }) => message)
|
|
59
|
+
.filter(Boolean)
|
|
60
|
+
.join('\n') || 'GraphQL response contains errors.');
|
|
61
|
+
this.errors = errors;
|
|
62
|
+
this.data = data;
|
|
63
|
+
this.name = 'GraphqlResponseError';
|
|
64
|
+
}
|
|
3
65
|
}
|
|
4
66
|
export function createGraphqlFetcher(configuration = {}) {
|
|
5
67
|
const endpoint = configuration.endpoint ?? '/api/graphql';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
68
|
+
return function graphqlFetcher(query, variables) {
|
|
69
|
+
return async (context) => {
|
|
70
|
+
try {
|
|
71
|
+
const headers = new Headers({ 'content-type': 'application/json' });
|
|
72
|
+
const token = authorizationValue(configuration);
|
|
73
|
+
if (token)
|
|
74
|
+
headers.set('authorization', token);
|
|
75
|
+
new Headers(configuration.headers).forEach((value, key) => {
|
|
76
|
+
headers.set(key, value);
|
|
77
|
+
});
|
|
78
|
+
let response;
|
|
79
|
+
try {
|
|
80
|
+
response = await fetch(endpoint, {
|
|
81
|
+
body: JSON.stringify({ query, variables }),
|
|
82
|
+
headers,
|
|
83
|
+
method: 'POST',
|
|
84
|
+
signal: context?.signal,
|
|
85
|
+
credentials: configuration.auth?.credentials,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
90
|
+
throw error;
|
|
91
|
+
throw new Error(`Could not reach GraphQL endpoint ${endpoint}: ${error instanceof Error ? error.message : String(error)}`, {
|
|
92
|
+
cause: error,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
let result;
|
|
96
|
+
const rawBody = await response.text();
|
|
97
|
+
try {
|
|
98
|
+
result = JSON.parse(rawBody);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (!response.ok)
|
|
102
|
+
throw new GraphqlHttpError(response.status, response.statusText, endpoint, rawBody);
|
|
103
|
+
throw new Error(`GraphQL server returned an invalid JSON response from ${endpoint}.`, { cause: error });
|
|
104
|
+
}
|
|
105
|
+
if (!response.ok)
|
|
106
|
+
throw new GraphqlHttpError(response.status, response.statusText, endpoint, result);
|
|
107
|
+
if (result.errors?.length)
|
|
108
|
+
throw new GraphqlResponseError(result.errors, result.data);
|
|
109
|
+
if (result.data === undefined) {
|
|
110
|
+
throw new Error(`GraphQL response from ${endpoint} does not contain data.`);
|
|
111
|
+
}
|
|
112
|
+
return result.data;
|
|
21
113
|
}
|
|
22
|
-
|
|
23
|
-
throw
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
24
116
|
}
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
throw error instanceof Error ? error : new Error(String(error));
|
|
29
|
-
}
|
|
117
|
+
};
|
|
30
118
|
};
|
|
31
119
|
}
|
|
32
120
|
export const graphqlFetcher = createGraphqlFetcher();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-fetcher.js","sourceRoot":"","sources":["../src/graphql-fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphql-fetcher.js","sourceRoot":"","sources":["../src/graphql-fetcher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { generate } from './generate.js';
|
|
2
2
|
export type { GraphqlFetcherConfiguration } from './graphql-fetcher.js';
|
|
3
|
-
export { createGraphqlFetcher, graphqlFetcher } from './graphql-fetcher.js';
|
|
3
|
+
export { createGraphqlFetcher, GraphqlHttpError, GraphqlResponseError, graphqlFetcher } from './graphql-fetcher.js';
|
|
4
4
|
export type { OpenapiFetcherConfiguration, OpenapiFetcherOptions } from './openapi-fetcher.js';
|
|
5
|
-
export { createOpenapiFetcher, openapiFetcher } from './openapi-fetcher.js';
|
|
6
|
-
export type { CodegenConfig, CodegenResult } from './types.js';
|
|
5
|
+
export { createOpenapiFetcher, OpenapiHttpError, openapiFetcher } from './openapi-fetcher.js';
|
|
6
|
+
export type { AuthConfig, CodegenConfig, CodegenResult, TokenStorage } from './types.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { generate } from './generate.js';
|
|
2
|
-
export { createGraphqlFetcher, graphqlFetcher } from './graphql-fetcher.js';
|
|
3
|
-
export { createOpenapiFetcher, openapiFetcher } from './openapi-fetcher.js';
|
|
2
|
+
export { createGraphqlFetcher, GraphqlHttpError, GraphqlResponseError, graphqlFetcher } from './graphql-fetcher.js';
|
|
3
|
+
export { createOpenapiFetcher, OpenapiHttpError, openapiFetcher } from './openapi-fetcher.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AuthConfig } from './types.js';
|
|
1
2
|
export interface OpenapiFetcherOptions<TBody, THeaders, TQueryParams, TPathParams> {
|
|
2
3
|
body?: TBody;
|
|
3
4
|
headers?: THeaders;
|
|
@@ -8,7 +9,19 @@ export interface OpenapiFetcherOptions<TBody, THeaders, TQueryParams, TPathParam
|
|
|
8
9
|
url: string;
|
|
9
10
|
}
|
|
10
11
|
export interface OpenapiFetcherConfiguration {
|
|
12
|
+
/** Custom value for the `Authorization` header. When omitted, no authorization header is added unless `auth` is configured. */
|
|
11
13
|
getToken?: () => string | null | undefined;
|
|
14
|
+
/** Base URL prepended to paths from the OpenAPI document. */
|
|
15
|
+
baseUrl?: string;
|
|
16
|
+
/** Token storage and fetch credential settings. */
|
|
17
|
+
auth?: AuthConfig;
|
|
18
|
+
}
|
|
19
|
+
export declare class OpenapiHttpError<TError = unknown> extends Error {
|
|
20
|
+
readonly status: number;
|
|
21
|
+
readonly statusText: string;
|
|
22
|
+
readonly url: string;
|
|
23
|
+
readonly data: TError;
|
|
24
|
+
constructor(status: number, statusText: string, url: string, data: TError);
|
|
12
25
|
}
|
|
13
26
|
export declare function createOpenapiFetcher(configuration?: OpenapiFetcherConfiguration): <TData, TError, TBody, THeaders, TQueryParams, TPathParams>(options: OpenapiFetcherOptions<TBody, THeaders, TQueryParams, TPathParams>) => Promise<TData>;
|
|
14
27
|
export declare const openapiFetcher: <TData, TError, TBody, THeaders, TQueryParams, TPathParams>(options: OpenapiFetcherOptions<TBody, THeaders, TQueryParams, TPathParams>) => Promise<TData>;
|
package/dist/openapi-fetcher.js
CHANGED
|
@@ -1,30 +1,158 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
1
|
+
function readConfiguredToken(auth) {
|
|
2
|
+
if (auth.storage === 'none')
|
|
3
|
+
return '';
|
|
4
|
+
if (auth.storage === 'cookie') {
|
|
5
|
+
if (typeof document === 'undefined' || !auth.key)
|
|
6
|
+
return '';
|
|
7
|
+
const cookie = document.cookie
|
|
8
|
+
.split(';')
|
|
9
|
+
.map((part) => part.trim())
|
|
10
|
+
.find((part) => part.startsWith(`${auth.key}=`));
|
|
11
|
+
if (!cookie)
|
|
12
|
+
return '';
|
|
13
|
+
const value = cookie.slice(auth.key.length + 1);
|
|
14
|
+
try {
|
|
15
|
+
return decodeURIComponent(value);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (typeof globalThis[auth.storage] === 'undefined' || !auth.key)
|
|
22
|
+
return '';
|
|
23
|
+
return globalThis[auth.storage].getItem(auth.key) ?? '';
|
|
24
|
+
}
|
|
25
|
+
function authorizationValue(configuration) {
|
|
26
|
+
if (configuration.getToken)
|
|
27
|
+
return configuration.getToken() ?? '';
|
|
28
|
+
const auth = configuration.auth;
|
|
29
|
+
if (!auth)
|
|
30
|
+
return '';
|
|
31
|
+
const token = readConfiguredToken(auth);
|
|
32
|
+
if (!token || auth.scheme === false)
|
|
33
|
+
return token;
|
|
34
|
+
const scheme = auth.scheme ?? 'Bearer';
|
|
35
|
+
if (!scheme)
|
|
36
|
+
return token;
|
|
37
|
+
return token.toLowerCase().startsWith(`${scheme.toLowerCase()} `) ? token : `${scheme} ${token}`;
|
|
38
|
+
}
|
|
39
|
+
function withBaseUrl(baseUrl, url) {
|
|
40
|
+
if (!baseUrl || /^[a-z][a-z\d+.-]*:\/\//i.test(url))
|
|
41
|
+
return url;
|
|
42
|
+
return `${baseUrl.replace(/\/+$/, '')}/${url.replace(/^\/+/, '')}`;
|
|
43
|
+
}
|
|
44
|
+
export class OpenapiHttpError extends Error {
|
|
45
|
+
status;
|
|
46
|
+
statusText;
|
|
47
|
+
url;
|
|
48
|
+
data;
|
|
49
|
+
constructor(status, statusText, url, data) {
|
|
50
|
+
super(`HTTP ${status}${statusText ? ` ${statusText}` : ''} for ${url}.`);
|
|
51
|
+
this.status = status;
|
|
52
|
+
this.statusText = statusText;
|
|
53
|
+
this.url = url;
|
|
54
|
+
this.data = data;
|
|
55
|
+
this.name = 'OpenapiHttpError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function serializeQueryParams(queryParams) {
|
|
59
|
+
const result = new URLSearchParams();
|
|
60
|
+
if (queryParams == null)
|
|
61
|
+
return result;
|
|
62
|
+
if (queryParams instanceof URLSearchParams)
|
|
63
|
+
return new URLSearchParams(queryParams);
|
|
64
|
+
if (typeof queryParams !== 'object' || Array.isArray(queryParams)) {
|
|
65
|
+
throw new TypeError('OpenAPI query parameters must be an object.');
|
|
66
|
+
}
|
|
67
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
68
|
+
if (value === undefined || value === null)
|
|
69
|
+
continue;
|
|
70
|
+
const values = Array.isArray(value) ? value : [value];
|
|
71
|
+
for (const item of values) {
|
|
72
|
+
if (item === undefined || item === null)
|
|
73
|
+
continue;
|
|
74
|
+
result.append(key, typeof item === 'object' ? (JSON.stringify(item) ?? String(item)) : String(item));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function withQueryParams(url, queryParams) {
|
|
80
|
+
const serialized = queryParams.toString();
|
|
81
|
+
if (!serialized)
|
|
82
|
+
return url;
|
|
83
|
+
const hashIndex = url.indexOf('#');
|
|
84
|
+
const base = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
85
|
+
const hash = hashIndex === -1 ? '' : url.slice(hashIndex);
|
|
86
|
+
const separator = base.includes('?') ? (base.endsWith('?') || base.endsWith('&') ? '' : '&') : '?';
|
|
87
|
+
return `${base}${separator}${serialized}${hash}`;
|
|
88
|
+
}
|
|
89
|
+
async function readResponse(response) {
|
|
90
|
+
if (response.status === 204 || response.status === 205 || response.body === null || response.headers.get('content-length') === '0')
|
|
91
|
+
return undefined;
|
|
92
|
+
const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
|
|
93
|
+
if (contentType.includes('json'))
|
|
94
|
+
return await response.json();
|
|
95
|
+
if (contentType.startsWith('text/') || contentType.includes('xml'))
|
|
96
|
+
return await response.text();
|
|
97
|
+
return await response.blob();
|
|
3
98
|
}
|
|
4
99
|
export function createOpenapiFetcher(configuration = {}) {
|
|
5
|
-
const getToken = configuration.getToken ?? defaultGetToken;
|
|
6
100
|
return async function openapiFetcher(options) {
|
|
7
|
-
const headers = new Headers({ authorization: getToken() ?? '', 'content-type': 'application/json' });
|
|
8
|
-
new Headers(options.headers).forEach((value, key) => {
|
|
9
|
-
headers.set(key, value);
|
|
10
|
-
});
|
|
11
|
-
if (headers.get('content-type')?.toLowerCase().includes('multipart/form-data')) {
|
|
12
|
-
headers.delete('content-type');
|
|
13
|
-
}
|
|
14
|
-
const queryParams = new URLSearchParams(options.queryParams).toString();
|
|
15
|
-
const pathParams = options.pathParams;
|
|
16
|
-
const url = options.url.replace(/\{\w*}/g, (key) => String(pathParams?.[key.slice(1, -1)] ?? ''));
|
|
17
|
-
const body = options.body instanceof FormData ? options.body : options.body == null ? undefined : JSON.stringify(options.body);
|
|
18
101
|
try {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
102
|
+
const headers = new Headers({ 'content-type': 'application/json' });
|
|
103
|
+
const token = authorizationValue(configuration);
|
|
104
|
+
if (token)
|
|
105
|
+
headers.set('authorization', token);
|
|
106
|
+
new Headers(options.headers).forEach((value, key) => {
|
|
107
|
+
headers.set(key, value);
|
|
108
|
+
});
|
|
109
|
+
const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData;
|
|
110
|
+
if (isFormData || headers.get('content-type')?.toLowerCase().includes('multipart/form-data'))
|
|
111
|
+
headers.delete('content-type');
|
|
112
|
+
const pathParams = options.pathParams;
|
|
113
|
+
const path = options.url.replace(/\{([^}]+)}/g, (_match, key) => {
|
|
114
|
+
const value = pathParams?.[key];
|
|
115
|
+
if (value === undefined || value === null)
|
|
116
|
+
throw new Error(`Missing required OpenAPI path parameter "${key}" for ${options.url}.`);
|
|
117
|
+
return encodeURIComponent(String(value));
|
|
24
118
|
});
|
|
25
|
-
const
|
|
119
|
+
const url = withBaseUrl(configuration.baseUrl, path);
|
|
120
|
+
const queryParams = serializeQueryParams(options.queryParams);
|
|
121
|
+
const requestUrl = withQueryParams(url, queryParams);
|
|
122
|
+
const body = isFormData ? options.body : options.body == null ? undefined : JSON.stringify(options.body);
|
|
123
|
+
let response;
|
|
124
|
+
try {
|
|
125
|
+
response = await fetch(requestUrl, {
|
|
126
|
+
body,
|
|
127
|
+
headers,
|
|
128
|
+
method: options.method.toUpperCase(),
|
|
129
|
+
signal: options.signal,
|
|
130
|
+
credentials: configuration.auth?.credentials,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
135
|
+
throw error;
|
|
136
|
+
throw new Error(`Could not reach OpenAPI endpoint ${requestUrl}: ${error instanceof Error ? error.message : String(error)}`, {
|
|
137
|
+
cause: error,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
let result;
|
|
141
|
+
const errorResponse = response.ok ? undefined : response.clone();
|
|
142
|
+
try {
|
|
143
|
+
result = await readResponse(response);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (!response.ok) {
|
|
147
|
+
result = errorResponse ? await errorResponse.text().catch(() => undefined) : undefined;
|
|
148
|
+
throw new OpenapiHttpError(response.status, response.statusText, requestUrl, result);
|
|
149
|
+
}
|
|
150
|
+
throw new Error(`Could not read response from ${requestUrl}: ${error instanceof Error ? error.message : String(error)}`, {
|
|
151
|
+
cause: error,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
26
154
|
if (!response.ok) {
|
|
27
|
-
|
|
155
|
+
throw new OpenapiHttpError(response.status, response.statusText, requestUrl, result);
|
|
28
156
|
}
|
|
29
157
|
return result;
|
|
30
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-fetcher.js","sourceRoot":"","sources":["../src/openapi-fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openapi-fetcher.js","sourceRoot":"","sources":["../src/openapi-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
|
+
export type TokenStorage = 'localStorage' | 'sessionStorage' | 'cookie' | 'none';
|
|
2
|
+
export interface AuthConfig {
|
|
3
|
+
storage: TokenStorage;
|
|
4
|
+
key?: string;
|
|
5
|
+
scheme?: string | false;
|
|
6
|
+
credentials?: RequestCredentials;
|
|
7
|
+
}
|
|
1
8
|
export interface CodegenConfig {
|
|
9
|
+
auth?: AuthConfig;
|
|
2
10
|
openapi?: {
|
|
3
11
|
schema: string;
|
|
4
12
|
output: string;
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
auth?: AuthConfig;
|
|
5
15
|
};
|
|
6
16
|
graphql?: {
|
|
7
17
|
schema: string;
|
|
8
18
|
documents: string;
|
|
9
19
|
output: string;
|
|
20
|
+
endpoint?: string;
|
|
21
|
+
auth?: AuthConfig;
|
|
10
22
|
};
|
|
11
23
|
}
|
|
12
24
|
export interface CodegenResult {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kollors/react-codegen",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.2",
|
|
4
4
|
"description": "Generate TanStack Query clients from OpenAPI and GraphQL schemas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"README.ru.md"
|
|
29
29
|
],
|
|
30
30
|
"scripts": {
|
|
31
|
-
"build": "node scripts/clean-dist.js && tsc",
|
|
31
|
+
"build": "node scripts/clean-dist.js && tsc && node scripts/prepare-dist.js",
|
|
32
32
|
"lint": "biome check . --error-on-warnings",
|
|
33
33
|
"lint:fix": "biome check --write .",
|
|
34
34
|
"pack:check": "npm pack --dry-run",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"type": "git",
|
|
62
62
|
"url": "git+https://github.com/kollors/react-codegen.git"
|
|
63
63
|
},
|
|
64
|
-
"homepage": "https://github.com/kollors/react-codegen
|
|
64
|
+
"homepage": "https://github.com/kollors/react-codegen",
|
|
65
65
|
"bugs": {
|
|
66
66
|
"url": "https://github.com/kollors/react-codegen/issues"
|
|
67
67
|
},
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import type { CodegenConfig } from '@graphql-codegen/cli';
|
|
2
|
+
|
|
2
3
|
const config: CodegenConfig = {
|
|
3
4
|
schema: %SCHEMA%,
|
|
4
5
|
documents: %DOCUMENTS%,
|
|
5
|
-
ignoreNoDocuments:
|
|
6
|
+
ignoreNoDocuments: false,
|
|
6
7
|
generates: {
|
|
7
8
|
[%FILENAME%]: {
|
|
8
|
-
plugins: [
|
|
9
|
-
'typescript',
|
|
10
|
-
'typescript-operations',
|
|
11
|
-
'typescript-react-query',
|
|
12
|
-
],
|
|
9
|
+
plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],
|
|
13
10
|
config: {
|
|
14
11
|
maybeValue: 'T | undefined',
|
|
15
|
-
scalars: { ID: '
|
|
16
|
-
|
|
12
|
+
scalars: { ID: 'string' },
|
|
17
13
|
fetcher: '@kollors/react-codegen/graphql-fetcher#graphqlFetcher',
|
|
18
14
|
legacyMode: false,
|
|
19
15
|
omitOperationSuffix: true,
|
|
@@ -17,19 +17,19 @@ const config = defineConfig({
|
|
|
17
17
|
const { schemasFiles } = await generateSchemaTypes(context, { filenamePrefix: '' });
|
|
18
18
|
await generateReactQueryComponents(context, { filenamePrefix: '', schemasFiles });
|
|
19
19
|
|
|
20
|
-
const contextStr = readFileSync(join(tempDir, 'context.ts'), 'utf-8').replace(
|
|
20
|
+
const contextStr = readFileSync(join(tempDir, 'context.ts'), 'utf-8').replace(/import\s+(?:type\s+)?\{\s*(?:type\s+)?QueryOperation\s*}\s+from\s+["']\.\/components["'];/, '');
|
|
21
21
|
const utilsStr = readFileSync(join(tempDir, 'utils.ts'), 'utf-8');
|
|
22
22
|
const schemasStr = readFileSync(join(tempDir, 'schemas.ts'), 'utf-8');
|
|
23
23
|
const parametersStr = readGeneratedFile('parameters.ts');
|
|
24
|
-
const openapiFetcherStr = readFileSync(%FETCHER_PATH%, 'utf-8')
|
|
24
|
+
const openapiFetcherStr = readFileSync(%FETCHER_PATH%, 'utf-8');
|
|
25
25
|
|
|
26
26
|
const componentsStr = readFileSync(join(tempDir, 'components.ts'), 'utf-8')
|
|
27
27
|
.replace(/import\s+\*\s+as\s+reactQuery\s+from\s+"@tanstack\/react-query";/g, 'import * as reactQuery from "@tanstack/react-query";')
|
|
28
|
-
.replace(/import\s+\{
|
|
29
|
-
.replace(/import\s+\{\s*deepMerge\s*}\s+from\s+"\.\/utils";/g, '')
|
|
30
|
-
.replace(/import\s+type\s+\*\s+as\s+Schemas\s+from\s+"\.\/schemas";/g, '')
|
|
31
|
-
.replace(/import\s+type\s+\*\s+as\s+Fetcher\s+from\s+"\.\/fetcher";/g, '')
|
|
32
|
-
.replace(/import\s+\{\s*fetch\s*}\s+from\s+"\.\/fetcher";/g, '')
|
|
28
|
+
.replace(/import\s+\{[^}]*}\s+from\s+["']\.\/context["'];/g, '')
|
|
29
|
+
.replace(/import\s+\{\s*deepMerge\s*}\s+from\s+["']\.\/utils["'];/g, '')
|
|
30
|
+
.replace(/import\s+type\s+\*\s+as\s+Schemas\s+from\s+["']\.\/schemas["'];/g, '')
|
|
31
|
+
.replace(/import\s+type\s+\*\s+as\s+Fetcher\s+from\s+["']\.\/fetcher["'];/g, '')
|
|
32
|
+
.replace(/import\s+\{\s*fetch\s*}\s+from\s+["']\.\/fetcher["'];/g, '')
|
|
33
33
|
.replace(/Schemas\./g, '')
|
|
34
34
|
.replace(/Fetcher\./g, '')
|
|
35
35
|
.replace(/fetch\s*</g, 'openapiFetcher<');
|