swagshot 0.1.0

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.
Files changed (68) hide show
  1. package/README.md +182 -0
  2. package/dist/cli/commands/config.d.ts +2 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +34 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/generate.d.ts +9 -0
  7. package/dist/cli/commands/generate.d.ts.map +1 -0
  8. package/dist/cli/commands/generate.js +74 -0
  9. package/dist/cli/commands/generate.js.map +1 -0
  10. package/dist/cli/commands/init.d.ts +4 -0
  11. package/dist/cli/commands/init.d.ts.map +1 -0
  12. package/dist/cli/commands/init.js +104 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/commands/list.d.ts +6 -0
  15. package/dist/cli/commands/list.d.ts.map +1 -0
  16. package/dist/cli/commands/list.js +26 -0
  17. package/dist/cli/commands/list.js.map +1 -0
  18. package/dist/cli/index.d.ts +3 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +40 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +71 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lib/codeGenerator.d.ts +6 -0
  27. package/dist/lib/codeGenerator.d.ts.map +1 -0
  28. package/dist/lib/codeGenerator.js +331 -0
  29. package/dist/lib/codeGenerator.js.map +1 -0
  30. package/dist/lib/configManager.d.ts +8 -0
  31. package/dist/lib/configManager.d.ts.map +1 -0
  32. package/dist/lib/configManager.js +59 -0
  33. package/dist/lib/configManager.js.map +1 -0
  34. package/dist/lib/detectStructure.d.ts +3 -0
  35. package/dist/lib/detectStructure.d.ts.map +1 -0
  36. package/dist/lib/detectStructure.js +65 -0
  37. package/dist/lib/detectStructure.js.map +1 -0
  38. package/dist/lib/fetchSwagger.d.ts +5 -0
  39. package/dist/lib/fetchSwagger.d.ts.map +1 -0
  40. package/dist/lib/fetchSwagger.js +57 -0
  41. package/dist/lib/fetchSwagger.js.map +1 -0
  42. package/dist/lib/types.d.ts +101 -0
  43. package/dist/lib/types.d.ts.map +1 -0
  44. package/dist/lib/types.js +3 -0
  45. package/dist/lib/types.js.map +1 -0
  46. package/dist/tools/configUpdate.d.ts +2 -0
  47. package/dist/tools/configUpdate.d.ts.map +1 -0
  48. package/dist/tools/configUpdate.js +25 -0
  49. package/dist/tools/configUpdate.js.map +1 -0
  50. package/dist/tools/setup.d.ts +2 -0
  51. package/dist/tools/setup.d.ts.map +1 -0
  52. package/dist/tools/setup.js +63 -0
  53. package/dist/tools/setup.js.map +1 -0
  54. package/dist/tools/sync.d.ts +2 -0
  55. package/dist/tools/sync.d.ts.map +1 -0
  56. package/dist/tools/sync.js +87 -0
  57. package/dist/tools/sync.js.map +1 -0
  58. package/package.json +39 -0
  59. package/src/cli/commands/config.ts +33 -0
  60. package/src/cli/commands/generate.ts +90 -0
  61. package/src/cli/commands/init.ts +76 -0
  62. package/src/cli/commands/list.ts +31 -0
  63. package/src/cli/index.ts +44 -0
  64. package/src/lib/codeGenerator.ts +376 -0
  65. package/src/lib/configManager.ts +54 -0
  66. package/src/lib/detectStructure.ts +66 -0
  67. package/src/lib/fetchSwagger.ts +52 -0
  68. package/src/lib/types.ts +102 -0
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schemaToTS = schemaToTS;
4
+ exports.generateTypes = generateTypes;
5
+ exports.generateApiFile = generateApiFile;
6
+ // ── Schema → TypeScript type ──────────────────────────────────────────────
7
+ function schemaToTS(schema, schemas = {}, indent = 0) {
8
+ if (schema.$ref) {
9
+ const name = schema.$ref.split("/").pop();
10
+ return toPascalCase(name);
11
+ }
12
+ if (schema.allOf) {
13
+ return schema.allOf.map((s) => schemaToTS(s, schemas, indent)).join(" & ");
14
+ }
15
+ if (schema.oneOf || schema.anyOf) {
16
+ const arr = schema.oneOf ?? schema.anyOf;
17
+ return arr.map((s) => schemaToTS(s, schemas, indent)).join(" | ");
18
+ }
19
+ if (schema.enum) {
20
+ return schema.enum.map((v) => JSON.stringify(v)).join(" | ");
21
+ }
22
+ switch (schema.type) {
23
+ case "string":
24
+ return "string";
25
+ case "number":
26
+ case "integer":
27
+ return "number";
28
+ case "boolean":
29
+ return "boolean";
30
+ case "array":
31
+ return schema.items ? `${schemaToTS(schema.items, schemas, indent)}[]` : "unknown[]";
32
+ case "object": {
33
+ if (!schema.properties) {
34
+ if (schema.additionalProperties) {
35
+ const valType = typeof schema.additionalProperties === "object"
36
+ ? schemaToTS(schema.additionalProperties, schemas, indent)
37
+ : "unknown";
38
+ return `Record<string, ${valType}>`;
39
+ }
40
+ return "Record<string, unknown>";
41
+ }
42
+ const pad = " ".repeat(indent + 1);
43
+ const required = new Set(schema.required ?? []);
44
+ const props = Object.entries(schema.properties)
45
+ .map(([k, v]) => {
46
+ const optional = !required.has(k) ? "?" : "";
47
+ const nullable = v.nullable ? " | null" : "";
48
+ return `${pad}${k}${optional}: ${schemaToTS(v, schemas, indent + 1)}${nullable};`;
49
+ })
50
+ .join("\n");
51
+ return `{\n${props}\n${" ".repeat(indent)}}`;
52
+ }
53
+ default:
54
+ return "unknown";
55
+ }
56
+ }
57
+ // Swagger 2.0은 definitions, OpenAPI 3.0은 components.schemas
58
+ function getSchemas(spec) {
59
+ return spec.components?.schemas ?? spec.definitions ?? {};
60
+ }
61
+ function generateTypes(spec, tag) {
62
+ const schemas = getSchemas(spec);
63
+ const lines = [
64
+ `// Auto-generated by swagshot`,
65
+ `// Tag: ${tag}`,
66
+ `// Do not edit manually`,
67
+ "",
68
+ ];
69
+ // Collect referenced schemas from this tag's paths
70
+ const referencedSchemas = collectReferencedSchemas(spec, tag);
71
+ for (const schemaName of referencedSchemas) {
72
+ const schema = schemas[schemaName];
73
+ if (!schema)
74
+ continue;
75
+ lines.push(`export interface ${toPascalCase(schemaName)} ${schemaToTS(schema, schemas)}`);
76
+ lines.push("");
77
+ }
78
+ // Generate request/response types per operation
79
+ for (const [, pathItem] of Object.entries(spec.paths)) {
80
+ for (const [, op] of Object.entries(pathItem)) {
81
+ if (!op?.tags?.includes(tag) || !op.operationId)
82
+ continue;
83
+ // Query params type
84
+ const queryParams = (op.parameters ?? []).filter((p) => p.in === "query");
85
+ if (queryParams.length > 0) {
86
+ const typeName = `${toPascalCase(op.operationId)}Params`;
87
+ const props = queryParams
88
+ .map((p) => {
89
+ const optional = !p.required ? "?" : "";
90
+ const tsType = schemaToTS(paramToSchema(p), schemas);
91
+ return ` ${p.name}${optional}: ${tsType};`;
92
+ })
93
+ .join("\n");
94
+ lines.push(`export interface ${typeName} {`);
95
+ lines.push(props);
96
+ lines.push("}");
97
+ lines.push("");
98
+ }
99
+ // Inline response type (응답 스키마가 $ref 없는 inline object일 때)
100
+ const okRes = op.responses["200"] ?? op.responses["201"];
101
+ if (okRes) {
102
+ const resSchema = getResponseSchema(okRes);
103
+ if (resSchema && !resSchema.$ref) {
104
+ const typeName = `${toPascalCase(op.operationId)}Response`;
105
+ lines.push(`export interface ${typeName} ${schemaToTS(resSchema, schemas)}`);
106
+ lines.push("");
107
+ }
108
+ }
109
+ // Inline request body type (Swagger 2.0 body param 또는 OpenAPI 3.0 inline requestBody)
110
+ const bodyType = extractBodyType(op, schemas);
111
+ if (bodyType && bodyType.startsWith("{")) {
112
+ // inline object → named interface
113
+ const typeName = `${toPascalCase(op.operationId)}Request`;
114
+ lines.push(`export interface ${typeName} ${bodyType}`);
115
+ lines.push("");
116
+ }
117
+ }
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ // ── API function generator ────────────────────────────────────────────────
122
+ function generateApiFile(spec, tag, config) {
123
+ const schemas = getSchemas(spec);
124
+ const { httpClient, axiosInstance, queryLibrary } = config.style;
125
+ const tagCamel = toCamelCase(tag.replace(/-controller$/, "").replace(/-/g, " "));
126
+ const typesImportPath = `../types/${tagCamel}`;
127
+ // Suppress unused variable warning for queryLibrary
128
+ void queryLibrary;
129
+ const lines = [
130
+ `// Auto-generated by swagshot`,
131
+ `// Tag: ${tag}`,
132
+ `// Do not edit manually`,
133
+ "",
134
+ ];
135
+ // Imports
136
+ if (httpClient === "axios" && axiosInstance) {
137
+ lines.push(`import api from '${axiosInstance.replace(/\.ts$/, "")}';`);
138
+ }
139
+ else if (httpClient === "axios") {
140
+ lines.push(`import axios from 'axios';`);
141
+ lines.push(`const api = axios.create({ baseURL: '' });`);
142
+ }
143
+ // Collect type imports
144
+ const typeImports = new Set();
145
+ for (const [, pathItem] of Object.entries(spec.paths)) {
146
+ for (const [, op] of Object.entries(pathItem)) {
147
+ if (!op?.tags?.includes(tag) || !op.operationId)
148
+ continue;
149
+ const queryParams = (op.parameters ?? []).filter((p) => p.in === "query");
150
+ if (queryParams.length > 0) {
151
+ typeImports.add(`${toPascalCase(op.operationId)}Params`);
152
+ }
153
+ // Response type
154
+ const responseType = extractResponseType(op, schemas);
155
+ if (responseType && !isPrimitive(responseType)) {
156
+ typeImports.add(responseType);
157
+ }
158
+ // Request body type
159
+ const bodyType = extractBodyType(op, schemas);
160
+ if (bodyType && !isPrimitive(bodyType)) {
161
+ typeImports.add(bodyType);
162
+ }
163
+ }
164
+ }
165
+ if (typeImports.size > 0) {
166
+ lines.push(`import type { ${Array.from(typeImports).join(", ")} } from '${typesImportPath}';`);
167
+ }
168
+ lines.push("");
169
+ // Generate functions
170
+ for (const [pathKey, pathItem] of Object.entries(spec.paths)) {
171
+ for (const [method, op] of Object.entries(pathItem)) {
172
+ if (!op?.tags?.includes(tag) || !op.operationId)
173
+ continue;
174
+ const fnName = toCamelCase(op.operationId);
175
+ const pathParams = (op.parameters ?? []).filter((p) => p.in === "path");
176
+ const queryParams = (op.parameters ?? []).filter((p) => p.in === "query");
177
+ const bodyType = extractBodyType(op, schemas);
178
+ const responseType = extractResponseType(op, schemas) ?? "void";
179
+ // Build function signature
180
+ const params = [];
181
+ for (const p of pathParams) {
182
+ params.push(`${p.name}: ${p.schema ? schemaToTS(p.schema, schemas) : "string"}`);
183
+ }
184
+ if (queryParams.length > 0) {
185
+ const paramsType = `${toPascalCase(op.operationId)}Params`;
186
+ params.push(`params: ${paramsType}`);
187
+ }
188
+ if (bodyType && ["post", "put", "patch"].includes(method)) {
189
+ params.push(`data: ${bodyType}`);
190
+ }
191
+ if (op.summary) {
192
+ lines.push(`/** ${op.summary} */`);
193
+ }
194
+ const url = pathKey.replace(/{(\w+)}/g, "${$1}");
195
+ const hasQuery = queryParams.length > 0;
196
+ if (httpClient === "axios") {
197
+ lines.push(`export const ${fnName} = (${params.join(", ")}) =>`, ` api.${method}<${responseType}>(\`${url}\`${hasQuery ? ", { params }" : bodyType ? ", data" : ""});`);
198
+ }
199
+ else {
200
+ // fetch
201
+ lines.push(`export const ${fnName} = async (${params.join(", ")}): Promise<${responseType}> => {`, ` const url = new URL(\`${url}\`, window.location.origin);`);
202
+ if (hasQuery) {
203
+ lines.push(` Object.entries(params).forEach(([k, v]) => v != null && url.searchParams.set(k, String(v)));`);
204
+ }
205
+ lines.push(` const res = await fetch(url.toString()${bodyType ? `, { method: '${method.toUpperCase()}', body: JSON.stringify(data), headers: { 'Content-Type': 'application/json' } }` : ""});`, ` return res.json();`, `};`);
206
+ }
207
+ lines.push("");
208
+ }
209
+ }
210
+ return lines.join("\n");
211
+ }
212
+ // ── Helpers ───────────────────────────────────────────────────────────────
213
+ /** Swagger 2.0 파라미터는 schema 없이 type/items를 직접 가짐 → 통일된 SchemaObject로 변환 */
214
+ function paramToSchema(p) {
215
+ if (p.schema)
216
+ return p.schema; // OpenAPI 3.0
217
+ return {
218
+ type: p.type,
219
+ items: p.items,
220
+ enum: p.enum,
221
+ format: p.format,
222
+ };
223
+ }
224
+ /** Swagger 2.0 / OpenAPI 3.0 응답 스키마 추출 */
225
+ function getResponseSchema(res) {
226
+ if (res.content)
227
+ return res.content["application/json"]?.schema ?? null; // OpenAPI 3.0
228
+ return res.schema ?? null; // Swagger 2.0
229
+ }
230
+ function toPascalCase(str) {
231
+ return str
232
+ .replace(/[-_\s]+(.)/g, (_, c) => c.toUpperCase())
233
+ .replace(/^(.)/, (c) => c.toUpperCase());
234
+ }
235
+ function toCamelCase(str) {
236
+ const pascal = toPascalCase(str);
237
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
238
+ }
239
+ function isPrimitive(type) {
240
+ return ["string", "number", "boolean", "void", "unknown"].includes(type);
241
+ }
242
+ function extractResponseType(op, schemas) {
243
+ const ok = op.responses["200"] ?? op.responses["201"];
244
+ if (!ok)
245
+ return null;
246
+ const schema = getResponseSchema(ok);
247
+ if (!schema)
248
+ return null;
249
+ if (schema.$ref)
250
+ return toPascalCase(schema.$ref.split("/").pop());
251
+ if (schema.type === "array" && schema.items?.$ref) {
252
+ return `${toPascalCase(schema.items.$ref.split("/").pop())}[]`;
253
+ }
254
+ if (schema.type === "object" || schema.properties) {
255
+ // inline object → use named response type
256
+ return `${toPascalCase(op.operationId ?? "unknown")}Response`;
257
+ }
258
+ return schemaToTS(schema, schemas);
259
+ }
260
+ function extractBodyType(op, schemas) {
261
+ // OpenAPI 3.0
262
+ if (op.requestBody?.content) {
263
+ const schema = op.requestBody.content["application/json"]?.schema;
264
+ if (!schema)
265
+ return null;
266
+ if (schema.$ref)
267
+ return toPascalCase(schema.$ref.split("/").pop());
268
+ return schemaToTS(schema, schemas);
269
+ }
270
+ // Swagger 2.0: body parameter
271
+ const bodyParam = (op.parameters ?? []).find((p) => p.in === "body");
272
+ if (bodyParam?.schema) {
273
+ if (bodyParam.schema.$ref)
274
+ return toPascalCase(bodyParam.schema.$ref.split("/").pop());
275
+ return schemaToTS(bodyParam.schema, schemas);
276
+ }
277
+ return null;
278
+ }
279
+ function collectReferencedSchemas(spec, tag) {
280
+ const refs = new Set();
281
+ const allSchemas = getSchemas(spec);
282
+ function collectFromSchema(schema) {
283
+ if (schema.$ref) {
284
+ const name = schema.$ref.split("/").pop();
285
+ if (refs.has(name))
286
+ return; // 순환 참조 방지
287
+ refs.add(name);
288
+ // Recurse into the referenced schema
289
+ const nested = allSchemas[name];
290
+ if (nested)
291
+ collectFromSchema(nested);
292
+ }
293
+ if (schema.properties) {
294
+ Object.values(schema.properties).forEach(collectFromSchema);
295
+ }
296
+ if (schema.items)
297
+ collectFromSchema(schema.items);
298
+ if (schema.allOf)
299
+ schema.allOf.forEach(collectFromSchema);
300
+ if (schema.oneOf)
301
+ schema.oneOf.forEach(collectFromSchema);
302
+ if (schema.anyOf)
303
+ schema.anyOf.forEach(collectFromSchema);
304
+ }
305
+ for (const [, pathItem] of Object.entries(spec.paths)) {
306
+ for (const [, op] of Object.entries(pathItem)) {
307
+ if (!op?.tags?.includes(tag))
308
+ continue;
309
+ // Check parameters (OpenAPI 3.0: schema / Swagger 2.0: direct fields)
310
+ for (const p of op.parameters ?? []) {
311
+ collectFromSchema(paramToSchema(p));
312
+ }
313
+ // Check request body (OpenAPI 3.0)
314
+ if (op.requestBody?.content) {
315
+ for (const mediaType of Object.values(op.requestBody.content)) {
316
+ const mt = mediaType;
317
+ if (mt.schema)
318
+ collectFromSchema(mt.schema);
319
+ }
320
+ }
321
+ // Check responses (OpenAPI 3.0 + Swagger 2.0)
322
+ for (const responseValue of Object.values(op.responses)) {
323
+ const schema = getResponseSchema(responseValue);
324
+ if (schema)
325
+ collectFromSchema(schema);
326
+ }
327
+ }
328
+ }
329
+ return Array.from(refs);
330
+ }
331
+ //# sourceMappingURL=codeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeGenerator.js","sourceRoot":"","sources":["../../src/lib/codeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SwagShotConfig } from "./types.js";
2
+ export declare const CONFIG_FILE = ".swagshot.json";
3
+ export declare function fileExists(filePath: string): Promise<boolean>;
4
+ export declare function dirExists(dirPath: string): Promise<boolean>;
5
+ export declare function readConfig(root: string): Promise<SwagShotConfig | null>;
6
+ export declare function writeConfig(root: string, config: SwagShotConfig): Promise<void>;
7
+ export declare function updateConfig(root: string, updates: Record<string, string | null>): Promise<SwagShotConfig>;
8
+ //# sourceMappingURL=configManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configManager.d.ts","sourceRoot":"","sources":["../../src/lib/configManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAE5C,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAK7E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,CAczB"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CONFIG_FILE = void 0;
7
+ exports.fileExists = fileExists;
8
+ exports.dirExists = dirExists;
9
+ exports.readConfig = readConfig;
10
+ exports.writeConfig = writeConfig;
11
+ exports.updateConfig = updateConfig;
12
+ const promises_1 = __importDefault(require("fs/promises"));
13
+ const path_1 = __importDefault(require("path"));
14
+ exports.CONFIG_FILE = ".swagshot.json";
15
+ async function fileExists(filePath) {
16
+ try {
17
+ await promises_1.default.access(filePath);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async function dirExists(dirPath) {
25
+ try {
26
+ const stat = await promises_1.default.stat(dirPath);
27
+ return stat.isDirectory();
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ async function readConfig(root) {
34
+ const configPath = path_1.default.join(root, exports.CONFIG_FILE);
35
+ if (!(await fileExists(configPath)))
36
+ return null;
37
+ const raw = await promises_1.default.readFile(configPath, "utf-8");
38
+ return JSON.parse(raw);
39
+ }
40
+ async function writeConfig(root, config) {
41
+ const configPath = path_1.default.join(root, exports.CONFIG_FILE);
42
+ await promises_1.default.writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
43
+ }
44
+ async function updateConfig(root, updates) {
45
+ const config = await readConfig(root);
46
+ if (!config)
47
+ throw new Error("설정 파일이 없습니다. swagger_setup을 먼저 실행하세요.");
48
+ for (const [key, value] of Object.entries(updates)) {
49
+ if (key in config.project) {
50
+ config.project[key] = value;
51
+ }
52
+ else if (key in config.style) {
53
+ config.style[key] = value;
54
+ }
55
+ }
56
+ await writeConfig(root, config);
57
+ return config;
58
+ }
59
+ //# sourceMappingURL=configManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../src/lib/configManager.ts"],"names":[],"mappings":";;;;;;AAMA,gCAOC;AAED,8BAOC;AAED,gCAKC;AAED,kCAGC;AAED,oCAiBC;AArDD,2DAA6B;AAC7B,gDAAwB;AAGX,QAAA,WAAW,GAAG,gBAAgB,CAAC;AAErC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;AAC3C,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAsB;IACpE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;IAChD,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,OAAsC;IAEtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,OAAmC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3D,CAAC;aAAM,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAiC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DetectedStructure } from "./types.js";
2
+ export declare function detectProjectStructure(root: string): Promise<DetectedStructure>;
3
+ //# sourceMappingURL=detectStructure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectStructure.d.ts","sourceRoot":"","sources":["../../src/lib/detectStructure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4DrF"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.detectProjectStructure = detectProjectStructure;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const configManager_js_1 = require("./configManager.js");
10
+ async function detectProjectStructure(root) {
11
+ const candidates = {
12
+ apiDir: ["api", "apis", "src/api", "src/apis", "src/services", "src/lib/api", "src/fetchers"],
13
+ typesDir: ["types", "types/api", "src/types/api", "src/types", "src/@types", "src/models", "src/interfaces"],
14
+ hooksDir: ["hooks", "hooks/api", "src/hooks/api", "src/hooks/queries", "src/hooks", "src/queries"],
15
+ };
16
+ const detected = {
17
+ apiDir: null,
18
+ typesDir: null,
19
+ hooksDir: null,
20
+ httpClient: null,
21
+ queryLibrary: null,
22
+ axiosInstance: null,
23
+ };
24
+ for (const [key, paths] of Object.entries(candidates)) {
25
+ for (const p of paths) {
26
+ if (await (0, configManager_js_1.dirExists)(path_1.default.join(root, p))) {
27
+ detected[key] = p;
28
+ break;
29
+ }
30
+ }
31
+ }
32
+ // Detect from package.json
33
+ const pkgPath = path_1.default.join(root, "package.json");
34
+ if (await (0, configManager_js_1.fileExists)(pkgPath)) {
35
+ const pkg = JSON.parse(await promises_1.default.readFile(pkgPath, "utf-8"));
36
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
37
+ detected.httpClient = "axios" in deps ? "axios" : "fetch";
38
+ detected.queryLibrary =
39
+ "@tanstack/react-query" in deps
40
+ ? "react-query"
41
+ : "react-query" in deps
42
+ ? "react-query"
43
+ : "swr" in deps
44
+ ? "swr"
45
+ : null;
46
+ }
47
+ // Try to find axios instance file
48
+ if (detected.httpClient === "axios") {
49
+ const axiosCandidates = [
50
+ "src/lib/axios.ts",
51
+ "src/lib/api.ts",
52
+ "src/utils/axios.ts",
53
+ "src/api/client.ts",
54
+ "src/config/axios.ts",
55
+ ];
56
+ for (const p of axiosCandidates) {
57
+ if (await (0, configManager_js_1.fileExists)(path_1.default.join(root, p))) {
58
+ detected.axiosInstance = p;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ return detected;
64
+ }
65
+ //# sourceMappingURL=detectStructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectStructure.js","sourceRoot":"","sources":["../../src/lib/detectStructure.ts"],"names":[],"mappings":";;;;;AAKA,wDA4DC;AAjED,2DAA6B;AAC7B,gDAAwB;AAExB,yDAA2D;AAEpD,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,MAAM,UAAU,GAAG;QACjB,MAAM,EAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,CAAC;QAC/F,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,CAAC;QAC5G,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,CAAC;KACnG,CAAC;IAEF,MAAM,QAAQ,GAAsB;QAClC,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,MAAM,IAAA,4BAAS,EAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,QAA+C,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,IAAI,MAAM,IAAA,6BAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAE7D,QAAQ,CAAC,UAAU,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,QAAQ,CAAC,YAAY;YACnB,uBAAuB,IAAI,IAAI;gBAC7B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,aAAa,IAAI,IAAI;oBACvB,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,KAAK,IAAI,IAAI;wBACf,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,IAAI,CAAC;IACb,CAAC;IAED,kCAAkC;IAClC,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,eAAe,GAAG;YACtB,kBAAkB;YAClB,gBAAgB;YAChB,oBAAoB;YACpB,mBAAmB;YACnB,qBAAqB;SACtB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,IAAI,MAAM,IAAA,6BAAU,EAAC,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { SwaggerSpec } from "./types.js";
2
+ export declare function fetchSwaggerSpec(input: string): Promise<SwaggerSpec>;
3
+ export declare function getControllerTags(spec: SwaggerSpec): string[];
4
+ export declare function filterByTag(spec: SwaggerSpec, tag: string, includeDeprecated?: boolean): SwaggerSpec;
5
+ //# sourceMappingURL=fetchSwagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchSwagger.d.ts","sourceRoot":"","sources":["../../src/lib/fetchSwagger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgB1E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAU7D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,UAAQ,GAAG,WAAW,CAgBlG"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchSwaggerSpec = fetchSwaggerSpec;
7
+ exports.getControllerTags = getControllerTags;
8
+ exports.filterByTag = filterByTag;
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const promises_1 = __importDefault(require("fs/promises"));
11
+ const configManager_js_1 = require("./configManager.js");
12
+ async function fetchSwaggerSpec(input) {
13
+ // Local file
14
+ if (!input.startsWith("http")) {
15
+ if (!(await (0, configManager_js_1.fileExists)(input))) {
16
+ throw new Error(`파일을 찾을 수 없습니다: ${input}`);
17
+ }
18
+ const raw = await promises_1.default.readFile(input, "utf-8");
19
+ return JSON.parse(raw);
20
+ }
21
+ // Remote URL
22
+ const response = await axios_1.default.get(input, {
23
+ headers: { Accept: "application/json" },
24
+ timeout: 10000,
25
+ });
26
+ return response.data;
27
+ }
28
+ function getControllerTags(spec) {
29
+ const tags = new Set();
30
+ for (const pathItem of Object.values(spec.paths)) {
31
+ for (const op of Object.values(pathItem)) {
32
+ if (op?.tags) {
33
+ for (const tag of op.tags)
34
+ tags.add(tag);
35
+ }
36
+ }
37
+ }
38
+ return Array.from(tags);
39
+ }
40
+ function filterByTag(spec, tag, includeDeprecated = false) {
41
+ const filteredPaths = {};
42
+ for (const [pathKey, pathItem] of Object.entries(spec.paths)) {
43
+ const filteredItem = {};
44
+ for (const [method, op] of Object.entries(pathItem)) {
45
+ if (!op?.tags?.includes(tag))
46
+ continue;
47
+ if (!includeDeprecated && op.deprecated)
48
+ continue;
49
+ filteredItem[method] = op;
50
+ }
51
+ if (Object.keys(filteredItem).length > 0) {
52
+ filteredPaths[pathKey] = filteredItem;
53
+ }
54
+ }
55
+ return { ...spec, paths: filteredPaths };
56
+ }
57
+ //# sourceMappingURL=fetchSwagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchSwagger.js","sourceRoot":"","sources":["../../src/lib/fetchSwagger.ts"],"names":[],"mappings":";;;;;AAKA,4CAgBC;AAED,8CAUC;AAED,kCAgBC;AAnDD,kDAA0B;AAC1B,2DAA6B;AAC7B,yDAAgD;AAGzC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,aAAa;IACb,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,IAAA,6BAAU,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAED,aAAa;IACb,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAc,KAAK,EAAE;QACnD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAiB;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;gBACb,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,WAAW,CAAC,IAAiB,EAAE,GAAW,EAAE,iBAAiB,GAAG,KAAK;IACnF,MAAM,aAAa,GAAyB,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,YAAY,GAAoB,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,UAAU;gBAAE,SAAS;YACjD,YAAwC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,aAAa,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC"}