@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 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 /^[a-z][a-z\d+.-]*:\/\//i.test(value) ? value : resolvePath(value, directory);
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
- ...configModule.default,
41
- ...(configModule.default.openapi && {
43
+ ...sourceConfig,
44
+ ...(sourceConfig.openapi && {
42
45
  openapi: {
43
- ...configModule.default.openapi,
44
- schema: resolveSchema(configModule.default.openapi.schema, directory),
45
- output: resolvePath(configModule.default.openapi.output, directory),
46
+ ...sourceConfig.openapi,
47
+ schema: resolveSchema(sourceConfig.openapi.schema, directory),
48
+ output: resolvePath(sourceConfig.openapi.output, directory),
46
49
  },
47
50
  }),
48
- ...(configModule.default.graphql && {
51
+ ...(sourceConfig.graphql && {
49
52
  graphql: {
50
- ...configModule.default.graphql,
51
- schema: resolveSchema(configModule.default.graphql.schema, directory),
52
- documents: resolvePath(configModule.default.graphql.documents, directory),
53
- output: resolvePath(configModule.default.graphql.output, directory),
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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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 /^[a-z][a-z\d+.-]*:\/\//i.test(schema) ? schema : outputPath(schema, cwd);
14
+ return isUrl(schema) ? schema : outputPath(schema, cwd);
12
15
  }
13
16
  function openapiSource(schema, cwd) {
14
- if (/^[a-z][a-z\d+.-]*:\/\//i.test(schema))
15
- return { source: 'url', url: schema };
16
- return { source: 'file', relativePath: relative(packageDirectory, schemaValue(schema, cwd)) };
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 run(command, args, cwd) {
19
- execFileSync(command, args, { cwd, stdio: 'inherit' });
22
+ function runCli(entryPoint, args, cwd) {
23
+ execFileSync(process.execPath, [entryPoint, ...args], { cwd, stdio: 'inherit' });
20
24
  }
21
- function createProjectTempDirectory(cwd, prefix) {
22
- const baseDirectory = join(cwd, '.react-codegen-temp');
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 = createProjectTempDirectory(packageDirectory, 'openapi-');
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 template = readFileSync(join(templatesDirectory, 'openapi.template'), 'utf8');
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(output))
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
- run('openapi-codegen', ['gen', 'openapi', '-c', relative(packageDirectory, configPath)], packageDirectory);
45
- return output;
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
- mkdirSync(dirname(output), { recursive: true });
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(`${outputPath(config.documents, cwd).replace(/\/$/, '')}/**/*.graphql`))
60
- .replaceAll('%FILENAME%', JSON.stringify(output));
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
- run('graphql-codegen', ['--config', relative(packageDirectory, configPath)], packageDirectory);
64
- const generatedFile = readFileSync(output, 'utf8');
65
- const fetcher = readFileSync(join(packageDirectory, 'dist', 'graphql-fetcher.js'), 'utf8').replace(/\n?\/\/# sourceMappingURL=.*$/, '');
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
- writeFileSync(output, `// @ts-nocheck\n/* eslint-disable */\n${generatedFile.replace(importLine, `${fetcher}\n`)}`);
71
- return output;
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
- for (const [kind, section] of Object.entries(config)) {
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 outputs = [];
211
+ const generated = [];
113
212
  if (config.openapi)
114
- outputs.push(generateOpenapi(config.openapi, cwd));
213
+ generated.push(generateOpenapi(config.openapi, config.openapi.auth ?? config.auth, cwd));
115
214
  if (config.graphql)
116
- outputs.push(generateGraphql(config.graphql, cwd));
117
- return { outputs };
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
@@ -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 function createGraphqlFetcher(configuration?: GraphqlFetcherConfiguration): <TData, TVariables>(query: string, variables?: TVariables) => Promise<TData>;
7
- export declare const graphqlFetcher: <TData, TVariables>(query: string, variables?: TVariables) => Promise<TData>;
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>;
@@ -1,32 +1,120 @@
1
- function defaultGetToken() {
2
- return typeof localStorage === 'undefined' ? '' : (localStorage.getItem('token') ?? '');
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
- const getToken = configuration.getToken ?? defaultGetToken;
7
- return async function graphqlFetcher(query, variables) {
8
- const headers = new Headers({ authorization: getToken() ?? '', 'content-type': 'application/json' });
9
- new Headers(configuration.headers).forEach((value, key) => {
10
- headers.set(key, value);
11
- });
12
- try {
13
- const response = await fetch(endpoint, {
14
- body: JSON.stringify({ query, variables }),
15
- headers,
16
- method: 'POST',
17
- });
18
- const result = (await response.json());
19
- if (!response.ok || result.errors?.length) {
20
- throw new Error(result.errors?.[0]?.message ?? `GraphQL request failed with status ${response.status}.`);
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
- if (result.data === undefined) {
23
- throw new Error('GraphQL response does not contain data.');
114
+ catch (error) {
115
+ throw error instanceof Error ? error : new Error(String(error));
24
116
  }
25
- return result.data;
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":"AAMA,SAAS,eAAe;IACtB,OAAO,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,gBAA6C,EAAE;IAClF,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,cAAc,CAAC;IAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,eAAe,CAAC;IAE3D,OAAO,KAAK,UAAU,cAAc,CAAoB,KAAa,EAAE,SAAsB;QAC3F,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrG,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACxD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACrC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC1C,OAAO;gBACP,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0D,CAAC;YAEhG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,sCAAsC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3G,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC"}
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;AAE5E,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>;
@@ -1,30 +1,158 @@
1
- function defaultGetToken() {
2
- return typeof localStorage === 'undefined' ? '' : (localStorage.getItem('token') ?? '');
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 response = await fetch(`${url}${queryParams ? `?${queryParams}` : ''}`, {
20
- body,
21
- headers,
22
- method: options.method.toUpperCase(),
23
- signal: options.signal,
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 result = (response.headers.get('content-type')?.includes('json') ? await response.json() : await response.blob());
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
- return Promise.reject(result);
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":"AAcA,SAAS,eAAe;IACtB,OAAO,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,gBAA6C,EAAE;IAClF,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,eAAe,CAAC;IAE3D,OAAO,KAAK,UAAU,cAAc,CAClC,OAA0E;QAE1E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAkC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7E,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC/E,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,WAAiD,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9G,MAAM,UAAU,GAAG,OAAO,CAAC,UAAyD,CAAC;QACrF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE/H,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC5E,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;gBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAU,CAAC;YAEjI,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,OAAO,CAAC,MAAM,CAAC,MAA2B,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"openapi-fetcher.js","sourceRoot":"","sources":["../src/openapi-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Return whether a schema value is an absolute URL instead of a filesystem path. */
2
+ export declare function isUrl(value: string): boolean;
@@ -0,0 +1,5 @@
1
+ /** Return whether a schema value is an absolute URL instead of a filesystem path. */
2
+ export function isUrl(value) {
3
+ return /^[a-z][a-z\d+.-]*:\/\//i.test(value);
4
+ }
5
+ //# sourceMappingURL=path-utils.js.map
@@ -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.1",
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#readme",
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: true,
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: 'number' },
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('import { QueryOperation } from "./components";', '');
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').replace('export ', '');
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+\{\s*useContext,\s*Context,\s*queryKeyFn\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, '')
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<');