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 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-C4lplT2F.mjs").then((n) => n.r);
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 fn = transformer.fn({
147
+ const nameArgs = {
147
148
  ...args,
148
149
  verb,
149
150
  entity
150
- });
151
- const type = transformer.type({
152
- ...args,
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
- await renderApiModules(partitionApiModules(schema, {
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 { transformVerb as C, transformUrl as S, transformTypeRequestBody as _, renderApiModules as a, transformTypeResponseBodyValue as b, getConfig as c, transformEntity as d, transformFn as f, transformTypeQueryValue as g, transformTypeQuery as h, partitionApiModules as i, createTransformer as l, transformType as m, generateTypes as n, transformPayloads as o, transformModuleName as p, generate_exports as r, defineConfig as s, generate as t, transformComment as u, transformTypeRequestBodyValue as v, transformTypeValue as x, transformTypeResponseBody as y };
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 transformVerb, S as transformUrl, _ as transformTypeRequestBody, a as renderApiModules, b as transformTypeResponseBodyValue, c as getConfig, d as transformEntity, f as transformFn, g as transformTypeQueryValue, h as transformTypeQuery, i as partitionApiModules, l as createTransformer, m as transformType, n as generateTypes, o as transformPayloads, p as transformModuleName, s as defineConfig, t as generate, u as transformComment, v as transformTypeRequestBodyValue, x as transformTypeValue, y as transformTypeResponseBody } from "./generate-C4lplT2F.mjs";
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "api-farmer",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "API module generation tool based on Openapi3/Swagger2.",
5
5
  "keywords": [
6
6
  "api generator",