api-farmer 0.1.4 → 0.1.5
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 +25 -0
- package/dist/cli.mjs +1 -1
- package/dist/{generate-C4lplT2F.mjs → generate-SAL57AwU.mjs} +27 -11
- package/dist/index.d.mts +3 -1
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -83,6 +83,7 @@ export default defineConfig({
|
|
|
83
83
|
verb() {},
|
|
84
84
|
url() {},
|
|
85
85
|
entity() {},
|
|
86
|
+
name() {},
|
|
86
87
|
fn() {},
|
|
87
88
|
comment() {},
|
|
88
89
|
type() {},
|
|
@@ -97,6 +98,25 @@ export default defineConfig({
|
|
|
97
98
|
})
|
|
98
99
|
```
|
|
99
100
|
|
|
101
|
+
#### `name` Transformer
|
|
102
|
+
|
|
103
|
+
The `name` transformer is a convenience option that derives both `fn` and `type` from a single function. When set, `fn` is the return value, and `type` is automatically capitalized from `fn`. This avoids writing duplicate logic for `fn` and `type`.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
export default defineConfig({
|
|
107
|
+
transformer: {
|
|
108
|
+
name({ verb, entity }) {
|
|
109
|
+
return `api${verb}${entity}`
|
|
110
|
+
// fn -> apiGetUsers
|
|
111
|
+
// type -> ApiGetUsers
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
> [!NOTE]
|
|
118
|
+
> If `name` is set, `fn` and `type` transformers will be ignored.
|
|
119
|
+
|
|
100
120
|
### Configuration Options
|
|
101
121
|
|
|
102
122
|
```ts
|
|
@@ -163,6 +183,11 @@ export interface Config {
|
|
|
163
183
|
* @see https://openapi-ts.dev/node
|
|
164
184
|
*/
|
|
165
185
|
openapiTsOptions?: OpenAPITSOptions
|
|
186
|
+
/**
|
|
187
|
+
* Whether to exclude deprecated API endpoints.
|
|
188
|
+
* @default false
|
|
189
|
+
*/
|
|
190
|
+
excludeDeprecated?: boolean
|
|
166
191
|
}
|
|
167
192
|
```
|
|
168
193
|
|
package/dist/cli.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { Command } from "commander";
|
|
|
5
5
|
const program = new Command();
|
|
6
6
|
program.version(getCliVersion());
|
|
7
7
|
program.action(async () => {
|
|
8
|
-
const { generate } = await import("./generate-
|
|
8
|
+
const { generate } = await import("./generate-SAL57AwU.mjs").then((n) => n.i);
|
|
9
9
|
return generate();
|
|
10
10
|
});
|
|
11
11
|
program.parse();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as getResponseMetadataItems, c as isRequiredRequestBody, d as readTemplateFile, f as CWD, i as getRequestBodyContentType, l as readSchema, p as SUPPORTED_HTTP_METHODS } from "./utils-DachPo4u.mjs";
|
|
2
2
|
import pluralize from "pluralize";
|
|
3
|
-
import { camelize, groupBy, isArray, merge, pascalCase } from "rattail";
|
|
3
|
+
import { camelize, groupBy, isArray, merge, pascalCase, upperFirst } from "rattail";
|
|
4
4
|
import { resolve } from "path";
|
|
5
5
|
import ejs from "ejs";
|
|
6
6
|
import fse from "fs-extra";
|
|
@@ -112,6 +112,7 @@ async function getConfig() {
|
|
|
112
112
|
//#endregion
|
|
113
113
|
//#region src/generate.ts
|
|
114
114
|
var generate_exports = /* @__PURE__ */ __exportAll({
|
|
115
|
+
detectCollisions: () => detectCollisions,
|
|
115
116
|
generate: () => generate,
|
|
116
117
|
generateTypes: () => generateTypes,
|
|
117
118
|
partitionApiModules: () => partitionApiModules,
|
|
@@ -143,16 +144,13 @@ function transformPayloads(pathItems, options) {
|
|
|
143
144
|
});
|
|
144
145
|
const requestContentType = operation.requestBody ? getRequestBodyContentType(operation.requestBody) : void 0;
|
|
145
146
|
const responseMetadataItems = getResponseMetadataItems(operation, validateStatus);
|
|
146
|
-
const
|
|
147
|
+
const nameArgs = {
|
|
147
148
|
...args,
|
|
148
149
|
verb,
|
|
149
150
|
entity
|
|
150
|
-
}
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
verb,
|
|
154
|
-
entity
|
|
155
|
-
});
|
|
151
|
+
};
|
|
152
|
+
const fn = transformer.name ? transformer.name(nameArgs) : transformer.fn(nameArgs);
|
|
153
|
+
const type = transformer.name ? upperFirst(fn) : transformer.type(nameArgs);
|
|
156
154
|
const typeValue = transformer.typeValue({
|
|
157
155
|
...args,
|
|
158
156
|
verb,
|
|
@@ -286,6 +284,22 @@ async function generateTypes(schema, output, typesFilename, openapiTsOptions) {
|
|
|
286
284
|
fse.outputFileSync(typesFilepath, contents);
|
|
287
285
|
logger.success(`Generated ${typesFilepath}`);
|
|
288
286
|
}
|
|
287
|
+
function detectCollisions(apiModules) {
|
|
288
|
+
const fnMap = /* @__PURE__ */ new Map();
|
|
289
|
+
for (const apiModule of apiModules) for (const payload of apiModule.payloads) {
|
|
290
|
+
const entries = fnMap.get(payload.fn) ?? [];
|
|
291
|
+
entries.push({
|
|
292
|
+
module: apiModule.name,
|
|
293
|
+
url: payload.url,
|
|
294
|
+
method: payload.method
|
|
295
|
+
});
|
|
296
|
+
fnMap.set(payload.fn, entries);
|
|
297
|
+
}
|
|
298
|
+
for (const [fn, entries] of fnMap) if (entries.length > 1) {
|
|
299
|
+
const endpoints = entries.map((e) => `[${e.method.toUpperCase()}] ${e.url}`).join(", ");
|
|
300
|
+
logger.warn(`API name collision: "${fn}" is generated by multiple endpoints: ${endpoints}. Consider using the "transformer" option to customize API naming.`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
289
303
|
async function generate(userOptions = {}) {
|
|
290
304
|
const { base, ts = true, typesOnly = false, overrides = true, preset = "axle", input = "./schema.json", output = "./src/apis/generated", typesFilename = "_types.ts", clean = true, validateStatus = (status) => status >= 200 && status < 300, transformer = {}, uncountableNouns = [], openapiTsOptions = {}, excludeDeprecated = false } = merge(await getConfig(), userOptions);
|
|
291
305
|
const mergedTransformer = {
|
|
@@ -300,13 +314,15 @@ async function generate(userOptions = {}) {
|
|
|
300
314
|
logger.info("Generating API modules...");
|
|
301
315
|
if (openapiTsOptions.excludeDeprecated === void 0) openapiTsOptions.excludeDeprecated = excludeDeprecated;
|
|
302
316
|
if (ts) await generateTypes(schema, output, typesFilename, openapiTsOptions);
|
|
303
|
-
|
|
317
|
+
const apiModules = partitionApiModules(schema, {
|
|
304
318
|
base,
|
|
305
319
|
uncountableNouns,
|
|
306
320
|
transformer: mergedTransformer,
|
|
307
321
|
validateStatus,
|
|
308
322
|
excludeDeprecated
|
|
309
|
-
})
|
|
323
|
+
});
|
|
324
|
+
detectCollisions(apiModules);
|
|
325
|
+
await renderApiModules(apiModules, {
|
|
310
326
|
output,
|
|
311
327
|
typesFilename,
|
|
312
328
|
ts,
|
|
@@ -317,4 +333,4 @@ async function generate(userOptions = {}) {
|
|
|
317
333
|
logger.success("Done");
|
|
318
334
|
}
|
|
319
335
|
//#endregion
|
|
320
|
-
export {
|
|
336
|
+
export { transformUrl as C, transformTypeValue as S, transformTypeQueryValue as _, partitionApiModules as a, transformTypeResponseBody as b, defineConfig as c, transformComment as d, transformEntity as f, transformTypeQuery as g, transformType as h, generate_exports as i, getConfig as l, transformModuleName as m, generate as n, renderApiModules as o, transformFn as p, generateTypes as r, transformPayloads as s, detectCollisions as t, createTransformer as u, transformTypeRequestBody as v, transformVerb as w, transformTypeResponseBodyValue as x, transformTypeRequestBodyValue as y };
|
package/dist/index.d.mts
CHANGED
|
@@ -171,6 +171,7 @@ interface Transformer {
|
|
|
171
171
|
url: typeof transformUrl;
|
|
172
172
|
comment: typeof transformComment;
|
|
173
173
|
entity: typeof transformEntity;
|
|
174
|
+
name?: typeof transformFn;
|
|
174
175
|
fn: typeof transformFn;
|
|
175
176
|
type: typeof transformType;
|
|
176
177
|
typeValue: typeof transformTypeValue;
|
|
@@ -367,6 +368,7 @@ declare function renderApiModules(apiModules: ApiModule[], options: {
|
|
|
367
368
|
preset: Preset;
|
|
368
369
|
}): Promise<unknown[]>;
|
|
369
370
|
declare function generateTypes(schema: OpenAPI3, output: string, typesFilename: string, openapiTsOptions: OpenAPITSOptions): Promise<void>;
|
|
371
|
+
declare function detectCollisions(apiModules: ApiModule[]): void;
|
|
370
372
|
declare function generate(userOptions?: GenerateOptions): Promise<void>;
|
|
371
373
|
//#endregion
|
|
372
374
|
//#region src/config.d.ts
|
|
@@ -374,4 +376,4 @@ type Config = GenerateOptions;
|
|
|
374
376
|
declare function defineConfig(config: Config): GenerateOptions;
|
|
375
377
|
declare function getConfig(): Promise<Config>;
|
|
376
378
|
//#endregion
|
|
377
|
-
export { ApiModule, ApiModulePayload, ApiModuleTemplateData, Config, GenerateOptions, Preset, ResponseMetadataItem, StatusCodeStrategy, StatusCodes, Transformer, TransformerBaseArgs, createStatusCodesByStrategy, createTransformer, defineConfig, findObjectKey, generate, generateTypes, getCliVersion, getConfig, getRequestBodyContentType, getResponseMetadataItems, getSchemaNode, isRemoteSchema, isRequiredRequestBody, partitionApiModules, pluralize, readSchema, readSchemaContent, readTemplateFile, renderApiModules, transformComment, transformEntity, transformFn, transformModuleName, transformPayloads, transformType, transformTypeQuery, transformTypeQueryValue, transformTypeRequestBody, transformTypeRequestBodyValue, transformTypeResponseBody, transformTypeResponseBodyValue, transformTypeValue, transformUrl, transformVerb };
|
|
379
|
+
export { ApiModule, ApiModulePayload, ApiModuleTemplateData, Config, GenerateOptions, Preset, ResponseMetadataItem, StatusCodeStrategy, StatusCodes, Transformer, TransformerBaseArgs, createStatusCodesByStrategy, createTransformer, defineConfig, detectCollisions, findObjectKey, generate, generateTypes, getCliVersion, getConfig, getRequestBodyContentType, getResponseMetadataItems, getSchemaNode, isRemoteSchema, isRequiredRequestBody, partitionApiModules, pluralize, readSchema, readSchemaContent, readTemplateFile, renderApiModules, transformComment, transformEntity, transformFn, transformModuleName, transformPayloads, transformType, transformTypeQuery, transformTypeQueryValue, transformTypeRequestBody, transformTypeRequestBodyValue, transformTypeResponseBody, transformTypeResponseBodyValue, transformTypeValue, transformUrl, transformVerb };
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as
|
|
1
|
+
import { C as transformUrl, S as transformTypeValue, _ as transformTypeQueryValue, a as partitionApiModules, b as transformTypeResponseBody, c as defineConfig, d as transformComment, f as transformEntity, g as transformTypeQuery, h as transformType, l as getConfig, m as transformModuleName, n as generate, o as renderApiModules, p as transformFn, r as generateTypes, s as transformPayloads, t as detectCollisions, u as createTransformer, v as transformTypeRequestBody, w as transformVerb, x as transformTypeResponseBodyValue, y as transformTypeRequestBodyValue } from "./generate-SAL57AwU.mjs";
|
|
2
2
|
import { a as getResponseMetadataItems, c as isRequiredRequestBody, d as readTemplateFile, i as getRequestBodyContentType, l as readSchema, n as findObjectKey, o as getSchemaNode, r as getCliVersion, s as isRemoteSchema, t as createStatusCodesByStrategy, u as readSchemaContent } from "./utils-DachPo4u.mjs";
|
|
3
3
|
import pluralize from "pluralize";
|
|
4
|
-
export { createStatusCodesByStrategy, createTransformer, defineConfig, findObjectKey, generate, generateTypes, getCliVersion, getConfig, getRequestBodyContentType, getResponseMetadataItems, getSchemaNode, isRemoteSchema, isRequiredRequestBody, partitionApiModules, pluralize, readSchema, readSchemaContent, readTemplateFile, renderApiModules, transformComment, transformEntity, transformFn, transformModuleName, transformPayloads, transformType, transformTypeQuery, transformTypeQueryValue, transformTypeRequestBody, transformTypeRequestBodyValue, transformTypeResponseBody, transformTypeResponseBodyValue, transformTypeValue, transformUrl, transformVerb };
|
|
4
|
+
export { createStatusCodesByStrategy, createTransformer, defineConfig, detectCollisions, findObjectKey, generate, generateTypes, getCliVersion, getConfig, getRequestBodyContentType, getResponseMetadataItems, getSchemaNode, isRemoteSchema, isRequiredRequestBody, partitionApiModules, pluralize, readSchema, readSchemaContent, readTemplateFile, renderApiModules, transformComment, transformEntity, transformFn, transformModuleName, transformPayloads, transformType, transformTypeQuery, transformTypeQueryValue, transformTypeRequestBody, transformTypeRequestBodyValue, transformTypeResponseBody, transformTypeResponseBodyValue, transformTypeValue, transformUrl, transformVerb };
|