Socket
Socket
Sign inDemoInstall

@jsheaven/astro-client-generator

Package Overview
Dependencies
28
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.1.0 to 1.1.1

dist/api-client/allrequest-client.ts

20

dist/cli.cjs.js
#!/usr/bin/env node
"use strict";var J=Object.create;var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var W=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})},R=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of _(t))!K.call(e,s)&&s!==r&&P(e,s,{get:()=>t[s],enumerable:!(o=Q(t,s))||o.enumerable});return e};var I=(e,t,r)=>(r=e!=null?J(z(e)):{},R(t||!e||!e.__esModule?P(r,"default",{value:e,enumerable:!0}):r,e)),X=e=>R(P({},"__esModule",{value:!0}),e);var de={};W(de,{Commands:()=>k,cli:()=>N,resolveArgs:()=>U});module.exports=X(de);var i=I(require("kleur/colors"),1),H=I(require("yargs-parser"),1);var $=I(require("fast-glob"),1),m=require("path"),y=require("fs"),L=require("ts-morph"),x={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},b=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],w=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],C=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,Y=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,O=e=>e.join(`
`).trim(),Z=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?w:t},ee=e=>({...x,...e});var te=(e,t)=>{let r=new L.Project({tsConfigFilePath:t}),o=[];return e.forEach(s=>{let n=r.getSourceFile(s),c=n.getImportDeclarations().map(a=>a.getFullText()),g=[],f="",l="";n.getInterfaces().map(a=>{switch(a.getName()){case"ApiRequest":f=a.getText();break;case"ApiResponse":l=a.getText();break;default:g.push(a.getText())}});let u=n.getTypeAliases().map(a=>a.getText()),d=[];n.getExportSymbols().forEach(a=>{let A=b.indexOf(a.getName().toUpperCase());if(A>-1){let p=b[A];p==="DELETE"?d.push("DELETE"):p==="ALL"?d=w:d.push(p)}}),d.forEach(a=>{o.push({apiRoute:s,imports:c,method:a,requestInterface:f,responseInterface:l,genericInterfaces:g,genericTypes:u})})}),o},re=e=>{let t=[];return e.forEach(r=>{let o=(0,y.readFileSync)(r,{encoding:"utf-8"}),s=o.split(`
`),n=[],c=[],g=[],f,l,u,d=0,a=[-1,-1],A=[-1,-1];s.forEach((p,h)=>{let F=/^import (.*) from (.*)/.test(p.trim()),T=p.indexOf("interface ")>-1,j=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(p.trim()),M=p.indexOf(" ApiRequest ")>-1,G=p.indexOf(" ApiResponse ")>-1,B=p.indexOf("{")>-1,V=p.indexOf("}")>-1;if(F){n.push(p);return}if(j){g.push(p);return}T&&M&&(l=h),T&&G&&(u=h),T&&l!==h&&u!==h&&(f=h),(l||u||f)&&B&&d++,(l||u||f)&&V&&(d--,d===0&&(l&&(a=[l,h],l=void 0),u&&(A=[u,h],u=void 0),f&&(c.push(O(s.slice(f,h+1))),f=void 0)))}),Z(o).forEach(p=>{t.push({apiRoute:r,imports:n,method:p,requestInterface:O(s.slice(a[0],a[1]+1)),responseInterface:O(s.slice(A[0],A[1]+1)),genericInterfaces:c,genericTypes:g})})}),t},oe=e=>e.reduce((t,r)=>{let{path:o}=r;return t[o]||(t[o]=[]),t[o].push(r),t},{}),S=e=>{e=ee(e);let t=(0,m.resolve)(process.cwd(),e.apiDir),r=$.default.sync(`${t}/**/*.ts`),o;switch(e.parser){case"baseline":o=te(r,e.tsConfigPath);break;case"naive":default:o=re(r);break}o=o.filter(n=>n.responseInterface!==""),o.map(n=>(n.relativePath=`api${n.apiRoute.replace(t,"")}`.trim(),n.path=`${(0,m.parse)(n.relativePath).dir}/${(0,m.parse)(n.relativePath).name}`,n.camelCaseName=n.path.replace(/^api/i,"").split("/").map(c=>C(c)).join("").split(/[-_\ \.]/g).reduce((c,g)=>c+C(g),""),n));let s=oe(o);Object.keys(s).forEach(n=>{let c=s[n],g=ie(c,e),f=(0,m.resolve)(process.cwd(),e.outDir,c[0].relativePath.replace(/^api\//,"")),l=(0,m.parse)(f),u=l.dir,d=`${u}${m.sep}${l.name}-client.ts`;(0,y.mkdirSync)(u,{recursive:!0}),(0,y.writeFileSync)(d.toLowerCase(),g,{encoding:"utf-8"})})},ne=(e,t,r,o,s)=>{let n=s?C(e.method.toLowerCase()):"";return`
"use strict";var J=Object.create;var x=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var K=(e,t)=>{for(var r in t)x(e,r,{get:t[r],enumerable:!0})},R=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of z(t))!_.call(e,s)&&s!==r&&x(e,s,{get:()=>t[s],enumerable:!(o=W(t,s))||o.enumerable});return e};var I=(e,t,r)=>(r=e!=null?J(Q(e)):{},R(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e)),X=e=>R(x({},"__esModule",{value:!0}),e);var de={};K(de,{Commands:()=>U,cli:()=>F,resolveArgs:()=>k});module.exports=X(de);var c=I(require("kleur/colors"),1),H=I(require("yargs-parser"),1);var w=I(require("fast-glob"),1),m=require("path"),P=require("fs"),D=require("ts-morph"),y={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},$=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],L=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],O=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,Y=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,C=e=>e.join(`
`).trim(),Z=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?L:t},ee=e=>({...y,...e});var te=(e,t)=>{let r=new D.Project({tsConfigFilePath:t}),o=[];return e.forEach(s=>{let n=r.getSourceFile(s),p=n.getImportDeclarations().map(i=>i.getFullText()),h=[],d="",l="";n.getInterfaces().map(i=>{switch(i.getName()){case"ApiRequest":d=i.getText();break;case"ApiResponse":l=i.getText();break;default:h.push(i.getText())}});let f=n.getTypeAliases().map(i=>i.getText()),g=[];n.getExportSymbols().forEach(i=>{let u=$.indexOf(i.getName().toUpperCase());if(u>-1){let a=$[u];a==="DELETE"?g.push("DELETE"):a==="ALL"?g=L:g.push(a)}}),g.forEach(i=>{o.push({apiRoute:s,imports:p,method:i,requestInterface:d,responseInterface:l,genericInterfaces:h,genericTypes:f})})}),o},re=e=>{let t=[];return e.forEach(r=>{let o=(0,P.readFileSync)(r,{encoding:"utf-8"}),s=o.split(`
`),n=[],p=[],h=[],d,l,f,g=0,i=[-1,-1],u=[-1,-1];s.forEach((a,A)=>{let N=/^import (.*) from (.*)/.test(a.trim()),T=a.indexOf("interface ")>-1,j=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),M=a.indexOf(" ApiRequest ")>-1,G=a.indexOf(" ApiResponse ")>-1,B=a.indexOf("{")>-1,V=a.indexOf("}")>-1;if(N){n.push(a);return}if(j){h.push(a);return}T&&M&&(l=A),T&&G&&(f=A),T&&l!==A&&f!==A&&(d=A),(l||f||d)&&B&&g++,(l||f||d)&&V&&(g--,g===0&&(l&&(i=[l,A],l=void 0),f&&(u=[f,A],f=void 0),d&&(p.push(C(s.slice(d,A+1))),d=void 0)))}),Z(o).forEach(a=>{t.push({apiRoute:r,imports:n,method:a,requestInterface:C(s.slice(i[0],i[1]+1)),responseInterface:C(s.slice(u[0],u[1]+1)),genericInterfaces:p,genericTypes:h})})}),t},oe=e=>e.reduce((t,r)=>{let{path:o}=r;return t[o]||(t[o]=[]),t[o].push(r),t},{}),S=e=>{e=ee(e);let t=(0,m.resolve)(process.cwd(),e.apiDir),r=w.default.sync(`${t}/**/*.ts`),o;switch(e.parser){case"baseline":o=te(r,e.tsConfigPath);break;case"naive":default:o=re(r);break}o=o.filter(n=>n.responseInterface!==""),o.map(n=>(n.relativePath=`api${n.apiRoute.replace(t,"")}`.trim(),n.path=`${(0,m.parse)(n.relativePath).dir}/${(0,m.parse)(n.relativePath).name}`,n.camelCaseName=n.path.replace(/^api/i,"").split("/").map(p=>O(p)).join("").split(/[-_\ \.]/g).reduce((p,h)=>p+O(h),""),n));let s=oe(o);Object.keys(s).forEach(n=>{let p=s[n],h=ie(p,e),d=(0,m.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),l=(0,m.parse)(d),f=l.dir,g=`${f}${m.sep}${l.name}-client.ts`,i=new D.Project({tsConfigFilePath:e.tsConfigPath});(0,P.mkdirSync)(f,{recursive:!0});let u=i.createSourceFile(g.toLowerCase(),h,{overwrite:!0}),a;do a=u.getFullWidth(),u.fixUnusedIdentifiers();while(a!==u.getFullWidth());u.organizeImports(),u.formatText(),u.saveSync()})},ne=(e,t,r,o,s)=>{let n=s?O(e.method.toLowerCase()):"";return`

@@ -37,7 +37,7 @@ /** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */

${e.responseInterface}`,ie=(e,t)=>{let r=e[0].requestInterface?`${e[0].requestInterface}`:"",o=e[0].requestInterface?"payload: ApiRequest, ":"",s="";return e.forEach(n=>{let c=n.method!=="HEAD"&&n.method!=="GET"&&n.requestInterface?"options.body = JSON.stringify(payload)":"";s+=ne(n,t,o,c,e.length>1)}),`${se(e[0],r)}
${s}`};var E=require("path"),v=require("url"),q=require("fs/promises"),pe={},ae=async e=>JSON.parse(await(0,q.readFile)(e,{encoding:"utf-8"})),D=async()=>await ae((0,E.resolve)((0,E.parse)((0,v.fileURLToPath)(pe.url)).dir,"../package.json"));var k=(o=>(o.HELP="help",o.VERSION="version",o.GENERATE="generate",o))(k||{}),U=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:x.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:x.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:x.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},ce=()=>{console.error(`
${i.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${e.responseInterface}`,ie=(e,t)=>{let r=e[0].requestInterface?`${e[0].requestInterface}`:"",o=e[0].requestInterface?"payload: ApiRequest, ":"",s="";return e.forEach(n=>{let p=n.method!=="HEAD"&&n.method!=="GET"&&n.requestInterface?"options.body = JSON.stringify(payload)":"";s+=ne(n,t,o,p,e.length>1)}),`${se(e[0],r)}
${s}`};var E=require("path"),v=require("url"),q=require("fs/promises"),ce={},ae=async e=>JSON.parse(await(0,q.readFile)(e,{encoding:"utf-8"})),b=async()=>await ae((0,E.resolve)((0,E.parse)((0,v.fileURLToPath)(ce.url)).dir,"../package.json"));var U=(o=>(o.HELP="help",o.VERSION="version",o.GENERATE="generate",o))(U||{}),k=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:y.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:y.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:y.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},pe=()=>{console.error(`
${c.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${i.bold("Commands:")}
${c.bold("Commands:")}
generate Generates the TypeScript clients for the endpoints.

@@ -47,3 +47,3 @@ version Show the program version.

${i.bold("Flags:")}
${c.bold("Flags:")}
--apiDir <string> Folder to the API directory on disk (source code), default: './src/pages/api'

@@ -55,5 +55,5 @@ --baseUrl <string> API base URL for calling the API (only relevant if you host in a subdir, it's very unlikely), default: ''

${i.bold("Example(s):")}
${c.bold("Example(s):")}
npx @jsheaven/astro-client-generator generate
`)},le=async()=>{console.log((await D()).version)},N=async e=>{let t=(0,H.default)(e),r=U(t),o={...r.options};switch(console.log(i.dim(">"),`${i.bold(i.yellow("astro-client-generator"))} @ ${i.dim((await D()).version)}: ${i.magenta(i.bold(r.cmd))}`,i.gray("...")),r.cmd){case"help":ce(),process.exit(0);case"version":await le(),process.exit(0);case"generate":{try{await S(o)}catch(s){fe(s)}process.exit(0)}default:throw new Error(`Error running ${r.cmd}`)}},ue=e=>console.error(i.red(e.toString()||e)),fe=e=>{ue(e),process.exit(1)};try{N(process.argv)}catch(e){console.error(e),process.exit(1)}0&&(module.exports={Commands,cli,resolveArgs});
`)},le=async()=>{console.log((await b()).version)},F=async e=>{let t=(0,H.default)(e),r=k(t),o={...r.options};switch(console.log(c.dim(">"),`${c.bold(c.yellow("astro-client-generator"))} @ ${c.dim((await b()).version)}: ${c.magenta(c.bold(r.cmd))}`,c.gray("...")),r.cmd){case"help":pe(),process.exit(0);case"version":await le(),process.exit(0);case"generate":{try{await S(o)}catch(s){fe(s)}process.exit(0)}default:throw new Error(`Error running ${r.cmd}`)}},ue=e=>console.error(c.red(e.toString()||e)),fe=e=>{ue(e),process.exit(1)};try{F(process.argv)}catch(e){console.error(e),process.exit(1)}0&&(module.exports={Commands,cli,resolveArgs});
//# sourceMappingURL=cli.cjs.js.map
#!/usr/bin/env node
import*as s from"kleur/colors";import Z from"yargs-parser";import v from"fast-glob";import{resolve as I,parse as x,sep as q}from"path";import{readFileSync as H,mkdirSync as k,writeFileSync as U}from"fs";import{Project as N}from"ts-morph";var A={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},O=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],C=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],E=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,F=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,P=e=>e.join(`
`).trim(),j=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?C:t},M=e=>({...A,...e});var G=(e,t)=>{let n=new N({tsConfigFilePath:t}),o=[];return e.forEach(i=>{let r=n.getSourceFile(i),c=r.getImportDeclarations().map(a=>a.getFullText()),g=[],f="",l="";r.getInterfaces().map(a=>{switch(a.getName()){case"ApiRequest":f=a.getText();break;case"ApiResponse":l=a.getText();break;default:g.push(a.getText())}});let u=r.getTypeAliases().map(a=>a.getText()),d=[];r.getExportSymbols().forEach(a=>{let h=O.indexOf(a.getName().toUpperCase());if(h>-1){let p=O[h];p==="DELETE"?d.push("DELETE"):p==="ALL"?d=C:d.push(p)}}),d.forEach(a=>{o.push({apiRoute:i,imports:c,method:a,requestInterface:f,responseInterface:l,genericInterfaces:g,genericTypes:u})})}),o},B=e=>{let t=[];return e.forEach(n=>{let o=H(n,{encoding:"utf-8"}),i=o.split(`
`),r=[],c=[],g=[],f,l,u,d=0,a=[-1,-1],h=[-1,-1];i.forEach((p,m)=>{let R=/^import (.*) from (.*)/.test(p.trim()),y=p.indexOf("interface ")>-1,b=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(p.trim()),$=p.indexOf(" ApiRequest ")>-1,L=p.indexOf(" ApiResponse ")>-1,w=p.indexOf("{")>-1,S=p.indexOf("}")>-1;if(R){r.push(p);return}if(b){g.push(p);return}y&&$&&(l=m),y&&L&&(u=m),y&&l!==m&&u!==m&&(f=m),(l||u||f)&&w&&d++,(l||u||f)&&S&&(d--,d===0&&(l&&(a=[l,m],l=void 0),u&&(h=[u,m],u=void 0),f&&(c.push(P(i.slice(f,m+1))),f=void 0)))}),j(o).forEach(p=>{t.push({apiRoute:n,imports:r,method:p,requestInterface:P(i.slice(a[0],a[1]+1)),responseInterface:P(i.slice(h[0],h[1]+1)),genericInterfaces:c,genericTypes:g})})}),t},V=e=>e.reduce((t,n)=>{let{path:o}=n;return t[o]||(t[o]=[]),t[o].push(n),t},{}),D=e=>{e=M(e);let t=I(process.cwd(),e.apiDir),n=v.sync(`${t}/**/*.ts`),o;switch(e.parser){case"baseline":o=G(n,e.tsConfigPath);break;case"naive":default:o=B(n);break}o=o.filter(r=>r.responseInterface!==""),o.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${x(r.relativePath).dir}/${x(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(c=>E(c)).join("").split(/[-_\ \.]/g).reduce((c,g)=>c+E(g),""),r));let i=V(o);Object.keys(i).forEach(r=>{let c=i[r],g=_(c,e),f=I(process.cwd(),e.outDir,c[0].relativePath.replace(/^api\//,"")),l=x(f),u=l.dir,d=`${u}${q}${l.name}-client.ts`;k(u,{recursive:!0}),U(d.toLowerCase(),g,{encoding:"utf-8"})})},J=(e,t,n,o,i)=>{let r=i?E(e.method.toLowerCase()):"";return`
import*as a from"kleur/colors";import Y from"yargs-parser";import q from"fast-glob";import{resolve as I,parse as x,sep as H}from"path";import{readFileSync as U,mkdirSync as k}from"fs";import{Project as O}from"ts-morph";var A={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},C=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],D=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],E=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,F=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,P=e=>e.join(`
`).trim(),N=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?D:t},j=e=>({...A,...e});var M=(e,t)=>{let n=new O({tsConfigFilePath:t}),o=[];return e.forEach(c=>{let r=n.getSourceFile(c),p=r.getImportDeclarations().map(s=>s.getFullText()),h=[],d="",l="";r.getInterfaces().map(s=>{switch(s.getName()){case"ApiRequest":d=s.getText();break;case"ApiResponse":l=s.getText();break;default:h.push(s.getText())}});let f=r.getTypeAliases().map(s=>s.getText()),g=[];r.getExportSymbols().forEach(s=>{let u=C.indexOf(s.getName().toUpperCase());if(u>-1){let i=C[u];i==="DELETE"?g.push("DELETE"):i==="ALL"?g=D:g.push(i)}}),g.forEach(s=>{o.push({apiRoute:c,imports:p,method:s,requestInterface:d,responseInterface:l,genericInterfaces:h,genericTypes:f})})}),o},G=e=>{let t=[];return e.forEach(n=>{let o=U(n,{encoding:"utf-8"}),c=o.split(`
`),r=[],p=[],h=[],d,l,f,g=0,s=[-1,-1],u=[-1,-1];c.forEach((i,m)=>{let R=/^import (.*) from (.*)/.test(i.trim()),y=i.indexOf("interface ")>-1,$=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(i.trim()),w=i.indexOf(" ApiRequest ")>-1,L=i.indexOf(" ApiResponse ")>-1,S=i.indexOf("{")>-1,v=i.indexOf("}")>-1;if(R){r.push(i);return}if($){h.push(i);return}y&&w&&(l=m),y&&L&&(f=m),y&&l!==m&&f!==m&&(d=m),(l||f||d)&&S&&g++,(l||f||d)&&v&&(g--,g===0&&(l&&(s=[l,m],l=void 0),f&&(u=[f,m],f=void 0),d&&(p.push(P(c.slice(d,m+1))),d=void 0)))}),N(o).forEach(i=>{t.push({apiRoute:n,imports:r,method:i,requestInterface:P(c.slice(s[0],s[1]+1)),responseInterface:P(c.slice(u[0],u[1]+1)),genericInterfaces:p,genericTypes:h})})}),t},B=e=>e.reduce((t,n)=>{let{path:o}=n;return t[o]||(t[o]=[]),t[o].push(n),t},{}),b=e=>{e=j(e);let t=I(process.cwd(),e.apiDir),n=q.sync(`${t}/**/*.ts`),o;switch(e.parser){case"baseline":o=M(n,e.tsConfigPath);break;case"naive":default:o=G(n);break}o=o.filter(r=>r.responseInterface!==""),o.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${x(r.relativePath).dir}/${x(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>E(p)).join("").split(/[-_\ \.]/g).reduce((p,h)=>p+E(h),""),r));let c=B(o);Object.keys(c).forEach(r=>{let p=c[r],h=W(p,e),d=I(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),l=x(d),f=l.dir,g=`${f}${H}${l.name}-client.ts`,s=new O({tsConfigFilePath:e.tsConfigPath});k(f,{recursive:!0});let u=s.createSourceFile(g.toLowerCase(),h,{overwrite:!0}),i;do i=u.getFullWidth(),u.fixUnusedIdentifiers();while(i!==u.getFullWidth());u.organizeImports(),u.formatText(),u.saveSync()})},V=(e,t,n,o,c)=>{let r=c?E(e.method.toLowerCase()):"";return`

@@ -18,3 +18,3 @@ /** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */

return (await fetch(requestUrl, options)).json()
}`},Q=(e,t)=>`${e.imports.join(`
}`},J=(e,t)=>`${e.imports.join(`
`)}

@@ -38,7 +38,7 @@

${e.responseInterface}`,_=(e,t)=>{let n=e[0].requestInterface?`${e[0].requestInterface}`:"",o=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let c=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=J(r,t,o,c,e.length>1)}),`${Q(e[0],n)}
${i}`};import{resolve as z,parse as K}from"path";import{fileURLToPath as W}from"url";import{readFile as X}from"fs/promises";var Y=async e=>JSON.parse(await X(e,{encoding:"utf-8"})),T=async()=>await Y(z(K(W(import.meta.url)).dir,"../package.json"));var ee=(o=>(o.HELP="help",o.VERSION="version",o.GENERATE="generate",o))(ee||{}),te=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:A.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:A.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:A.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},re=()=>{console.error(`
${s.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${e.responseInterface}`,W=(e,t)=>{let n=e[0].requestInterface?`${e[0].requestInterface}`:"",o=e[0].requestInterface?"payload: ApiRequest, ":"",c="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";c+=V(r,t,o,p,e.length>1)}),`${J(e[0],n)}
${c}`};import{resolve as z,parse as Q}from"path";import{fileURLToPath as _}from"url";import{readFile as K}from"fs/promises";var X=async e=>JSON.parse(await K(e,{encoding:"utf-8"})),T=async()=>await X(z(Q(_(import.meta.url)).dir,"../package.json"));var Z=(o=>(o.HELP="help",o.VERSION="version",o.GENERATE="generate",o))(Z||{}),ee=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:A.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:A.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:A.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},te=()=>{console.error(`
${a.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${s.bold("Commands:")}
${a.bold("Commands:")}
generate Generates the TypeScript clients for the endpoints.

@@ -48,3 +48,3 @@ version Show the program version.

${s.bold("Flags:")}
${a.bold("Flags:")}
--apiDir <string> Folder to the API directory on disk (source code), default: './src/pages/api'

@@ -56,5 +56,5 @@ --baseUrl <string> API base URL for calling the API (only relevant if you host in a subdir, it's very unlikely), default: ''

${s.bold("Example(s):")}
${a.bold("Example(s):")}
npx @jsheaven/astro-client-generator generate
`)},oe=async()=>{console.log((await T()).version)},ne=async e=>{let t=Z(e),n=te(t),o={...n.options};switch(console.log(s.dim(">"),`${s.bold(s.yellow("astro-client-generator"))} @ ${s.dim((await T()).version)}: ${s.magenta(s.bold(n.cmd))}`,s.gray("...")),n.cmd){case"help":re(),process.exit(0);case"version":await oe(),process.exit(0);case"generate":{try{await D(o)}catch(i){ie(i)}process.exit(0)}default:throw new Error(`Error running ${n.cmd}`)}},se=e=>console.error(s.red(e.toString()||e)),ie=e=>{se(e),process.exit(1)};try{ne(process.argv)}catch(e){console.error(e),process.exit(1)}export{ee as Commands,ne as cli,te as resolveArgs};
`)},re=async()=>{console.log((await T()).version)},oe=async e=>{let t=Y(e),n=ee(t),o={...n.options};switch(console.log(a.dim(">"),`${a.bold(a.yellow("astro-client-generator"))} @ ${a.dim((await T()).version)}: ${a.magenta(a.bold(n.cmd))}`,a.gray("...")),n.cmd){case"help":te(),process.exit(0);case"version":await re(),process.exit(0);case"generate":{try{await b(o)}catch(c){se(c)}process.exit(0)}default:throw new Error(`Error running ${n.cmd}`)}},ne=e=>console.error(a.red(e.toString()||e)),se=e=>{ne(e),process.exit(1)};try{oe(process.argv)}catch(e){console.error(e),process.exit(1)}export{Z as Commands,oe as cli,ee as resolveArgs};
//# sourceMappingURL=cli.esm.js.map
#!/usr/bin/env node
"use strict";(()=>{var G=Object.create;var R=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,o)=>(typeof require<"u"?require:t)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var _=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of V(t))!Q.call(e,s)&&s!==o&&R(e,s,{get:()=>t[s],enumerable:!(r=B(t,s))||r.enumerable});return e};var I=(e,t,o)=>(o=e!=null?G(J(e)):{},_(t||!e||!e.__esModule?R(o,"default",{value:e,enumerable:!0}):o,e));var i=I(m("kleur/colors"),1),H=I(m("yargs-parser"),1);var $=I(m("fast-glob"),1),h=m("path"),x=m("fs"),L=m("ts-morph"),P={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},b=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],w=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],C=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,z=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,O=e=>e.join(`
`).trim(),K=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?w:t},W=e=>({...P,...e});var X=(e,t)=>{let o=new L.Project({tsConfigFilePath:t}),r=[];return e.forEach(s=>{let n=o.getSourceFile(s),c=n.getImportDeclarations().map(a=>a.getFullText()),g=[],f="",l="";n.getInterfaces().map(a=>{switch(a.getName()){case"ApiRequest":f=a.getText();break;case"ApiResponse":l=a.getText();break;default:g.push(a.getText())}});let u=n.getTypeAliases().map(a=>a.getText()),d=[];n.getExportSymbols().forEach(a=>{let y=b.indexOf(a.getName().toUpperCase());if(y>-1){let p=b[y];p==="DELETE"?d.push("DELETE"):p==="ALL"?d=w:d.push(p)}}),d.forEach(a=>{r.push({apiRoute:s,imports:c,method:a,requestInterface:f,responseInterface:l,genericInterfaces:g,genericTypes:u})})}),r},Y=e=>{let t=[];return e.forEach(o=>{let r=(0,x.readFileSync)(o,{encoding:"utf-8"}),s=r.split(`
`),n=[],c=[],g=[],f,l,u,d=0,a=[-1,-1],y=[-1,-1];s.forEach((p,A)=>{let k=/^import (.*) from (.*)/.test(p.trim()),T=p.indexOf("interface ")>-1,U=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(p.trim()),N=p.indexOf(" ApiRequest ")>-1,F=p.indexOf(" ApiResponse ")>-1,j=p.indexOf("{")>-1,M=p.indexOf("}")>-1;if(k){n.push(p);return}if(U){g.push(p);return}T&&N&&(l=A),T&&F&&(u=A),T&&l!==A&&u!==A&&(f=A),(l||u||f)&&j&&d++,(l||u||f)&&M&&(d--,d===0&&(l&&(a=[l,A],l=void 0),u&&(y=[u,A],u=void 0),f&&(c.push(O(s.slice(f,A+1))),f=void 0)))}),K(r).forEach(p=>{t.push({apiRoute:o,imports:n,method:p,requestInterface:O(s.slice(a[0],a[1]+1)),responseInterface:O(s.slice(y[0],y[1]+1)),genericInterfaces:c,genericTypes:g})})}),t},Z=e=>e.reduce((t,o)=>{let{path:r}=o;return t[r]||(t[r]=[]),t[r].push(o),t},{}),S=e=>{e=W(e);let t=(0,h.resolve)(process.cwd(),e.apiDir),o=$.default.sync(`${t}/**/*.ts`),r;switch(e.parser){case"baseline":r=X(o,e.tsConfigPath);break;case"naive":default:r=Y(o);break}r=r.filter(n=>n.responseInterface!==""),r.map(n=>(n.relativePath=`api${n.apiRoute.replace(t,"")}`.trim(),n.path=`${(0,h.parse)(n.relativePath).dir}/${(0,h.parse)(n.relativePath).name}`,n.camelCaseName=n.path.replace(/^api/i,"").split("/").map(c=>C(c)).join("").split(/[-_\ \.]/g).reduce((c,g)=>c+C(g),""),n));let s=Z(r);Object.keys(s).forEach(n=>{let c=s[n],g=re(c,e),f=(0,h.resolve)(process.cwd(),e.outDir,c[0].relativePath.replace(/^api\//,"")),l=(0,h.parse)(f),u=l.dir,d=`${u}${h.sep}${l.name}-client.ts`;(0,x.mkdirSync)(u,{recursive:!0}),(0,x.writeFileSync)(d.toLowerCase(),g,{encoding:"utf-8"})})},ee=(e,t,o,r,s)=>{let n=s?C(e.method.toLowerCase()):"";return`
"use strict";(()=>{var G=Object.create;var R=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,o)=>(typeof require<"u"?require:t)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var z=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of V(t))!W.call(e,s)&&s!==o&&R(e,s,{get:()=>t[s],enumerable:!(r=B(t,s))||r.enumerable});return e};var I=(e,t,o)=>(o=e!=null?G(J(e)):{},z(t||!e||!e.__esModule?R(o,"default",{value:e,enumerable:!0}):o,e));var c=I(m("kleur/colors"),1),H=I(m("yargs-parser"),1);var w=I(m("fast-glob"),1),A=m("path"),P=m("fs"),D=m("ts-morph"),x={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},$=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],L=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],O=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,Q=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,C=e=>e.join(`
`).trim(),_=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?L:t},K=e=>({...x,...e});var X=(e,t)=>{let o=new D.Project({tsConfigFilePath:t}),r=[];return e.forEach(s=>{let n=o.getSourceFile(s),p=n.getImportDeclarations().map(i=>i.getFullText()),h=[],d="",l="";n.getInterfaces().map(i=>{switch(i.getName()){case"ApiRequest":d=i.getText();break;case"ApiResponse":l=i.getText();break;default:h.push(i.getText())}});let f=n.getTypeAliases().map(i=>i.getText()),g=[];n.getExportSymbols().forEach(i=>{let u=$.indexOf(i.getName().toUpperCase());if(u>-1){let a=$[u];a==="DELETE"?g.push("DELETE"):a==="ALL"?g=L:g.push(a)}}),g.forEach(i=>{r.push({apiRoute:s,imports:p,method:i,requestInterface:d,responseInterface:l,genericInterfaces:h,genericTypes:f})})}),r},Y=e=>{let t=[];return e.forEach(o=>{let r=(0,P.readFileSync)(o,{encoding:"utf-8"}),s=r.split(`
`),n=[],p=[],h=[],d,l,f,g=0,i=[-1,-1],u=[-1,-1];s.forEach((a,y)=>{let U=/^import (.*) from (.*)/.test(a.trim()),T=a.indexOf("interface ")>-1,k=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),F=a.indexOf(" ApiRequest ")>-1,N=a.indexOf(" ApiResponse ")>-1,j=a.indexOf("{")>-1,M=a.indexOf("}")>-1;if(U){n.push(a);return}if(k){h.push(a);return}T&&F&&(l=y),T&&N&&(f=y),T&&l!==y&&f!==y&&(d=y),(l||f||d)&&j&&g++,(l||f||d)&&M&&(g--,g===0&&(l&&(i=[l,y],l=void 0),f&&(u=[f,y],f=void 0),d&&(p.push(C(s.slice(d,y+1))),d=void 0)))}),_(r).forEach(a=>{t.push({apiRoute:o,imports:n,method:a,requestInterface:C(s.slice(i[0],i[1]+1)),responseInterface:C(s.slice(u[0],u[1]+1)),genericInterfaces:p,genericTypes:h})})}),t},Z=e=>e.reduce((t,o)=>{let{path:r}=o;return t[r]||(t[r]=[]),t[r].push(o),t},{}),S=e=>{e=K(e);let t=(0,A.resolve)(process.cwd(),e.apiDir),o=w.default.sync(`${t}/**/*.ts`),r;switch(e.parser){case"baseline":r=X(o,e.tsConfigPath);break;case"naive":default:r=Y(o);break}r=r.filter(n=>n.responseInterface!==""),r.map(n=>(n.relativePath=`api${n.apiRoute.replace(t,"")}`.trim(),n.path=`${(0,A.parse)(n.relativePath).dir}/${(0,A.parse)(n.relativePath).name}`,n.camelCaseName=n.path.replace(/^api/i,"").split("/").map(p=>O(p)).join("").split(/[-_\ \.]/g).reduce((p,h)=>p+O(h),""),n));let s=Z(r);Object.keys(s).forEach(n=>{let p=s[n],h=re(p,e),d=(0,A.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),l=(0,A.parse)(d),f=l.dir,g=`${f}${A.sep}${l.name}-client.ts`,i=new D.Project({tsConfigFilePath:e.tsConfigPath});(0,P.mkdirSync)(f,{recursive:!0});let u=i.createSourceFile(g.toLowerCase(),h,{overwrite:!0}),a;do a=u.getFullWidth(),u.fixUnusedIdentifiers();while(a!==u.getFullWidth());u.organizeImports(),u.formatText(),u.saveSync()})},ee=(e,t,o,r,s)=>{let n=s?O(e.method.toLowerCase()):"";return`
/** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */
export const ${z(e.camelCaseName)}${n} = async(${o}options: RequestOptions = {}): Promise<ApiResponse> => {
export const ${Q(e.camelCaseName)}${n} = async(${o}options: RequestOptions = {}): Promise<ApiResponse> => {
let requestUrl = '${t.site}${t.baseUrl}/${e.path}'

@@ -37,7 +37,7 @@ if (options && options.query) {

${e.responseInterface}`,re=(e,t)=>{let o=e[0].requestInterface?`${e[0].requestInterface}`:"",r=e[0].requestInterface?"payload: ApiRequest, ":"",s="";return e.forEach(n=>{let c=n.method!=="HEAD"&&n.method!=="GET"&&n.requestInterface?"options.body = JSON.stringify(payload)":"";s+=ee(n,t,r,c,e.length>1)}),`${te(e[0],o)}
${s}`};var E=m("path"),v=m("url"),q=m("fs/promises"),ne={},oe=async e=>JSON.parse(await(0,q.readFile)(e,{encoding:"utf-8"})),D=async()=>await oe((0,E.resolve)((0,E.parse)((0,v.fileURLToPath)(ne.url)).dir,"../package.json"));var se=(r=>(r.HELP="help",r.VERSION="version",r.GENERATE="generate",r))(se||{}),ie=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:P.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:P.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:P.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},ae=()=>{console.error(`
${i.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${e.responseInterface}`,re=(e,t)=>{let o=e[0].requestInterface?`${e[0].requestInterface}`:"",r=e[0].requestInterface?"payload: ApiRequest, ":"",s="";return e.forEach(n=>{let p=n.method!=="HEAD"&&n.method!=="GET"&&n.requestInterface?"options.body = JSON.stringify(payload)":"";s+=ee(n,t,r,p,e.length>1)}),`${te(e[0],o)}
${s}`};var E=m("path"),v=m("url"),q=m("fs/promises"),ne={},oe=async e=>JSON.parse(await(0,q.readFile)(e,{encoding:"utf-8"})),b=async()=>await oe((0,E.resolve)((0,E.parse)((0,v.fileURLToPath)(ne.url)).dir,"../package.json"));var se=(r=>(r.HELP="help",r.VERSION="version",r.GENERATE="generate",r))(se||{}),ie=e=>{let t={apiDir:typeof e.apiDir=="string"?e.apiDir:x.apiDir,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:x.baseUrl,outDir:typeof e.outDir=="string"?e.outDir:x.outDir};if(e.version)return{cmd:"version",options:t};if(e.help)return{cmd:"help",options:t};switch(e._[2]){case"help":return{cmd:"help",options:t};case"generate":return{cmd:"generate",options:t};default:return{cmd:"version",options:t}}},ae=()=>{console.error(`
${c.bold("astro-client-generator")} - generates TypeScript clients for Astro endpoints
${i.bold("Commands:")}
${c.bold("Commands:")}
generate Generates the TypeScript clients for the endpoints.

@@ -47,3 +47,3 @@ version Show the program version.

${i.bold("Flags:")}
${c.bold("Flags:")}
--apiDir <string> Folder to the API directory on disk (source code), default: './src/pages/api'

@@ -55,5 +55,5 @@ --baseUrl <string> API base URL for calling the API (only relevant if you host in a subdir, it's very unlikely), default: ''

${i.bold("Example(s):")}
${c.bold("Example(s):")}
npx @jsheaven/astro-client-generator generate
`)},pe=async()=>{console.log((await D()).version)},ce=async e=>{let t=(0,H.default)(e),o=ie(t),r={...o.options};switch(console.log(i.dim(">"),`${i.bold(i.yellow("astro-client-generator"))} @ ${i.dim((await D()).version)}: ${i.magenta(i.bold(o.cmd))}`,i.gray("...")),o.cmd){case"help":ae(),process.exit(0);case"version":await pe(),process.exit(0);case"generate":{try{await S(r)}catch(s){ue(s)}process.exit(0)}default:throw new Error(`Error running ${o.cmd}`)}},le=e=>console.error(i.red(e.toString()||e)),ue=e=>{le(e),process.exit(1)};try{ce(process.argv)}catch(e){console.error(e),process.exit(1)}})();
`)},ce=async()=>{console.log((await b()).version)},pe=async e=>{let t=(0,H.default)(e),o=ie(t),r={...o.options};switch(console.log(c.dim(">"),`${c.bold(c.yellow("astro-client-generator"))} @ ${c.dim((await b()).version)}: ${c.magenta(c.bold(o.cmd))}`,c.gray("...")),o.cmd){case"help":ae(),process.exit(0);case"version":await ce(),process.exit(0);case"generate":{try{await S(r)}catch(s){ue(s)}process.exit(0)}default:throw new Error(`Error running ${o.cmd}`)}},le=e=>console.error(c.red(e.toString()||e)),ue=e=>{le(e),process.exit(1)};try{pe(process.argv)}catch(e){console.error(e),process.exit(1)}})();
//# sourceMappingURL=cli.iife.js.map

@@ -1,4 +0,4 @@

var Q=Object.create;var P=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var n in t)P(e,n,{get:t[n],enumerable:!0})},R=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of J(t))!K.call(e,i)&&i!==n&&P(e,i,{get:()=>t[i],enumerable:!(s=z(t,i))||s.enumerable});return e};var W=(e,t,n)=>(n=e!=null?Q(_(e)):{},R(t||!e||!e.__esModule?P(n,"default",{value:e,enumerable:!0}):n,e)),X=e=>R(P({},"__esModule",{value:!0}),e);var Z={};V(Z,{AstroHttpEndpointMethodNames:()=>E,HttpMethods:()=>I,analyzeHttpMethodsImplemented:()=>q,apiClientGenerator:()=>Y,apiGeneratorOptionsDefaults:()=>O,cleanupInterfce:()=>x,generateClientApis:()=>k,groupByApiRoute:()=>S,lowerCaseFirst:()=>L,parseApiRoutesBaseline:()=>b,parseApiRoutesNaive:()=>H,produceClientApiCode:()=>w,produceClientApiHeaderCode:()=>U,produceClientApiRequestImplCode:()=>N,upperCaseFirst:()=>y,validateConfig:()=>C});module.exports=X(Z);var D=W(require("fast-glob"),1),d=require("path"),m=require("fs"),$=require("ts-morph"),O={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},E=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],I=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],y=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,L=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,x=e=>e.join(`
`).trim(),q=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?I:t},C=e=>({...O,...e}),Y=(e=O)=>(e=C(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{k(e)}}}),b=(e,t)=>{let n=new $.Project({tsConfigFilePath:t}),s=[];return e.forEach(i=>{let r=n.getSourceFile(i),p=r.getImportDeclarations().map(o=>o.getFullText()),A=[],u="",c="";r.getInterfaces().map(o=>{switch(o.getName()){case"ApiRequest":u=o.getText();break;case"ApiResponse":c=o.getText();break;default:A.push(o.getText())}});let f=r.getTypeAliases().map(o=>o.getText()),l=[];r.getExportSymbols().forEach(o=>{let g=E.indexOf(o.getName().toUpperCase());if(g>-1){let a=E[g];a==="DELETE"?l.push("DELETE"):a==="ALL"?l=I:l.push(a)}}),l.forEach(o=>{s.push({apiRoute:i,imports:p,method:o,requestInterface:u,responseInterface:c,genericInterfaces:A,genericTypes:f})})}),s},H=e=>{let t=[];return e.forEach(n=>{let s=(0,m.readFileSync)(n,{encoding:"utf-8"}),i=s.split(`
`),r=[],p=[],A=[],u,c,f,l=0,o=[-1,-1],g=[-1,-1];i.forEach((a,h)=>{let j=/^import (.*) from (.*)/.test(a.trim()),T=a.indexOf("interface ")>-1,M=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),F=a.indexOf(" ApiRequest ")>-1,v=a.indexOf(" ApiResponse ")>-1,G=a.indexOf("{")>-1,B=a.indexOf("}")>-1;if(j){r.push(a);return}if(M){A.push(a);return}T&&F&&(c=h),T&&v&&(f=h),T&&c!==h&&f!==h&&(u=h),(c||f||u)&&G&&l++,(c||f||u)&&B&&(l--,l===0&&(c&&(o=[c,h],c=void 0),f&&(g=[f,h],f=void 0),u&&(p.push(x(i.slice(u,h+1))),u=void 0)))}),q(s).forEach(a=>{t.push({apiRoute:n,imports:r,method:a,requestInterface:x(i.slice(o[0],o[1]+1)),responseInterface:x(i.slice(g[0],g[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},S=e=>e.reduce((t,n)=>{let{path:s}=n;return t[s]||(t[s]=[]),t[s].push(n),t},{}),k=e=>{e=C(e);let t=(0,d.resolve)(process.cwd(),e.apiDir),n=D.default.sync(`${t}/**/*.ts`),s;switch(e.parser){case"baseline":s=b(n,e.tsConfigPath);break;case"naive":default:s=H(n);break}s=s.filter(r=>r.responseInterface!==""),s.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${(0,d.parse)(r.relativePath).dir}/${(0,d.parse)(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>y(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+y(A),""),r));let i=S(s);Object.keys(i).forEach(r=>{let p=i[r],A=w(p,e),u=(0,d.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=(0,d.parse)(u),f=c.dir,l=`${f}${d.sep}${c.name}-client.ts`;(0,m.mkdirSync)(f,{recursive:!0}),(0,m.writeFileSync)(l.toLowerCase(),A,{encoding:"utf-8"})})},N=(e,t,n,s,i)=>{let r=i?y(e.method.toLowerCase()):"";return`
var W=Object.create;var m=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var K=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},D=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Q(t))!_.call(e,i)&&i!==n&&m(e,i,{get:()=>t[i],enumerable:!(s=z(t,i))||s.enumerable});return e};var V=(e,t,n)=>(n=e!=null?W(J(e)):{},D(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),X=e=>D(m({},"__esModule",{value:!0}),e);var Z={};K(Z,{AstroHttpEndpointMethodNames:()=>E,HttpMethods:()=>O,analyzeHttpMethodsImplemented:()=>q,apiClientGenerator:()=>Y,apiGeneratorOptionsDefaults:()=>C,cleanupInterfce:()=>P,generateClientApis:()=>k,groupByApiRoute:()=>S,lowerCaseFirst:()=>L,parseApiRoutesBaseline:()=>b,parseApiRoutesNaive:()=>H,produceClientApiCode:()=>U,produceClientApiHeaderCode:()=>F,produceClientApiRequestImplCode:()=>w,upperCaseFirst:()=>x,validateConfig:()=>R});module.exports=X(Z);var $=V(require("fast-glob"),1),h=require("path"),y=require("fs"),I=require("ts-morph"),C={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},E=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],O=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],x=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,L=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,P=e=>e.join(`
`).trim(),q=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?O:t},R=e=>({...C,...e}),Y=(e=C)=>(e=R(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{k(e)}}}),b=(e,t)=>{let n=new I.Project({tsConfigFilePath:t}),s=[];return e.forEach(i=>{let r=n.getSourceFile(i),p=r.getImportDeclarations().map(o=>o.getFullText()),A=[],l="",c="";r.getInterfaces().map(o=>{switch(o.getName()){case"ApiRequest":l=o.getText();break;case"ApiResponse":c=o.getText();break;default:A.push(o.getText())}});let u=r.getTypeAliases().map(o=>o.getText()),d=[];r.getExportSymbols().forEach(o=>{let f=E.indexOf(o.getName().toUpperCase());if(f>-1){let a=E[f];a==="DELETE"?d.push("DELETE"):a==="ALL"?d=O:d.push(a)}}),d.forEach(o=>{s.push({apiRoute:i,imports:p,method:o,requestInterface:l,responseInterface:c,genericInterfaces:A,genericTypes:u})})}),s},H=e=>{let t=[];return e.forEach(n=>{let s=(0,y.readFileSync)(n,{encoding:"utf-8"}),i=s.split(`
`),r=[],p=[],A=[],l,c,u,d=0,o=[-1,-1],f=[-1,-1];i.forEach((a,g)=>{let N=/^import (.*) from (.*)/.test(a.trim()),T=a.indexOf("interface ")>-1,j=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),v=a.indexOf(" ApiRequest ")>-1,M=a.indexOf(" ApiResponse ")>-1,B=a.indexOf("{")>-1,G=a.indexOf("}")>-1;if(N){r.push(a);return}if(j){A.push(a);return}T&&v&&(c=g),T&&M&&(u=g),T&&c!==g&&u!==g&&(l=g),(c||u||l)&&B&&d++,(c||u||l)&&G&&(d--,d===0&&(c&&(o=[c,g],c=void 0),u&&(f=[u,g],u=void 0),l&&(p.push(P(i.slice(l,g+1))),l=void 0)))}),q(s).forEach(a=>{t.push({apiRoute:n,imports:r,method:a,requestInterface:P(i.slice(o[0],o[1]+1)),responseInterface:P(i.slice(f[0],f[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},S=e=>e.reduce((t,n)=>{let{path:s}=n;return t[s]||(t[s]=[]),t[s].push(n),t},{}),k=e=>{e=R(e);let t=(0,h.resolve)(process.cwd(),e.apiDir),n=$.default.sync(`${t}/**/*.ts`),s;switch(e.parser){case"baseline":s=b(n,e.tsConfigPath);break;case"naive":default:s=H(n);break}s=s.filter(r=>r.responseInterface!==""),s.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${(0,h.parse)(r.relativePath).dir}/${(0,h.parse)(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>x(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+x(A),""),r));let i=S(s);Object.keys(i).forEach(r=>{let p=i[r],A=U(p,e),l=(0,h.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=(0,h.parse)(l),u=c.dir,d=`${u}${h.sep}${c.name}-client.ts`,o=new I.Project({tsConfigFilePath:e.tsConfigPath});(0,y.mkdirSync)(u,{recursive:!0});let f=o.createSourceFile(d.toLowerCase(),A,{overwrite:!0}),a;do a=f.getFullWidth(),f.fixUnusedIdentifiers();while(a!==f.getFullWidth());f.organizeImports(),f.formatText(),f.saveSync()})},w=(e,t,n,s,i)=>{let r=i?x(e.method.toLowerCase()):"";return`

@@ -17,3 +17,3 @@ /** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */

return (await fetch(requestUrl, options)).json()
}`},U=(e,t)=>`${e.imports.join(`
}`},F=(e,t)=>`${e.imports.join(`
`)}

@@ -37,4 +37,4 @@

${e.responseInterface}`,w=(e,t)=>{let n=e[0].requestInterface?`${e[0].requestInterface}`:"",s=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=N(r,t,s,p,e.length>1)}),`${U(e[0],n)}
${e.responseInterface}`,U=(e,t)=>{let n=e[0].requestInterface?`${e[0].requestInterface}`:"",s=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=w(r,t,s,p,e.length>1)}),`${F(e[0],n)}
${i}`};0&&(module.exports={AstroHttpEndpointMethodNames,HttpMethods,analyzeHttpMethodsImplemented,apiClientGenerator,apiGeneratorOptionsDefaults,cleanupInterfce,generateClientApis,groupByApiRoute,lowerCaseFirst,parseApiRoutesBaseline,parseApiRoutesNaive,produceClientApiCode,produceClientApiHeaderCode,produceClientApiRequestImplCode,upperCaseFirst,validateConfig});
//# sourceMappingURL=index.cjs.js.map

@@ -1,7 +0,7 @@

import b from"fast-glob";import{resolve as y,parse as m,sep as H}from"path";import{readFileSync as S,mkdirSync as k,writeFileSync as N}from"fs";import{Project as U}from"ts-morph";var E={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},T=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],O=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],x=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,w=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,P=e=>e.join(`
`).trim(),j=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?O:t},I=e=>({...E,...e}),W=(e=E)=>(e=I(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{G(e)}}}),M=(e,t)=>{let a=new U({tsConfigFilePath:t}),n=[];return e.forEach(i=>{let r=a.getSourceFile(i),p=r.getImportDeclarations().map(s=>s.getFullText()),A=[],u="",c="";r.getInterfaces().map(s=>{switch(s.getName()){case"ApiRequest":u=s.getText();break;case"ApiResponse":c=s.getText();break;default:A.push(s.getText())}});let f=r.getTypeAliases().map(s=>s.getText()),l=[];r.getExportSymbols().forEach(s=>{let h=T.indexOf(s.getName().toUpperCase());if(h>-1){let o=T[h];o==="DELETE"?l.push("DELETE"):o==="ALL"?l=O:l.push(o)}}),l.forEach(s=>{n.push({apiRoute:i,imports:p,method:s,requestInterface:u,responseInterface:c,genericInterfaces:A,genericTypes:f})})}),n},F=e=>{let t=[];return e.forEach(a=>{let n=S(a,{encoding:"utf-8"}),i=n.split(`
`),r=[],p=[],A=[],u,c,f,l=0,s=[-1,-1],h=[-1,-1];i.forEach((o,d)=>{let C=/^import (.*) from (.*)/.test(o.trim()),g=o.indexOf("interface ")>-1,R=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(o.trim()),D=o.indexOf(" ApiRequest ")>-1,$=o.indexOf(" ApiResponse ")>-1,L=o.indexOf("{")>-1,q=o.indexOf("}")>-1;if(C){r.push(o);return}if(R){A.push(o);return}g&&D&&(c=d),g&&$&&(f=d),g&&c!==d&&f!==d&&(u=d),(c||f||u)&&L&&l++,(c||f||u)&&q&&(l--,l===0&&(c&&(s=[c,d],c=void 0),f&&(h=[f,d],f=void 0),u&&(p.push(P(i.slice(u,d+1))),u=void 0)))}),j(n).forEach(o=>{t.push({apiRoute:a,imports:r,method:o,requestInterface:P(i.slice(s[0],s[1]+1)),responseInterface:P(i.slice(h[0],h[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},v=e=>e.reduce((t,a)=>{let{path:n}=a;return t[n]||(t[n]=[]),t[n].push(a),t},{}),G=e=>{e=I(e);let t=y(process.cwd(),e.apiDir),a=b.sync(`${t}/**/*.ts`),n;switch(e.parser){case"baseline":n=M(a,e.tsConfigPath);break;case"naive":default:n=F(a);break}n=n.filter(r=>r.responseInterface!==""),n.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${m(r.relativePath).dir}/${m(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>x(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+x(A),""),r));let i=v(n);Object.keys(i).forEach(r=>{let p=i[r],A=z(p,e),u=y(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=m(u),f=c.dir,l=`${f}${H}${c.name}-client.ts`;k(f,{recursive:!0}),N(l.toLowerCase(),A,{encoding:"utf-8"})})},B=(e,t,a,n,i)=>{let r=i?x(e.method.toLowerCase()):"";return`
import H from"fast-glob";import{resolve as y,parse as m,sep as S}from"path";import{readFileSync as k,mkdirSync as w}from"fs";import{Project as E}from"ts-morph";var I={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},T=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],C=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],x=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,F=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,P=e=>e.join(`
`).trim(),U=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?C:t},O=e=>({...I,...e}),V=(e=I)=>(e=O(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{M(e)}}}),N=(e,t)=>{let a=new E({tsConfigFilePath:t}),n=[];return e.forEach(o=>{let r=a.getSourceFile(o),p=r.getImportDeclarations().map(s=>s.getFullText()),A=[],l="",c="";r.getInterfaces().map(s=>{switch(s.getName()){case"ApiRequest":l=s.getText();break;case"ApiResponse":c=s.getText();break;default:A.push(s.getText())}});let u=r.getTypeAliases().map(s=>s.getText()),d=[];r.getExportSymbols().forEach(s=>{let f=T.indexOf(s.getName().toUpperCase());if(f>-1){let i=T[f];i==="DELETE"?d.push("DELETE"):i==="ALL"?d=C:d.push(i)}}),d.forEach(s=>{n.push({apiRoute:o,imports:p,method:s,requestInterface:l,responseInterface:c,genericInterfaces:A,genericTypes:u})})}),n},j=e=>{let t=[];return e.forEach(a=>{let n=k(a,{encoding:"utf-8"}),o=n.split(`
`),r=[],p=[],A=[],l,c,u,d=0,s=[-1,-1],f=[-1,-1];o.forEach((i,h)=>{let R=/^import (.*) from (.*)/.test(i.trim()),g=i.indexOf("interface ")>-1,D=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(i.trim()),$=i.indexOf(" ApiRequest ")>-1,L=i.indexOf(" ApiResponse ")>-1,q=i.indexOf("{")>-1,b=i.indexOf("}")>-1;if(R){r.push(i);return}if(D){A.push(i);return}g&&$&&(c=h),g&&L&&(u=h),g&&c!==h&&u!==h&&(l=h),(c||u||l)&&q&&d++,(c||u||l)&&b&&(d--,d===0&&(c&&(s=[c,h],c=void 0),u&&(f=[u,h],u=void 0),l&&(p.push(P(o.slice(l,h+1))),l=void 0)))}),U(n).forEach(i=>{t.push({apiRoute:a,imports:r,method:i,requestInterface:P(o.slice(s[0],s[1]+1)),responseInterface:P(o.slice(f[0],f[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},v=e=>e.reduce((t,a)=>{let{path:n}=a;return t[n]||(t[n]=[]),t[n].push(a),t},{}),M=e=>{e=O(e);let t=y(process.cwd(),e.apiDir),a=H.sync(`${t}/**/*.ts`),n;switch(e.parser){case"baseline":n=N(a,e.tsConfigPath);break;case"naive":default:n=j(a);break}n=n.filter(r=>r.responseInterface!==""),n.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${m(r.relativePath).dir}/${m(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>x(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+x(A),""),r));let o=v(n);Object.keys(o).forEach(r=>{let p=o[r],A=W(p,e),l=y(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=m(l),u=c.dir,d=`${u}${S}${c.name}-client.ts`,s=new E({tsConfigFilePath:e.tsConfigPath});w(u,{recursive:!0});let f=s.createSourceFile(d.toLowerCase(),A,{overwrite:!0}),i;do i=f.getFullWidth(),f.fixUnusedIdentifiers();while(i!==f.getFullWidth());f.organizeImports(),f.formatText(),f.saveSync()})},B=(e,t,a,n,o)=>{let r=o?x(e.method.toLowerCase()):"";return`
/** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */
export const ${w(e.camelCaseName)}${r} = async(${a}options: RequestOptions = {}): Promise<ApiResponse> => {
export const ${F(e.camelCaseName)}${r} = async(${a}options: RequestOptions = {}): Promise<ApiResponse> => {
let requestUrl = '${t.site}${t.baseUrl}/${e.path}'

@@ -17,3 +17,3 @@ if (options && options.query) {

return (await fetch(requestUrl, options)).json()
}`},Q=(e,t)=>`${e.imports.join(`
}`},G=(e,t)=>`${e.imports.join(`
`)}

@@ -37,4 +37,4 @@

${e.responseInterface}`,z=(e,t)=>{let a=e[0].requestInterface?`${e[0].requestInterface}`:"",n=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=B(r,t,n,p,e.length>1)}),`${Q(e[0],a)}
${i}`};export{T as AstroHttpEndpointMethodNames,O as HttpMethods,j as analyzeHttpMethodsImplemented,W as apiClientGenerator,E as apiGeneratorOptionsDefaults,P as cleanupInterfce,G as generateClientApis,v as groupByApiRoute,w as lowerCaseFirst,M as parseApiRoutesBaseline,F as parseApiRoutesNaive,z as produceClientApiCode,Q as produceClientApiHeaderCode,B as produceClientApiRequestImplCode,x as upperCaseFirst,I as validateConfig};
${e.responseInterface}`,W=(e,t)=>{let a=e[0].requestInterface?`${e[0].requestInterface}`:"",n=e[0].requestInterface?"payload: ApiRequest, ":"",o="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";o+=B(r,t,n,p,e.length>1)}),`${G(e[0],a)}
${o}`};export{T as AstroHttpEndpointMethodNames,C as HttpMethods,U as analyzeHttpMethodsImplemented,V as apiClientGenerator,I as apiGeneratorOptionsDefaults,P as cleanupInterfce,M as generateClientApis,v as groupByApiRoute,F as lowerCaseFirst,N as parseApiRoutesBaseline,j as parseApiRoutesNaive,W as produceClientApiCode,G as produceClientApiHeaderCode,B as produceClientApiRequestImplCode,x as upperCaseFirst,O as validateConfig};
//# sourceMappingURL=index.esm.js.map

@@ -1,7 +0,7 @@

(()=>{var N=Object.create;var E=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var P=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var F=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of w(t))!M.call(e,i)&&i!==s&&E(e,i,{get:()=>t[i],enumerable:!(n=U(t,i))||n.enumerable});return e};var v=(e,t,s)=>(s=e!=null?N(j(e)):{},F(t||!e||!e.__esModule?E(s,"default",{value:e,enumerable:!0}):s,e));var I=v(P("fast-glob"),1),d=P("path"),m=P("fs"),C=P("ts-morph"),R={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},O=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],D=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],T=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,G=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,y=e=>e.join(`
`).trim(),B=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?D:t},$=e=>({...R,...e}),Y=(e=R)=>(e=$(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{_(e)}}}),Q=(e,t)=>{let s=new C.Project({tsConfigFilePath:t}),n=[];return e.forEach(i=>{let r=s.getSourceFile(i),p=r.getImportDeclarations().map(o=>o.getFullText()),A=[],u="",c="";r.getInterfaces().map(o=>{switch(o.getName()){case"ApiRequest":u=o.getText();break;case"ApiResponse":c=o.getText();break;default:A.push(o.getText())}});let f=r.getTypeAliases().map(o=>o.getText()),l=[];r.getExportSymbols().forEach(o=>{let g=O.indexOf(o.getName().toUpperCase());if(g>-1){let a=O[g];a==="DELETE"?l.push("DELETE"):a==="ALL"?l=D:l.push(a)}}),l.forEach(o=>{n.push({apiRoute:i,imports:p,method:o,requestInterface:u,responseInterface:c,genericInterfaces:A,genericTypes:f})})}),n},z=e=>{let t=[];return e.forEach(s=>{let n=(0,m.readFileSync)(s,{encoding:"utf-8"}),i=n.split(`
`),r=[],p=[],A=[],u,c,f,l=0,o=[-1,-1],g=[-1,-1];i.forEach((a,h)=>{let L=/^import (.*) from (.*)/.test(a.trim()),x=a.indexOf("interface ")>-1,q=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),b=a.indexOf(" ApiRequest ")>-1,H=a.indexOf(" ApiResponse ")>-1,S=a.indexOf("{")>-1,k=a.indexOf("}")>-1;if(L){r.push(a);return}if(q){A.push(a);return}x&&b&&(c=h),x&&H&&(f=h),x&&c!==h&&f!==h&&(u=h),(c||f||u)&&S&&l++,(c||f||u)&&k&&(l--,l===0&&(c&&(o=[c,h],c=void 0),f&&(g=[f,h],f=void 0),u&&(p.push(y(i.slice(u,h+1))),u=void 0)))}),B(n).forEach(a=>{t.push({apiRoute:s,imports:r,method:a,requestInterface:y(i.slice(o[0],o[1]+1)),responseInterface:y(i.slice(g[0],g[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},J=e=>e.reduce((t,s)=>{let{path:n}=s;return t[n]||(t[n]=[]),t[n].push(s),t},{}),_=e=>{e=$(e);let t=(0,d.resolve)(process.cwd(),e.apiDir),s=I.default.sync(`${t}/**/*.ts`),n;switch(e.parser){case"baseline":n=Q(s,e.tsConfigPath);break;case"naive":default:n=z(s);break}n=n.filter(r=>r.responseInterface!==""),n.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${(0,d.parse)(r.relativePath).dir}/${(0,d.parse)(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>T(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+T(A),""),r));let i=J(n);Object.keys(i).forEach(r=>{let p=i[r],A=W(p,e),u=(0,d.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=(0,d.parse)(u),f=c.dir,l=`${f}${d.sep}${c.name}-client.ts`;(0,m.mkdirSync)(f,{recursive:!0}),(0,m.writeFileSync)(l.toLowerCase(),A,{encoding:"utf-8"})})},K=(e,t,s,n,i)=>{let r=i?T(e.method.toLowerCase()):"";return`
(()=>{var w=Object.create;var I=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var v=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of U(t))!j.call(e,i)&&i!==s&&I(e,i,{get:()=>t[i],enumerable:!(n=F(t,i))||n.enumerable});return e};var M=(e,t,s)=>(s=e!=null?w(N(e)):{},v(t||!e||!e.__esModule?I(s,"default",{value:e,enumerable:!0}):s,e));var O=M(m("fast-glob"),1),h=m("path"),P=m("fs"),E=m("ts-morph"),R={apiDir:"./src/pages/api",baseUrl:"",outDir:"./src/pages/api-client",tsConfigPath:"./tsconfig.json",site:"http://localhost:3000"},C=["GET","POST","DELETE","PATCH","HEAD","PUT","OPTIONS","ALL"],D=["POST","DELETE","GET","PATCH","HEAD","PUT","OPTIONS"],T=e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`,B=e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,y=e=>e.join(`
`).trim(),G=e=>{let t=[];return(e.indexOf("function GET")>-1||e.indexOf("export const GET")>-1)&&t.push("GET"),(e.indexOf("function POST")>-1||e.indexOf("export const POST")>-1)&&t.push("POST"),(e.indexOf("function DELETE")>-1||e.indexOf("export const DELETE")>-1)&&t.push("DELETE"),(e.indexOf("function PATCH")>-1||e.indexOf("export const PATCH")>-1)&&t.push("PATCH"),(e.indexOf("function HEAD")>-1||e.indexOf("export const HEAD")>-1)&&t.push("HEAD"),(e.indexOf("function PUT")>-1||e.indexOf("export const PUT")>-1)&&t.push("PUT"),(e.indexOf("function OPTIONS")>-1||e.indexOf("export const OPTIONS")>-1)&&t.push("OPTIONS"),e.indexOf("function ALL")>-1||e.indexOf("export const ALL")>-1?D:t},$=e=>({...R,...e}),Z=(e=R)=>(e=$(e),{name:"astro-client-generator",hooks:{"astro:build:done":async()=>{J(e)}}}),W=(e,t)=>{let s=new E.Project({tsConfigFilePath:t}),n=[];return e.forEach(i=>{let r=s.getSourceFile(i),p=r.getImportDeclarations().map(o=>o.getFullText()),A=[],l="",c="";r.getInterfaces().map(o=>{switch(o.getName()){case"ApiRequest":l=o.getText();break;case"ApiResponse":c=o.getText();break;default:A.push(o.getText())}});let u=r.getTypeAliases().map(o=>o.getText()),d=[];r.getExportSymbols().forEach(o=>{let f=C.indexOf(o.getName().toUpperCase());if(f>-1){let a=C[f];a==="DELETE"?d.push("DELETE"):a==="ALL"?d=D:d.push(a)}}),d.forEach(o=>{n.push({apiRoute:i,imports:p,method:o,requestInterface:l,responseInterface:c,genericInterfaces:A,genericTypes:u})})}),n},z=e=>{let t=[];return e.forEach(s=>{let n=(0,P.readFileSync)(s,{encoding:"utf-8"}),i=n.split(`
`),r=[],p=[],A=[],l,c,u,d=0,o=[-1,-1],f=[-1,-1];i.forEach((a,g)=>{let L=/^import (.*) from (.*)/.test(a.trim()),x=a.indexOf("interface ")>-1,q=/^\s*(?:export\s+)?type\s+\w+\s*=\s*[\w<>,\s|]+\s*;?\s*$/.test(a.trim()),b=a.indexOf(" ApiRequest ")>-1,H=a.indexOf(" ApiResponse ")>-1,S=a.indexOf("{")>-1,k=a.indexOf("}")>-1;if(L){r.push(a);return}if(q){A.push(a);return}x&&b&&(c=g),x&&H&&(u=g),x&&c!==g&&u!==g&&(l=g),(c||u||l)&&S&&d++,(c||u||l)&&k&&(d--,d===0&&(c&&(o=[c,g],c=void 0),u&&(f=[u,g],u=void 0),l&&(p.push(y(i.slice(l,g+1))),l=void 0)))}),G(n).forEach(a=>{t.push({apiRoute:s,imports:r,method:a,requestInterface:y(i.slice(o[0],o[1]+1)),responseInterface:y(i.slice(f[0],f[1]+1)),genericInterfaces:p,genericTypes:A})})}),t},Q=e=>e.reduce((t,s)=>{let{path:n}=s;return t[n]||(t[n]=[]),t[n].push(s),t},{}),J=e=>{e=$(e);let t=(0,h.resolve)(process.cwd(),e.apiDir),s=O.default.sync(`${t}/**/*.ts`),n;switch(e.parser){case"baseline":n=W(s,e.tsConfigPath);break;case"naive":default:n=z(s);break}n=n.filter(r=>r.responseInterface!==""),n.map(r=>(r.relativePath=`api${r.apiRoute.replace(t,"")}`.trim(),r.path=`${(0,h.parse)(r.relativePath).dir}/${(0,h.parse)(r.relativePath).name}`,r.camelCaseName=r.path.replace(/^api/i,"").split("/").map(p=>T(p)).join("").split(/[-_\ \.]/g).reduce((p,A)=>p+T(A),""),r));let i=Q(n);Object.keys(i).forEach(r=>{let p=i[r],A=V(p,e),l=(0,h.resolve)(process.cwd(),e.outDir,p[0].relativePath.replace(/^api\//,"")),c=(0,h.parse)(l),u=c.dir,d=`${u}${h.sep}${c.name}-client.ts`,o=new E.Project({tsConfigFilePath:e.tsConfigPath});(0,P.mkdirSync)(u,{recursive:!0});let f=o.createSourceFile(d.toLowerCase(),A,{overwrite:!0}),a;do a=f.getFullWidth(),f.fixUnusedIdentifiers();while(a!==f.getFullWidth());f.organizeImports(),f.formatText(),f.saveSync()})},_=(e,t,s,n,i)=>{let r=i?T(e.method.toLowerCase()):"";return`
/** return (await fetch('${t.baseUrl}/${e.path}', { method: '${e.method}', ... })).json() */
export const ${G(e.camelCaseName)}${r} = async(${s}options: RequestOptions = {}): Promise<ApiResponse> => {
export const ${B(e.camelCaseName)}${r} = async(${s}options: RequestOptions = {}): Promise<ApiResponse> => {
let requestUrl = '${t.site}${t.baseUrl}/${e.path}'

@@ -17,3 +17,3 @@ if (options && options.query) {

return (await fetch(requestUrl, options)).json()
}`},V=(e,t)=>`${e.imports.join(`
}`},K=(e,t)=>`${e.imports.join(`
`)}

@@ -37,4 +37,4 @@

${e.responseInterface}`,W=(e,t)=>{let s=e[0].requestInterface?`${e[0].requestInterface}`:"",n=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=K(r,t,n,p,e.length>1)}),`${V(e[0],s)}
${e.responseInterface}`,V=(e,t)=>{let s=e[0].requestInterface?`${e[0].requestInterface}`:"",n=e[0].requestInterface?"payload: ApiRequest, ":"",i="";return e.forEach(r=>{let p=r.method!=="HEAD"&&r.method!=="GET"&&r.requestInterface?"options.body = JSON.stringify(payload)":"";i+=_(r,t,n,p,e.length>1)}),`${K(e[0],s)}
${i}`};})();
//# sourceMappingURL=index.iife.js.map
{
"name": "@jsheaven/astro-client-generator",
"version": "1.1.0",
"version": "1.1.1",
"type": "module",

@@ -5,0 +5,0 @@ "publishConfig": {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc