@bitstack/ng-query-codegen-openapi 0.0.30 → 0.0.31-alpha.1
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 +8 -1
- package/lib/bin/cli.mjs +78 -60
- package/lib/bin/cli.mjs.map +1 -1
- package/lib/index.d.mts +4 -13
- package/lib/index.d.ts +4 -13
- package/lib/index.js +351 -290
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +351 -290
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/bin/utils.ts +74 -3
- package/src/generators/common-types-generator.ts +6 -2
- package/src/generators/component-schema-generator.ts +40 -7
- package/src/generators/do-not-modify-generator.ts +2 -2
- package/src/generators/rtk-enhance-endpoints-generator.ts +113 -0
- package/src/generators/{query-service-generator.ts → rtk-query-generator.ts} +45 -33
- package/src/generators/tag-types-generator.ts +30 -0
- package/src/generators/types-generator.ts +216 -112
- package/src/generators/utils-generator.ts +2 -4
- package/src/index.ts +6 -3
- package/src/services/api-code-generator.ts +62 -74
- package/src/services/endpoint-info-extractor.ts +66 -14
- package/src/services/file-writer-service.ts +27 -23
- package/src/services/openapi-parser-service.ts +10 -2
- package/src/services/unified-code-generator.ts +55 -26
- package/src/types.ts +19 -40
- package/src/generators/api-service-generator.ts +0 -112
- package/src/generators/cache-keys-generator.ts +0 -43
- package/src/generators/index-generator.ts +0 -11
- package/src/services/api-service-generator.ts +0 -24
- package/src/services/query-code-generator.ts +0 -24
package/README.md
CHANGED
|
@@ -63,10 +63,17 @@ rm -rf test_output3/* && node lib/bin/cli.mjs rtk-query-codegen-slice.config.ts
|
|
|
63
63
|
new
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
npm run cli ./
|
|
66
|
+
npm run cli ./openapi-micro.config.ts
|
|
67
|
+
|
|
67
68
|
```
|
|
68
69
|
|
|
69
70
|
|
|
71
|
+
## Publish
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm run build
|
|
75
|
+
npm publish --access=public
|
|
76
|
+
```
|
|
70
77
|
|
|
71
78
|
## Step
|
|
72
79
|
|
package/lib/bin/cli.mjs
CHANGED
|
@@ -1,32 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
// [Warning] Generated automatically - do not edit manually
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Clear undefined in object
|
|
7
|
-
*/
|
|
8
|
-
export function withoutUndefined(obj?: Record<string, any>) {
|
|
9
|
-
if(typeof obj === 'undefined') return;
|
|
10
|
-
return Object.fromEntries(
|
|
11
|
-
Object.entries(obj).filter(([_, v]) => v !== undefined && v !== null)
|
|
12
|
-
);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
`}function ie(r){return r.toLowerCase().replace(/_([a-z])/g,(t,e)=>e.toUpperCase())}function se(r){let t=r.reduce((n,o)=>(n[o.groupKey]||(n[o.groupKey]=[]),n[o.groupKey].push({operationName:o.operationName,queryKeyName:o.queryKeyName}),n),{});return`// [Warning] Generated automatically - do not edit manually
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Cache keys enum for all API queries
|
|
19
|
-
*/
|
|
20
|
-
export enum ECacheKeys {
|
|
21
|
-
${Object.entries(t).map(([n,o])=>{let p=` // ${n.charAt(0).toUpperCase()+n.slice(1)} related cache keys`,a=o.map(c=>` ${c.queryKeyName} = '${ie(c.queryKeyName)}',`).join(`
|
|
22
|
-
`);return`${p}
|
|
23
|
-
${a}`}).join(`
|
|
24
|
-
|
|
25
|
-
`)}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export default ECacheKeys;
|
|
29
|
-
`}s();function ae(){return`/* eslint-disable */
|
|
2
|
+
var I=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var K=(r,t)=>()=>(r&&(t=r(r=0)),t);var Re=(r,t)=>{for(var e in t)I(r,e,{get:t[e],enumerable:!0})},Se=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ce(t))!Ne.call(r,o)&&o!==e&&I(r,o,{get:()=>t[o],enumerable:!(n=$e(t,o))||n.enumerable});return r};var Ee=r=>Se(I({},"__esModule",{value:!0}),r);import{fileURLToPath as Fe}from"node:url";var we,g,c=K(()=>{"use strict";we=()=>Fe(import.meta.url),g=we()});var ie={};Re(ie,{argumentMatches:()=>Le,defaultIsDataResponse:()=>Be,getOperationName:()=>S,getOverrides:()=>M,getTags:()=>ze,operationMatches:()=>oe});import{getOperationName as _e}from"oazapfts/generate";function Be(r,t){if(t&&r==="default")return!0;let e=Number(r);return!Number.isNaN(e)&&e>=200&&e<300}function S({verb:r,path:t}){return _e(r,t,void 0)}function ze({verb:r,pathItem:t}){return r?t[r]?.tags||[]:[]}function ne(r){let t=Array.isArray(r)?r:[r];return function(n){return r?t.some(o=>typeof o=="string"?o===n:o?.test(n)):!0}}function oe(r){let t=typeof r=="function"?r:ne(r);return function(n){if(!r)return!0;let o=S(n);return t(o,n)}}function Le(r){let t=typeof r=="function"?r:ne(r);return function(n){if(!r||n.in==="path")return!0;let o=n.name;return t(o,n)}}function M(r,t){return t?.find(e=>oe(e.pattern)(r))}var V=K(()=>{"use strict";c()});c();import j from"commander";import{createRequire as nt}from"node:module";c();import qe from"commander";import{createRequire as je}from"node:module";import{resolve as k}from"node:path";import{existsSync as G,rmSync as Ie,readdirSync as Ge,statSync as De,mkdirSync as Me}from"node:fs";import Q from"node:path";var O=je(g);function Ve(r){let t=new Map;if(!G(r))return t;function e(n){try{let o=Ge(n);for(let s of o){let a=Q.join(n,s);if(De(a).isDirectory())e(a);else if(s==="enhanceEndpoints.ts"){let u=O("node:fs").readFileSync(a);t.set(a,u)}}}catch{}}return e(r),t}function Ke(r){for(let[t,e]of r)try{let n=Q.dirname(t);G(n)||Me(n,{recursive:!0}),O("node:fs").writeFileSync(t,e)}catch(n){console.warn(`Failed to restore ${t}:`,n)}}function U(r){let t=["/","/usr","/etc","/var","/home","/Users",".",".."],e=k(r);if(t.some(n=>e===k(n))&&(console.error(`Dangerous path detected: ${e}. Refusing to delete.`),process.exit(1)),G(r)){console.log(`Cleaning output directory: ${r}`);let n=Ve(r);Ie(r,{recursive:!0,force:!0}),n.size>0&&(Ke(n),console.log(`Protected ${n.size} enhanceEndpoints.ts file(s) from deletion`)),console.log(`Directory cleaned: ${r}`)}}function W(){try{if(O.resolve("esbuild")&&O.resolve("esbuild-runner"))return O("esbuild-runner/register"),!0}catch{}try{if(O.resolve("typescript")&&O.resolve("ts-node"))return O("ts-node").register({transpileOnly:!0,compilerOptions:{target:"es6",module:"commonjs"}}),!0}catch{}return!1}function _(r){(!r||!/\.([mc]?(jsx?|tsx?)|jsonc?)?$/.test(r))&&(console.error("Please provide a valid configuration file."),qe.help())}function B(r,t){/\.[mc]?tsx?$/.test(r)&&!t&&(console.error("Encountered a TypeScript config file, but neither esbuild-runner nor ts-node are installed."),process.exit(1))}import{dirname as ot,resolve as it}from"node:path";c();c();import P from"node:path";import fe from"typescript";c();c();function $(r){return r.replace(r[0],r[0].toUpperCase())}c();import D from"node:fs";import ke from"node:path";c();function z(r){try{new URL(r)}catch{return!1}return!0}async function L(r,t){if(!z(r))throw new Error(`remoteFile must be a valid URL: ${r}`);try{let e=ke.dirname(t);D.existsSync(e)||await D.promises.mkdir(e,{recursive:!0});let n=await fetch(r);if(!n.ok)throw new Error(`Failed to download schema from ${r}: ${n.statusText}`);let o=await n.text();return await D.promises.writeFile(t,o,"utf-8"),console.log(`Schema downloaded from ${r} to ${t}`),t}catch(e){throw console.error(`Error downloading schema from ${r}:`,e),e}}c();c();var H=["get","put","post","delete","options","head","patch","trace"];function Z(r){return Object.entries(r.paths).flatMap(([t,e])=>e?Object.entries(e).filter(n=>H.includes(n[0])).map(([n,o])=>({path:t,verb:n,pathItem:e,operation:o})):[])}c();import Qe from"@apidevtools/swagger-parser";import Ue from"swagger2openapi";async function Y(r,t){let e=await Qe.bundle(r,{resolve:{http:t}});return"openapi"in e&&e.openapi.startsWith("3")?e:(await Ue.convertObj(e,{})).openapi}c();function J(r,t,e,n){return n?n(r,t):e?.type?e.type==="query":r==="get"}var C=class{docCache={};async getDocument(t,e){if(this.docCache[t])return this.docCache[t];let n=await Y(t,e);return this.docCache[t]=n,n}async downloadSchema(t,e){return L(t,e)}getPaths(t){return Object.keys(t.paths||{})}clearCache(){this.docCache={}}};c();import X from"lodash.camelcase";var N=class{groupPaths(t,e){let{groupKeyMatch:n,outputDir:o}=e,s=t.reduce((p,u)=>{let i=n(u),m=i?X(i):"_common";return p[m]||(p[m]=[]),p[m].push(u),p},{}),a={};for(let[p,u]of Object.entries(s))a[p]={groupKey:p,paths:u,outputPath:`${o}/${p}/query.service.ts`};return a}createGroupFilter(t,e){return(n,o)=>{let s=o.path,a=X(e.groupKeyMatch(s)||"");return a!==t&&(a||"_common")!==t?!1:e.filterEndpoint?e.filterEndpoint(n,s,t):!0}}};c();import re from"node:fs";import v from"node:path";c();import We from"node:path";import ee from"node:fs";async function te(r){let t=We.dirname(r);ee.existsSync(t)||await ee.promises.mkdir(t,{recursive:!0})}var R=class{async writeFile(t,e){try{let n=v.resolve(process.cwd(),t);return v.basename(n)==="enhanceEndpoints.ts"&&re.existsSync(n)?{path:n,success:!0}:(await te(n),re.writeFileSync(n,e),{path:n,success:!0})}catch(n){return{path:t,success:!1,error:n}}}async writeFiles(t){let e=[];for(let[n,o]of Object.entries(t)){let s=await this.writeFile(n,o);e.push(s)}return e}async writeGroupFiles(t,e){let n={};return e.types&&(n[v.join(t,"types.ts")]=e.types),e.queryService&&(n[v.join(t,"query.generated.ts")]=e.queryService),e.enhanceEndpoints&&(n[v.join(t,"enhanceEndpoints.ts")]=e.enhanceEndpoints),e.index&&(n[v.join(t,"index.ts")]=e.index),this.writeFiles(n)}async writeSharedFiles(t,e){let n={};return e.commonTypes&&(n[v.join(t,"common-types.ts")]=e.commonTypes),e.doNotModify&&(n[v.join(t,"DO_NOT_MODIFY.md")]=e.doNotModify),e.utils&&(n[v.join(t,"utils.ts")]=e.utils),this.writeFiles(n)}async writeSchemaFile(t,e){let n={};return n[v.join(t,"schema.ts")]=e,this.writeFiles(n)}};c();import He from"oazapfts/generate";var E=class{constructor(t,e){this.v3Doc=t;this.apiGen=new He(t,{unionUndefined:e.unionUndefined,mergeReadWriteOnly:e.mergeReadWriteOnly})}apiGen;initialize(){this.apiGen.spec.components?.schemas&&(Object.keys(this.apiGen.spec.components.schemas).forEach(t=>{let e=this.apiGen.spec.components.schemas[t];e&&typeof e=="object"&&"title"in e&&delete e.title}),this.apiGen.preprocessComponents(this.apiGen.spec.components.schemas),Object.keys(this.apiGen.spec.components.schemas).forEach(t=>{try{this.apiGen.getRefAlias({$ref:`#/components/schemas/${t}`})}catch{}}))}getOperationDefinitions(t){let{operationMatches:e}=(V(),Ee(ie));return Z(this.v3Doc).filter(e(t))}getApiGenerator(){return this.apiGen}getDocument(){return this.v3Doc}getSchemaTypeNames(){return new Set}};c();function se(){return`/* eslint-disable */
|
|
30
3
|
// [Warning] Generated automatically - do not edit manually
|
|
31
4
|
|
|
32
5
|
export interface RequestOptions {
|
|
@@ -43,19 +16,23 @@ export interface QueryConfig {
|
|
|
43
16
|
keepUnusedDataFor?: number,
|
|
44
17
|
}
|
|
45
18
|
|
|
19
|
+
export interface IRequestConfig extends RequestOptions {
|
|
20
|
+
timeout?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
46
23
|
export type IRestFulEndpointsQueryReturn<TVariables> = TVariables extends void ?
|
|
47
|
-
void | {fetchOptions?:
|
|
24
|
+
(void | {fetchOptions?: IRequestConfig;}):
|
|
48
25
|
{
|
|
49
26
|
variables: TVariables;
|
|
50
|
-
fetchOptions?:
|
|
27
|
+
fetchOptions?: IRequestConfig;
|
|
51
28
|
config?: QueryConfig;
|
|
52
29
|
};
|
|
53
|
-
`}
|
|
54
|
-
// [Warning] Generated automatically - do not edit manually
|
|
55
|
-
|
|
56
|
-
${
|
|
30
|
+
`}c();import f from"typescript";function Ze(r){return r.charAt(0).toUpperCase()+r.slice(1)}function Ye(r,t,e){return f.transform(r,[n=>o=>f.visitNode(o,function s(a){return f.isIdentifier(a)&&a.text===t?f.factory.createIdentifier(e):f.visitEachChild(a,s,n)})]).transformed[0]}function ae(r){let t=f.createPrinter({newLine:f.NewLineKind.LineFeed}),e=f.createSourceFile("component-schema.ts","",f.ScriptTarget.Latest,!1,f.ScriptKind.TS),n=[],o={};return Object.entries(r).forEach(([s,a])=>{let p=Ze(s);o[s]=p;let u=Ye(a,s,p),i=t.printNode(f.EmitHint.Unspecified,u,e);n.push(i)}),`/* eslint-disable */
|
|
31
|
+
// [Warning] Generated automatically - do not edit manually
|
|
32
|
+
|
|
33
|
+
${n.join(`
|
|
57
34
|
`)}
|
|
58
|
-
`}
|
|
35
|
+
`}c();function pe(){return`# \u8ACB\u52FF\u4FEE\u6539\u6B64\u8CC7\u6599\u593E
|
|
59
36
|
|
|
60
37
|
\u26A0\uFE0F **\u91CD\u8981\u63D0\u9192\uFF1A\u8ACB\u52FF\u4FEE\u6539\u6B64\u8CC7\u6599\u593E\u4E2D\u7684\u4EFB\u4F55\u6A94\u6848**
|
|
61
38
|
|
|
@@ -74,20 +51,20 @@ ${Object.values(r).map(n=>t.printNode(v.EmitHint.Unspecified,n,e)).join(`
|
|
|
74
51
|
\u9019\u4E9B\u6A94\u6848\u662F\u7531 @bitstack/ng-query-codegen-openapi \u7522\u751F\u5668\u6240\u5EFA\u7ACB\u3002
|
|
75
52
|
|
|
76
53
|
\u5982\u6709\u7591\u554F\uFF0C\u8ACB\u53C3\u8003\u5C08\u6848\u6587\u4EF6\u6216\u806F\u7E6B\u958B\u767C\u5718\u968A\u3002
|
|
77
|
-
`}
|
|
54
|
+
`}c();import le from"typescript";c();V();import{supportDeepObjects as Je}from"oazapfts/generate";var F=class{constructor(t){this.options=t}extractEndpointInfos(t){return t.map(e=>this.extractSingleEndpointInfo(e))}extractSingleEndpointInfo(t){let{verb:e,path:n,operation:o}=t,{operationNameSuffix:s="",argSuffix:a="Req",responseSuffix:p="Res",queryMatch:u,endpointOverrides:i}=this.options,m=S({verb:e,path:n}),y=s?$(m+s):m,d=$(m+s+a),T=$(m+s+p),h=J(e,n,M(t,i),u),A=`${m.replace(/([A-Z])/g,"_$1").toUpperCase()}`,x=o.summary||`${e.toUpperCase()} ${n}`,{queryParams:be,pathParams:Oe,isVoidArg:xe,hasRequestBody:Te}=this.extractParameters(t),Pe=this.extractContentType(o),Ae=Array.isArray(o.tags)?o.tags:[];return{operationName:y,argTypeName:d,responseTypeName:T,isQuery:h,verb:e.toUpperCase(),path:n,queryKeyName:A,queryParams:be,pathParams:Oe,isVoidArg:xe,summary:x,contentType:Pe,hasRequestBody:Te,tags:Ae}}extractParameters(t){let{operation:e,pathItem:n}=t,o=this.resolveArray(e.parameters),s=this.resolveArray(n.parameters).filter(y=>!o.some(d=>d.name===y.name&&d.in===y.in)),a=Je([...s,...o]).filter(y=>y.in!=="header"),p=a.filter(y=>y.in==="query"),u=a.filter(y=>y.in==="path"),i=!!e.requestBody,m=p.length===0&&u.length===0&&!e.requestBody;return{queryParams:p,pathParams:u,isVoidArg:m,hasRequestBody:i}}resolveArray(t){return t?Array.isArray(t)?t:[t]:[]}extractContentType(t){if(!t.requestBody)return"application/json";let e=t.requestBody.content;if(!e||typeof e!="object")return"application/json";let n=Object.keys(e);return n.length===0?"application/json":n[0]}};c();var Xe=r=>r.charAt(0).toUpperCase()+r.slice(1);function ue(r,t,e,n){let o={};e&&Object.keys(e).forEach(i=>{if(o[i]=i,i.endsWith("Vo")){let m=i.slice(0,-2)+"VO";o[m]=i}if(i.endsWith("Dto")){let m=i.slice(0,-3)+"DTO";o[m]=i}});let s=`/* eslint-disable */
|
|
78
55
|
// [Warning] Generated automatically - do not edit manually
|
|
79
56
|
|
|
80
|
-
`;e&&Object.keys(e).length>0&&(
|
|
81
|
-
`),
|
|
82
|
-
`;let
|
|
83
|
-
`)),
|
|
84
|
-
|
|
85
|
-
`)}function
|
|
86
|
-
`)}function
|
|
87
|
-
`)}function
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
`}
|
|
57
|
+
`;e&&Object.keys(e).length>0&&(s+=`import * as Schema from "../schema";
|
|
58
|
+
`),s+=`
|
|
59
|
+
`;let p=[],u=[];return r.forEach(i=>{let m=i.argTypeName,y=i.responseTypeName;if(m){let d=et(i,n,o);d.trim()===""?u.push(`export type ${m} = void;`,""):u.push(`export type ${m} = {`,d,"};","")}if(y){let d=tt(i,n,o);d.trim()===""?u.push(`export type ${y} = void;`,""):u.push(`export type ${y} = {`,d,"};","")}}),u.length>0&&p.push(u.join(`
|
|
60
|
+
`)),p.length===0&&p.push("// \u6B64\u6A94\u6848\u7528\u65BC\u5B9A\u7FA9 API \u76F8\u95DC\u7684\u985E\u578B","// \u985E\u578B\u5B9A\u7FA9\u6703\u6839\u64DA OpenAPI Schema \u81EA\u52D5\u751F\u6210",""),s+p.join(`
|
|
61
|
+
|
|
62
|
+
`)}function et(r,t,e={}){let n=[];r.queryParams&&r.queryParams.length>0&&r.queryParams.forEach(s=>{let a=s.required?"":"?",p=ce(s,e);n.push(` ${s.name}${a}: ${p};`)}),r.pathParams&&r.pathParams.length>0&&r.pathParams.forEach(s=>{let a=s.required?"":"?",p=ce(s,e);n.push(` ${s.name}${a}: ${p};`)});let o=t?.find(s=>s.operation?.operationId===r.operationName||s.operation?.operationId===r.operationName.toLowerCase()||s.verb===r.verb.toLowerCase()&&s.path===r.path);if(o?.operation?.requestBody){let a=o.operation.requestBody.content,p=a["application/json"]||a["*/*"],u=a["multipart/form-data"]||a["application/x-www-form-urlencoded"];if(p?.schema){let i=b(p.schema,e,1);n.push(` body: ${i};`)}else if(u?.schema){let i=b(u.schema,e,1);n.push(` body: ${i};`)}else{let i=Object.values(a)[0];if(i?.schema){let m=b(i.schema,e,1);n.push(` body: ${m};`)}else n.push(" body?: any; // Request body from OpenAPI")}}return n.length===0?"":n.join(`
|
|
63
|
+
`)}function tt(r,t,e={}){let n=[],o=t?.find(s=>s.operation?.operationId===r.operationName||s.operation?.operationId===r.operationName.toLowerCase()||s.verb===r.verb.toLowerCase()&&s.path===r.path);if(o?.operation?.responses){let s=o.operation.responses[200]||o.operation.responses[201];if(s?.content){let a=s.content["application/json"]||s.content["*/*"]||Object.values(s.content)[0];if(a?.schema){let p=rt(a.schema,e);n.push(...p)}else n.push(" // Success response from OpenAPI"),n.push(" data?: any;")}}return n.length===0?"":n.join(`
|
|
64
|
+
`)}function rt(r,t={}){let e=[];if(r.type==="object"&&r.properties){let n=r.required||[];Object.entries(r.properties).forEach(([o,s])=>{let p=n.includes(o)?"":"?",u=b(s,t,1),m=/[^a-zA-Z0-9_$]/.test(o)?`"${o}"`:o;s.description&&e.push(` /** ${s.description} */`),e.push(` ${m}${p}: ${u};`)})}return e}function b(r,t={},e=0){if(!r)return"any";if(r.$ref){let o=r.$ref;if(o.startsWith("#/components/schemas/")){let s=o.replace("#/components/schemas/",""),a=t[s]||s,u=`Schema.${Xe(a)}`;return r.nullable?`${u} | null`:u}}let n;switch(r.type){case"string":r.enum?n=r.enum.map(a=>`"${a}"`).join(" | "):r.format==="binary"?n="Blob":n="string";break;case"number":case"integer":n="number";break;case"boolean":n="boolean";break;case"array":let o=r.items?b(r.items,t,e):"any";n=o.includes("|")?`(${o})[]`:`${o}[]`;break;case"object":if(r.properties){let a=Object.entries(r.properties);if(a.length===0)r.additionalProperties?n=`Record<string, ${r.additionalProperties===!0?"any":b(r.additionalProperties,t,e)}>`:n="{}";else{let p=" ".repeat(e+1),u=" ".repeat(e),i=[];a.forEach(([m,y])=>{let T=(r.required||[]).includes(m)?"":"?",h=b(y,t,e+1),x=/[^a-zA-Z0-9_$]/.test(m)?`"${m}"`:m;y.description&&i.push(`${p}/** ${y.description} */`),i.push(`${p}${x}${T}: ${h};`)}),n=`{
|
|
65
|
+
${i.join(`
|
|
66
|
+
`)}
|
|
67
|
+
${u}}`}}else r.additionalProperties?n=`Record<string, ${r.additionalProperties===!0?"any":b(r.additionalProperties,t,e)}>`:n="any";break;default:n="any";break}return r.nullable?`${n} | null`:n}function ce(r,t={}){return r.schema?b(r.schema,t):"any"}c();function me(r,t){let{groupKey:e,refetchOnMountOrArgChange:n=60}=t,o=e?`${e.charAt(0).toUpperCase()+e.slice(1)}QueryService`:"QueryService",s=e?`${e.charAt(0).toUpperCase()+e.slice(1)}ApiService`:"ApiService",a=r.filter(i=>i.isQuery).map(i=>`
|
|
91
68
|
/**
|
|
92
69
|
* ${i.summary}
|
|
93
70
|
*/
|
|
@@ -100,7 +77,7 @@ export * from './query.service';
|
|
|
100
77
|
fetchOptions: args?.fetchOptions,
|
|
101
78
|
config: args?.config,
|
|
102
79
|
})${i.argTypeName!=="VoidApiArg"?"(args)":"()"};
|
|
103
|
-
}`).join(""),
|
|
80
|
+
}`).join(""),p=r.filter(i=>!i.isQuery).map(i=>`
|
|
104
81
|
/**
|
|
105
82
|
* ${i.summary}
|
|
106
83
|
*/
|
|
@@ -141,7 +118,7 @@ import {Observable} from 'rxjs';
|
|
|
141
118
|
import {HttpErrorResponse} from '@angular/common/http';
|
|
142
119
|
import {NtkQueryService, MutationState, QueryState, MutationResponse} from '@core/ntk-query';
|
|
143
120
|
import {ECacheKeys} from '../cache-keys';
|
|
144
|
-
import {${
|
|
121
|
+
import {${s}} from './api.service';
|
|
145
122
|
import {IRestFulEndpointsQueryReturn, RequestOptions} from '../common-types';
|
|
146
123
|
import {${r.map(i=>` ${i.argTypeName}, ${i.responseTypeName}`).join(",")}} from './types';
|
|
147
124
|
|
|
@@ -149,14 +126,14 @@ import {${r.map(i=>` ${i.argTypeName}, ${i.responseTypeName}`).join(",")}} from
|
|
|
149
126
|
providedIn: 'root',
|
|
150
127
|
})
|
|
151
128
|
export class ${o} {
|
|
152
|
-
private apiService = inject(${
|
|
129
|
+
private apiService = inject(${s});
|
|
153
130
|
private ntkQuery = inject(NtkQueryService);
|
|
154
|
-
${a}${
|
|
131
|
+
${a}${p}${u}
|
|
155
132
|
}
|
|
156
|
-
`}
|
|
133
|
+
`}c();function ge(r,t){let{apiConfiguration:e,httpClient:n,groupKey:o}=t,s=o?`${o.charAt(0).toUpperCase()+o.slice(1)}ApiService`:"ApiService";return`/* eslint-disable */
|
|
157
134
|
// [Warning] Generated automatically - do not edit manually
|
|
158
135
|
|
|
159
|
-
import { ${n.
|
|
136
|
+
import { ${n.importReturnTypeName} } from '${n.file}';
|
|
160
137
|
import { Injectable, inject } from '@angular/core';
|
|
161
138
|
import { Observable } from 'rxjs';
|
|
162
139
|
import { ${e.importName} } from '${e.file}';
|
|
@@ -167,20 +144,61 @@ import {${r.map(a=>` ${a.argTypeName}, ${a.responseTypeName}`).join(",")} } from
|
|
|
167
144
|
@Injectable({
|
|
168
145
|
providedIn: 'root',
|
|
169
146
|
})
|
|
170
|
-
export class ${
|
|
147
|
+
export class ${s} {
|
|
171
148
|
private config = inject(${e.importName});
|
|
172
|
-
private http = inject(${n.
|
|
173
|
-
|
|
174
|
-
${r.map(a=>{let
|
|
149
|
+
private http = inject(${n.importReturnTypeName});
|
|
150
|
+
|
|
151
|
+
${r.map(a=>{let p=a.verb.toUpperCase()==="GET",u=a.argTypeName!=="VoidApiArg",i=a.hasRequestBody,m=h=>h.includes("{")&&u?`\`\${this.config.rootUrl}${h.replace(/\{([^}]+)\}/g,"${args.variables.$1}")}\``:`\`\${this.config.rootUrl}${h}\``,y=a.queryParams.length>0,d=!p&&u,T=()=>{let h="";return a.queryParams&&a.queryParams.length>0&&(h=`params: {${a.queryParams.map(x=>`${x.name}: args.variables.${x.name},`).join(`
|
|
152
|
+
`)}},`),`{
|
|
153
|
+
...args.fetchOptions,
|
|
154
|
+
headers: { 'Content-Type': '${a.contentType}', ...args.fetchOptions?.headers },
|
|
155
|
+
${h}${a.hasRequestBody?"body: args.variables.body,":""}
|
|
156
|
+
}`};return`
|
|
175
157
|
/**
|
|
176
158
|
* ${a.summary}
|
|
177
159
|
*/
|
|
178
160
|
${a.operationName}(
|
|
179
161
|
${u?`args: IRestFulEndpointsQueryReturn<${a.argTypeName}>, `:""}
|
|
180
162
|
): Observable<${a.responseTypeName}> {
|
|
181
|
-
const url = ${
|
|
182
|
-
return this.http.request('${a.verb.toLowerCase()}', url, ${
|
|
163
|
+
const url = ${m(a.path)};
|
|
164
|
+
return this.http.request('${a.verb.toLowerCase()}', url, ${T()});
|
|
183
165
|
}`}).join("")}
|
|
184
166
|
}
|
|
185
|
-
`}
|
|
167
|
+
`}var w=class{constructor(t,e){this.parserService=t;this.options=e;this.infoExtractor=new F(e)}infoExtractor;async generate(){let t=this.parserService.getOperationDefinitions(this.options.filterEndpoints),e=this.infoExtractor.extractEndpointInfos(t);return this.generateRtkQueryCode(e)}generateRtkQueryCode(t){let e=this.generateTypes(t),n=me(t,this.options),o=ge(t,this.options),s=this.generateIndex(),a=t.map(u=>u.operationName),p=new Set;return t.forEach(u=>{u.tags&&Array.isArray(u.tags)&&u.tags.forEach(i=>p.add(i))}),{operationNames:a,tags:Array.from(p),files:{types:e,queryService:n,index:s,enhanceEndpoints:o}}}generateTypes(t){let e={...this.options,apiConfiguration:this.options.apiConfiguration||{file:"@/store/webapi",importName:"WebApiConfiguration"}},o=this.parserService.getApiGenerator().aliases.reduce((a,p)=>{if(le.isInterfaceDeclaration(p)||le.isTypeAliasDeclaration(p)){let u=p.name.text;return{...a,[u]:p}}return a},{}),s=this.parserService.getOperationDefinitions(this.options.filterEndpoints);return ue(t,e,o,s)}generateIndex(){let t=this.options.groupKey||"";return`/* eslint-disable */
|
|
168
|
+
// [Warning] Generated automatically - do not edit manually
|
|
169
|
+
|
|
170
|
+
export { default as ${t?`${t.charAt(0).toLowerCase()+t.slice(1)}Api`:"api"} } from "./enhanceEndpoints";
|
|
171
|
+
export * from "./query.generated";
|
|
172
|
+
export * from "./types";
|
|
173
|
+
`}};c();function ye(){return`/* eslint-disable */
|
|
174
|
+
// [Warning] Generated automatically - do not edit manually
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Clear undefined in object
|
|
178
|
+
*/
|
|
179
|
+
export function withoutUndefined(obj?: Record<string, any>) {
|
|
180
|
+
if(typeof obj === 'undefined') return;
|
|
181
|
+
return Object.fromEntries(
|
|
182
|
+
Object.entries(obj).filter(([_, v]) => v !== undefined && v !== null)
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
`}c();function de(r){return r.length===0?`/* eslint-disable */
|
|
187
|
+
// [Warning] Generated automatically - do not edit manually
|
|
188
|
+
|
|
189
|
+
export enum ECacheTagTypes {
|
|
190
|
+
}
|
|
191
|
+
`:`/* eslint-disable */
|
|
192
|
+
// [Warning] Generated automatically - do not edit manually
|
|
193
|
+
|
|
194
|
+
export enum ECacheTagTypes {
|
|
195
|
+
${r.sort().map(e=>` ${e} = '${e}',`).join(`
|
|
196
|
+
`)}
|
|
197
|
+
}
|
|
198
|
+
`}var q=class{_options;openApiService=new C;groupService=new N;fileWriterService=new R;openApiDoc=null;parserService=null;schemaInterfaces={};actualSchemaFile="";generatedContent={groups:[],commonTypes:"",componentSchema:"",doNotModify:"",utils:"",tagTypes:""};allTags=new Set;constructor(t){this._options=t}async generateAll(){return await this.prepare(),await this.generateApi(),this.generateCommonTypesContent(),this.generateSchemaContent(),this.generateUtilsContent(),this.generateDoNotModifyContent(),this.generateTagTypesContent(),await this.release()}async prepare(){this.actualSchemaFile=this._options.schemaFile,this._options.remoteFile&&(this.actualSchemaFile=await this.openApiService.downloadSchema(this._options.remoteFile,this._options.schemaFile)),this.openApiDoc=await this.openApiService.getDocument(this.actualSchemaFile,this._options.httpResolverOptions),this.parserService=new E(this.openApiDoc,this._options),this.parserService.initialize();let t=this.parserService.getApiGenerator();this.schemaInterfaces=t.aliases.reduce((e,n)=>{if(fe.isInterfaceDeclaration(n)||fe.isTypeAliasDeclaration(n)){let o=n.name.text;return{...e,[o]:n}}return e},{})}async generateApi(){if(!this.openApiDoc||!this.parserService)throw new Error("\u8ACB\u5148\u8ABF\u7528 prepare() \u65B9\u6CD5");let t=this.openApiService.getPaths(this.openApiDoc),e=this.groupService.groupPaths(t,this._options.outputFiles);for(let n of Object.values(e))try{let o=await this.generateApiGroupContent(this._options,n);o.operationNames.length>0&&(this.generatedContent.groups.push({groupKey:n.groupKey,outputPath:n.outputPath,content:o}),o.tags&&Array.isArray(o.tags)&&o.tags.forEach(s=>this.allTags.add(s)))}catch(o){throw new Error(`\u7FA4\u7D44 ${n.groupKey} \u751F\u6210\u5931\u6557: ${o}`)}}async generateCommonTypesContent(){this.generatedContent.commonTypes=se()}async generateSchemaContent(){this.generatedContent.componentSchema=ae(this.schemaInterfaces)}async generateDoNotModifyContent(){this.generatedContent.doNotModify=pe()}async generateUtilsContent(){this.generatedContent.utils=ye()}async generateTagTypesContent(){let t=Array.from(this.allTags);this.generatedContent.tagTypes=de(t)}async release(){let t=[],e=[],n=[];try{for(let p of this.generatedContent.groups)try{if(p.content?.files){let u=P.dirname(p.outputPath),i=await this.fileWriterService.writeGroupFiles(u,{types:p.content.files.types,queryService:p.content.files.queryService,enhanceEndpoints:p.content.files.enhanceEndpoints,index:p.content.files.index});t.push(...i),n.push(p.groupKey)}}catch(u){e.push(new Error(`\u5BEB\u5165\u7FA4\u7D44 ${p.groupKey} \u5931\u6557: ${u}`))}let o=this.generatedContent.groups[0]?P.dirname(P.dirname(this.generatedContent.groups[0].outputPath)):"./generated";if(this.generatedContent.commonTypes||this.generatedContent.doNotModify||this.generatedContent.utils){let p=await this.fileWriterService.writeSharedFiles(o,{commonTypes:this.generatedContent.commonTypes||void 0,doNotModify:this.generatedContent.doNotModify||void 0,utils:this.generatedContent.utils||void 0});t.push(...p)}if(this.generatedContent.tagTypes){let p=await this.fileWriterService.writeFile(P.join(o,"tagTypes.ts"),this.generatedContent.tagTypes);t.push(p)}if(this.generatedContent.componentSchema){let p=await this.fileWriterService.writeSchemaFile(o,this.generatedContent.componentSchema);t.push(...p)}let s=this.generateMainIndex(n),a=await this.fileWriterService.writeFile(P.join(o,"index.ts"),s);t.push(a)}catch(o){e.push(o)}return{success:e.length===0,writtenFiles:t,errors:e,generatedGroups:n}}async generateApiGroupContent(t,e){let{outputFiles:n,...o}=t,s={...o,schemaFile:this.actualSchemaFile,outputFile:e.outputPath,sharedTypesFile:`${n.outputDir}/common-types.ts`,filterEndpoints:this.groupService.createGroupFilter(e.groupKey,n),queryMatch:n.queryMatch,groupKey:e.groupKey};if(!this.openApiDoc||!this.parserService)throw new Error("OpenAPI \u6587\u6A94\u672A\u521D\u59CB\u5316\uFF0C\u8ACB\u5148\u8ABF\u7528 prepare()");return await new w(this.parserService,s).generate()}generateMainIndex(t){return`/* eslint-disable */
|
|
199
|
+
// [Warning] Generated automatically - do not edit manually
|
|
200
|
+
|
|
201
|
+
${t.map(n=>`export * from "./${n}";`).join(`
|
|
202
|
+
`)}
|
|
203
|
+
`}};async function he(r){let e=await new q(r).generateAll();if(!e.success&&e.errors.length>0)throw e.errors[0]}var ve=nt(g);async function st(r){let t=it(process.cwd(),r);process.chdir(ot(t));let e=ve(t),n=e.default??e;"outputFiles"in n||(console.error('Configuration must include "outputFiles" property. Single file output is no longer supported.'),process.exit(1)),n.outputFiles&&n.outputFiles.outputDir&&U(n.outputFiles.outputDir);try{console.log("Generating multiple outputs..."),await he(n),console.log("Done")}catch(o){console.error("Generation failed:",o),process.exit(1)}}async function at(){let r=ve("../../package.json"),t=W();j.version(r.version).usage("<path/to/config.js>").parse(process.argv);let e=j.args[0];if(j.args.length===0){j.help();return}_(e),B(e,t),await st(e)}at().catch(r=>{console.error("CLI execution failed:",r),process.exit(1)});export{st as runGeneration};
|
|
186
204
|
//# sourceMappingURL=cli.mjs.map
|