UNPKG

@getcronit/pylon-dev

Version:

CLI for creating a Pylon

240 lines (203 loc) 37.4 kB
import{program as V}from"commander";import{spawn as ze}from"child_process";import O from"consola";import We from"dotenv";var ne="2.0.0-canary-20260215225247.695ce4114492d635280d8ac7d20fc4b447ae7d8b";import{PostHog as Ne}from"posthog-node";import Pe from"conf";import{readFileSync as xe}from"fs";import{randomUUID as re}from"crypto";var De={distinctId:{type:"string",default:re()}},ke=new Pe({projectName:"pylon",schema:De}),j=ke.get("distinctId"),E=re(),I=new Ne("phc_KN4qCOcCdkXp6sHLIuMWGRfzZWuNht69oqv5Kw5rGxj",{host:"https://eu.i.posthog.com",disabled:process.env.PYLON_DISABLE_TELEMETRY==="true"}),Ce=()=>{let o;try{o=JSON.parse(xe("./package.json","utf8"))}catch{o={}}let s=o.dependencies||{},t=o.devDependencies||{},e=o.peerDependencies||{};return{dependencies:s,devDependencies:t,peerDependencies:e}},R=Ce(),Y=async()=>{try{let s=(await import(`${process.cwd()}/.pylon/config.js`)).config,t=JSON.parse(JSON.stringify(s));return Object.keys(t).length===0?!1:t}catch{return!1}};import Le from"path";import{context as Be}from"esbuild";import $e from"esbuild-plugin-tsc";import ue from"fs/promises";import $ from"path";import ae from"fs/promises";async function k(o,s){try{if(await ae.readFile(o,"utf8")===s)return!1}catch(t){if(t.code!=="ENOENT")throw t}return await ae.writeFile(o,s,"utf8"),!0}import Ie from"esbuild";import{readFileSync as Ae}from"fs";import{dirname as Oe,resolve as je}from"path";import S from"typescript";async function oe(o,s=".pylon/config.js"){let t=je(o),e=Ae(t,"utf8"),a=S.createSourceFile(t,e,S.ScriptTarget.ESNext,!0),r=new Map,n=new Map;function i(p,y){if(S.isIdentifier(p))r.set(p.text,y);else if(S.isObjectBindingPattern(p)||S.isArrayBindingPattern(p))for(let g of p.elements)S.isBindingElement(g)&&i(g.name,y)}S.forEachChild(a,p=>{if(S.isVariableStatement(p))for(let y of p.declarationList.declarations)i(y.name,p);else if(S.isFunctionDeclaration(p)&&p.name)r.set(p.name.text,p);else if(S.isClassDeclaration(p)&&p.name)r.set(p.name.text,p);else if(S.isEnumDeclaration(p)&&p.name)r.set(p.name.text,p);else if(S.isInterfaceDeclaration(p)&&p.name)r.set(p.name.text,p);else if(S.isTypeAliasDeclaration(p)&&p.name)r.set(p.name.text,p);else if(S.isImportDeclaration(p)){let y=p.importClause;if(y&&(y.name&&n.set(y.name.text,p),y.namedBindings))if(S.isNamedImports(y.namedBindings))for(let g of y.namedBindings.elements)n.set(g.name.text,p);else S.isNamespaceImport(y.namedBindings)&&n.set(y.namedBindings.name.text,p)}});let c=new Set,d=new Set,f=new Set;function l(p){if(f.has(p))return;f.add(p);let y=r.get(p);y&&(c.add(y),u(y));let g=n.get(p);g&&d.add(g)}function u(p){S.forEachChild(p,y=>{if(S.isIdentifier(y)){let g=y.parent;if(S.isPropertyAccessExpression(g)&&g.name===y||S.isPropertyAssignment(g)&&g.name===y||S.isMethodDeclaration(g)&&g.name===y||S.isClassDeclaration(g)&&g.name===y||S.isFunctionDeclaration(g)&&g.name===y)return;l(y.text)}else u(y)})}let m=r.get("config");m&&(c.add(m),u(m));let T=[];for(let p of a.statements)S.isImportDeclaration(p)?d.has(p)&&T.push(p.getFullText(a).trim()):c.has(p)&&T.push(p.getFullText(a).trim());let h=T.join(` `);!r.has("config")&&!h.includes("export const config")&&(h+=` export const config = {}`),await Ie.build({stdin:{contents:h,resolveDir:Oe(t),sourcefile:t,loader:"ts"},bundle:!0,format:"esm",outfile:s,packages:"external"})}import Ee from"fs/promises";import U from"path";var ce=({getBuildDefs:o,outputDir:s})=>({name:"inject-code",setup(t){t.onLoad({filter:/src[\/\\]index\.ts$/,namespace:"file"},async e=>{if(U.relative(process.cwd(),e.path)!==U.join("src","index.ts"))return;let{typeDefs:r,resolvers:n}=o(),i=le(n),c=await Ee.readFile(e.path,"utf-8"),d=U.join(process.cwd(),s,"schema.graphql");await k(d,r);let f=U.join(process.cwd(),s,"resolvers.js");return await k(f,`export const resolvers = ${i}`),{loader:"ts",contents:`import {executeConfig} from "@getcronit/pylon" var __internalPylonConfig = {config: {}} try { __internalPylonConfig = await import('./config.js') } catch (e) { } await executeConfig(__internalPylonConfig.config) `+c+` import {handler as __internalPylonHandler} from "@getcronit/pylon" app.use(__internalPylonHandler({ typeDefs: ${JSON.stringify(r)}, graphql, resolvers: ${i}, })) await executeConfig(__internalPylonConfig.config, { pluginsStrategy: "last" }) `}})}});function le(o){return`{${Object.entries(o).map(([t,e])=>{if(e!==void 0)return typeof e=="string"?`${t}:${e}`:typeof e=="function"?`${t}:${e.toString()}`:typeof e=="object"&&!Array.isArray(e)?`${t}:${le(e)}`:`${t}:${JSON.stringify(e)}`}).join(",")}}`}import Re from"path";import pe from"fs/promises";import B from"consola";var fe=({dir:o,onBuild:s})=>({name:"notify",async setup(t){let e=async()=>{let n=Re.join(o,"schema.graphql");try{await pe.access(n)}catch{return null}return await pe.readFile(n,"utf-8")},a=await e(),r=Date.now();t.onStart(async()=>{r=Date.now(),B.start("[Pylon]: Building...")}),t.onEnd(async n=>{if(n.errors.length>0){for(let u of n.errors)B.error(`[Pylon]: ${u.text} ${u.location?`at ${u.location.file}:${u.location.line}:${u.location.column}`:""} ${u.detail?u.detail:""}`);throw new Error("Failed to build Pylon")}if(n.warnings.length>0)for(let u of n.warnings)B.warn(u);let i=Date.now()-r,c=Object.keys(n.metafile.inputs).length,d=Object.values(n.metafile.outputs).reduce((u,m)=>u+m.bytes,0),f=await e();B.success(`[Pylon]: Built in ${i}ms`);let l=f!==a;l&&(B.info("[Pylon]: Schema updated"),a=f),s&&await s({totalFiles:c,totalSize:d,schemaChanged:l,duration:i})})}});var q=class{sfiFilePath;outputDir;constructor(s,t="./.pylon"){this.sfiFilePath=s,this.outputDir=t}async initBuildPlugins(s){let t=$.join(process.cwd(),this.outputDir,"config.js");await oe(this.sfiFilePath,t);let e;try{e=(await import(t)).config}catch(n){console.error("Error loading config",n)}let a=[],r=e?.plugins||[];for(let n of r)if(n.build){let i=n.build({onBuild:s.onBuild});a.push(i)}return a}async build(s){let t=$.join(process.cwd(),this.sfiFilePath),e=$.join(process.cwd(),this.outputDir);await ue.mkdir(e,{recursive:!0});let a={name:"write-on-end",setup(i){i.onEnd(async c=>{await Promise.all(c.outputFiles.map(async d=>{await ue.mkdir($.dirname(d.path),{recursive:!0}),await k(d.path,d.text)}))})}},r=await Be({write:!1,platform:"node",logLevel:"silent",metafile:!0,entryPoints:[t],outdir:e,bundle:!0,format:"esm",sourcemap:"inline",packages:"external",plugins:[fe({dir:e,onBuild:async i=>{await s.onBuild?.(i)}}),ce({getBuildDefs:s.getBuildDefs,outputDir:this.outputDir}),$e({tsconfigPath:$.join(process.cwd(),"tsconfig.json")}),a]});s.skipInitialBuild||await r.rebuild();let n=await this.initBuildPlugins({onBuild:()=>{s.onBuild?.({totalFiles:0,totalSize:0,schemaChanged:!1,duration:0})}});if(!s.skipInitialBuild)for(let i of n)await(await i).rebuild();return{watch:async()=>{for(let i of n)await(await i).watch();return await r.watch()},rebuild:async()=>{for(let i of n)await(await i).rebuild();await r.rebuild()},dispose:async()=>{for(let i of n)await(await i).dispose();await r.dispose()},cancel:async()=>{for(let i of n)await(await i).cancel();await r.cancel()}}}};import P from"typescript";import F from"typescript";import b from"typescript";var me=o=>(o.flags&b.TypeFlags.Object||o.flags&b.TypeFlags.NonPrimitive)&&o.getProperties().length===0&&o.getCallSignatures().length===0,C=(o,s)=>{let t=o.typeToTypeNode(s,void 0,void 0),e=!!(t&&(t.kind===b.SyntaxKind.ArrayType||t.kind===b.SyntaxKind.TupleType));return!e&&(s.getSymbol()?.getName()==="Array"||s.getBaseTypes()?.some(r=>r.getSymbol()?.getName()==="Array"))?!0:e};var w=o=>o.flags&b.TypeFlags.String||o.flags&b.TypeFlags.Number||o.flags&b.TypeFlags.Boolean||o.flags&b.TypeFlags.StringLiteral||o.flags&b.TypeFlags.NumberLiteral||o.flags&b.TypeFlags.BooleanLiteral,ye=o=>!!(o.flags&b.TypeFlags.StringLiteral||o.flags&b.TypeFlags.NumberLiteral||o.flags&b.TypeFlags.BooleanLiteral),Z=o=>!!(o.flags&b.TypeFlags.Never),J=o=>o.getCallSignatures().length>0,x=o=>{if(w(o)||!o.isUnion())return!1;let s=o.types.filter(e=>!(e.flags&b.TypeFlags.Undefined||e.flags&b.TypeFlags.Null));return s.length===0?!1:s.every(e=>e.flags&b.TypeFlags.StringLiteral||e.flags&b.TypeFlags.NumberLiteral||e.flags&b.TypeFlags.BooleanLiteral)},L=o=>o.getSymbol()?.getName()==="Promise",_=o=>{if(o.objectFlags&b.ObjectFlags.Reference){let e=o.typeArguments;if(e&&e.length>0)return e[0]}},de=o=>{if(!o.isUnion())return{type:o,wasOptional:!1};let t=o.types.filter(e=>!(e.flags&b.TypeFlags.Undefined||e.flags&b.TypeFlags.Null)).length!==o.types.length;return{type:o.getNonNullableType(),wasOptional:t}};function he(o,s){let t=s;if(t.isUnion()){let r=t.types.filter(c=>!(c.flags&b.TypeFlags.Object&&c.objectFlags&b.ObjectFlags.Reference&&c.typeArguments?.length)),n=t.types.filter(c=>c.flags&b.TypeFlags.Object&&c.objectFlags&b.ObjectFlags.Reference&&c.typeArguments?.length).map(c=>c.typeArguments[0]),i=r.filter(c=>!n.some(d=>d===c));t=o.getUnionType(i)}let e=[];if(C(o,t)||w(t)||x(t))return e;let a=[];a=t.resolvedProperties||t.getProperties()||[];for(let r of a)(r.valueDeclaration&&!(b.getCombinedModifierFlags(r.valueDeclaration)&b.ModifierFlags.Private)&&!r.getName().startsWith("#"))!==!1&&e.push(r);return e}var N=o=>{let s=o.replace(/[^0-9a-zA-Z_]/g,"_");for(;s.startsWith("_");)s=s.slice(1);return s||"JSONObject"},H=o=>!!o.getSymbol()?.getDeclarations()?.some(s=>s.getSourceFile().fileName.includes("@repeaterjs"));import v from"typescript";var Q=class{checker;schema;program;typesNameMap=new Map;inputsNameMap=new Map;unions=[];enums=[];constructor(s,t,e){this.checker=s,this.schema=t,this.program=e}getExistingTypeByName(s,t){for(let[e,a]of t.entries())if(a===s)return e}getUniqueName(s,t,e,a){let r=t,n=1;for(;;){let i=this.getExistingTypeByName(r,e);if(!i)break;if(this.checker.isTypeAssignableTo(s,i)&&this.checker.isTypeAssignableTo(i,s))return r;let c=`_${n}`;r=a?a(c):`${t}${c}`,n++}return r}isTypeSymbol(s){return s?!!(s.flags&(v.SymbolFlags.TypeAlias|v.SymbolFlags.Interface|v.SymbolFlags.Class|v.SymbolFlags.Enum|v.SymbolFlags.Type)):!1}getTypeDefinition=(s,t={isInputType:!1,dryRun:!1})=>{let{type:e,wasOptional:a}=de(s);if(e.flags&v.TypeFlags.Void||e.flags&v.TypeFlags.Undefined||e.flags&v.TypeFlags.Null)return{name:"Void",isList:!1,isRequired:!1};if(e.flags&v.TypeFlags.Any||Z(e))return{name:Z(e)?"JSONObject":"Any",isList:!1,isRequired:t.isRequired!==void 0?t.isRequired:!a};if(H(e)){let f=this.checker.getTypeArguments(e)[0];if(f)return this.getTypeDefinition(f,t)}if(L(e)){let f=_(e);if(f)return this.getTypeDefinition(f,t)}let r=t.isRequired!==void 0?t.isRequired:!a;if(me(e))return{name:"JSONObject",isList:!1,isRequired:r};let n=t.isInputType?this.inputsNameMap:this.typesNameMap;if(n.has(e))return{name:n.get(e),isList:!1,isRequired:r};let i=e.aliasSymbol?.escapedName?.toString()||e.symbol?.escapedName.toString();if(i==="__type"||i==="__object"||!i){let f=e.aliasSymbol||e.symbol;if(f){let l=f.getDeclarations();if(l)for(let u of l){if(u.name){i=u.name.escapedText?.toString();break}let m=u.parent;for(;m;){if((v.isVariableDeclaration(m)||v.isPropertyDeclaration(m)||v.isPropertySignature(m)||v.isParameter(m)||v.isPropertyAssignment(m))&&v.isIdentifier(m.name)){i=m.name.escapedText.toString();break}m=m.parent}if(i)break}}}let c=t.propertyName;(i==="__type"||i==="__object"||!i||t.isInputType&&c&&!e.aliasSymbol)&&!w(e)&&!(i&&this.schema.scalars.includes(i))&&c&&(i=c.charAt(0).toUpperCase()+c.slice(1));let d=f=>{let l=f.aliasSymbol||f.symbol;if(!l)return!1;let u=l.getDeclarations();return u?u.some(m=>{let T=m.getSourceFile();return this.program.isSourceFileDefaultLibrary(T)||T.fileName.includes("node_modules/typescript/lib")}):!1};if(i){let f=e,l=this.checker.getTypeArguments(f);l.length===0&&e.aliasTypeArguments&&(l=e.aliasTypeArguments);let u=d(e),m=!!e.aliasSymbol,T=m&&!u;if(l.length>0&&!T&&(!e.aliasSymbol||e.aliasSymbol.escapedName.toString()!==i||e.aliasTypeArguments)){let h=l;u&&m&&(h=l.filter((g,D)=>D===0?!0:!(ye(g)||x(g))));let y=h.map(g=>this.getTypeDefinition(g,{...t,dryRun:t.dryRun}).name).join("");u&&m?i=y:i.startsWith(y)||(i=`${y}${i}`)}i=N(i),i=i.charAt(0).toUpperCase()+i.slice(1)}if(i==="JsonValue"||i==="JsonObject")return{name:"JSON",isList:!1,isRequired:r};if(i==="JsonArray")return{name:"JSON",isList:!0,isRequired:!0,isListRequired:r};if(i&&!this.schema.scalars.includes(i)){t.isInputType&&!i.endsWith("Input")&&!x(e)&&(i=`${i}Input`);let f;if(e.aliasTypeArguments||e.typeArguments){let l=e,u=this.checker.getTypeArguments(l);if(u.length===0&&e.aliasTypeArguments&&(u=e.aliasTypeArguments),u.length>0){let m=u[0],h=this.getTypeDefinition(m,{...t,dryRun:t.dryRun}).name;if(i.startsWith(h)){let p=i.slice(h.length);f=y=>`${h}${y}${p}`}}}i=this.getUniqueName(e,i,n,f)}if(i&&this.schema.scalars.includes(i))return{name:i,isList:!1,isRequired:r};if(n.has(e))return{name:n.get(e),isList:!1,isRequired:r};if(C(this.checker,e)){let f=this.checker.getIndexTypeOfType(e,v.IndexKind.Number);if(f){let l=this.getTypeDefinition(f,t);return{name:l.name,isList:!0,isRequired:l.isRequired,isListRequired:r}}}else if(x(e)){let f=this.checker.typeToTypeNode(e,void 0,void 0),u=e.types.map(m=>{if(m.isLiteral()){let T=m.value?.toString();if(!T)throw new Error("Enum member name is undefined");return N(T)}throw new Error("Invalid type for enum member")});u.length>0&&(i=i||f.typeName?.symbol?.escapedName,i||(i=u.join("_").toUpperCase(),i=t.isInputType?`${i}Input`:i),t.dryRun||this.enums.find(m=>m.name===i)||(this.enums.push({name:i,values:u,rawType:e}),this.typesNameMap.set(e,i),this.inputsNameMap.set(e,i)))}else if(w(e)){let f=this.checker.typeToString(e);return e.flags&v.TypeFlags.StringLiteral?f="String":e.flags&v.TypeFlags.NumberLiteral?f="Number":e.flags&v.TypeFlags.BooleanLiteral?f="Boolean":e.flags&v.TypeFlags.String?f="String":e.flags&v.TypeFlags.Number?f="Number":e.flags&v.TypeFlags.Boolean&&(f="Boolean"),{name:N(f),isList:!1,isRequired:r}}else if(e.isIntersection()){let l=e.types.map(u=>this.getTypeDefinition(u,t).name);i=N(i||l.join("And"))}else if(e.isUnion()){let f=e.types,l=e.types.length===f.length,u=f.some(p=>{let y=C(this.checker,p)?this.checker.getIndexTypeOfType(p,v.IndexKind.Number):p;return y?w(y)||x(y):!0}),m=[...new Set(f.map(p=>this.getTypeDefinition(p,{...t,isRequired:l})))],T=m.filter(p=>p.isList);for(let p of T){let y=m.findIndex(g=>g.name===p.name&&!g.isList);y>-1&&m.splice(y,1)}let h=m.map(p=>p.name);if(i=N(i||h.join("Or")),i&&(i=this.getUniqueName(e,i,n)),m.length>1&&!t.isInputType&&!u)t.dryRun||this.unions.find(p=>p.name===i)||this.unions.push({name:i,types:h,rawType:e});else{if(m.some(g=>g.name==="JSON"||g.name==="JSONObject"||g.name==="Any"))return{name:"JSON",isList:!1,isRequired:r};let p=m[0];if(!p)throw new Error("Cannot get type definition");let y=m.some(g=>g.isList&&g.name===p.name);return{name:p.name,isList:y,isRequired:r}}}else if(J(e)){let l=e.getCallSignatures()[0]?.getReturnType();if(l&&L(l)){let u=_(l);u&&(l=u)}if(l)return this.getTypeDefinition(l,t)}return i||(i="JSONObject"),t.dryRun||n.set(e,i),{name:i,isList:!1,isRequired:r}};getUnions(){return this.unions}getEnums(){return this.enums}typeDefinitionToGraphQLType=s=>{let t=s.name,{isList:e,isRequired:a,isListRequired:r}=s;return a&&(t=`${t}!`),e&&(t=`[${t}]`,r&&(t=`${t}!`)),t}};import X from"consola";var G=class{schema;checker;program;sfiFile;typeDefinitionBuilder;constructor(s,t,e){this.schema={types:[],inputs:[],interfaces:[],unions:[],enums:[],scalars:["ID","Int","Float","Number","Any","Void","JSONObject","File","Date","JSON","String","Boolean"]},this.checker=s,this.sfiFile=t,this.program=e,this.typeDefinitionBuilder=new Q(s,this.schema,e)}parse(s){let t=this.makeReferenceSchema(s);for(let[e,a]of t.types){let r;s.Query===e?r="Query":s.Mutation===e?r="Mutation":s.Subscription===e&&(r="Subscription"),this.processSchemaReference(e,a,r,"types")}for(let[e,a]of t.inputs)this.processSchemaReference(e,a,void 0,"inputs");this.extractForbiddenFieldNamesFromSchema(),this.schema.unions=this.typeDefinitionBuilder.getUnions().map(e=>({...e,description:this.getTypeDocumentation(e.rawType)})),this.schema.enums=this.typeDefinitionBuilder.getEnums().map(e=>({...e,description:this.getTypeDocumentation(e.rawType)})),this.schema.types=this.schema.types.filter(e=>!this.schema.enums.find(a=>a.name===e.name)),this.schema.inputs=this.schema.inputs.filter(e=>!this.schema.enums.find(a=>a.name===e.name)),this.schema.unions.forEach(e=>{let a=this.checkIfInterfaceIsPossibleForUnion(e,this.schema.types);a&&(this.schema.interfaces.push(a),this.schema.unions=this.schema.unions.filter(r=>r.name!==e.name),this.schema.types.map(r=>{if(e.types.includes(r.name))return r.implements||(r.implements=[]),r.implements.push(a.name),r}))});for(let[e,a]of t.inheritanceMap){let r=N(this.checker.typeToString(e)),n=`I${r}`,i=this.schema.types.find(c=>c.name===r);if(i){let c=this.schema.interfaces.find(f=>f.name===n);if(!c){c={name:n,description:i.description,fields:[...i.fields],implements:[],__resolveType:void 0};let f=e.getBaseTypes();f&&f.forEach(l=>{let m=`I${N(this.checker.typeToString(l))}`;if(t.inheritanceMap.has(l))c.implements.push(m);else{let T=l.getSymbol();if(T){for(let[h]of t.inheritanceMap)if(h.getSymbol()===T){c.implements.push(m);break}}}}),this.schema.interfaces.push(c)}i.implements||(i.implements=[]),i.implements.includes(n)||i.implements.push(n);let d=f=>{for(let l of f){let u=N(this.checker.typeToString(l)),m=this.schema.types.find(h=>h.name===u);m&&(m.implements||(m.implements=[]),m.implements.includes(n)||m.implements.push(n));let T=t.inheritanceMap.get(l);if(!T){let h=l.getSymbol();if(h){for(let[p,y]of t.inheritanceMap)if(p.getSymbol()===h){T=y;break}}}T&&d(T)}};d(a),this.schema.types.forEach(f=>{f.fields.forEach(l=>{l.type.name===r&&(l.type.name=n)})})}}for(let[e,a]of t.classImplementsMap){this.schema.types.map(r=>{let n=this.schema.types.find(i=>i.rawType===e);return n&&(n.implements=Array.from(new Set([...n.implements||[],...a.map(i=>this.checker.typeToString(i))]))),r});for(let r of a){let n=this.schema.types.find(i=>i.rawType===r);n&&(this.schema.interfaces.push({name:this.checker.typeToString(r),description:this.getTypeDocumentation(r),fields:n.fields}),this.schema.types=this.schema.types.filter(i=>i.rawType!==r))}}this.schema.types=this.schema.types.map(e=>((e.implements||this.schema.unions.find(a=>a.types.includes(e.name)))&&(e.fields=e.fields.filter(a=>a.type.name!=="Void")),e)),this.schema.unions=this.schema.unions.map(e=>({...e,__resolveType:this.getResolveTypeForUnionOrInterface(e,this.schema.types)})),this.schema.interfaces=this.schema.interfaces.map(e=>({...e,__resolveType:this.getResolveTypeForUnionOrInterface(e,this.schema.types)}))}checkIfInterfaceIsPossibleForUnion(s,t){let e=s.types.map(n=>{let i=t.find(c=>c.name===n);if(!i)throw new Error(`Type ${n} not found`);return i}),r=e[0].fields.filter(n=>e.every(i=>i.fields.some(c=>JSON.stringify(c)===JSON.stringify(n))));return r.length>0?{name:s.name,description:s.description,fields:r}:null}getResolveTypeForUnionOrInterface(s,t){let e="types"in s?t.filter(i=>s.types.includes(i.name)):t.filter(i=>i.implements?.includes(s.name));e.sort((i,c)=>c.fields.length-i.fields.length);let a=new Map;e.forEach(i=>{let c=i.fields.map(d=>d.name).sort().join(", ");if(a.has(c)){let d=a.get(c);X.warn(`Warning: Union types "${i.name}" and "${d?.name}" have the same fields: [${c}]. Consider differentiating these types by adding unique fields or using different type names. This may cause ambiguity in type resolution.`)}else a.set(c,i)});let n=`function resolveType(node) { if (node && typeof node === 'object') { ${e.map(i=>`if (${i.fields.map(f=>`"${f.name}" in node`).join(" && ")}) {return '${i.name}'};`).join(" ")} } }`;return new Function("return "+n)()}toString(){let{typeDefinitionToGraphQLType:s}=this.typeDefinitionBuilder,t=a=>a?`""" ${a} """ `:"",e="";for(let a of this.schema.inputs){e+=t(a.description),e+=`input ${a.name} { `,a.fields.length===0&&(e+=` _ : String `);for(let r of a.fields)e+=`${t(r.type.description)}`,e+=` ${r.name}: ${s(r.type)} `;e+=`} `}for(let a of this.schema.types)if(a.fields.length!==0){e+=t(a.description),e+=`type ${a.name}`,a.implements&&(e+=` implements ${[...a.implements].sort((r,n)=>r.localeCompare(n)).join(" & ")}`),e+=` { `;for(let r of a.fields){let n="";r.args.length>0&&(n=`(${r.args.map(i=>`${t(i.type.description)}${i.name}: ${s(i.type)}`).join(", ")})`),e+=`${t(r.type.description)}`,e+=`${r.name}${n}: ${s(r.type)} `}e+=`} `}for(let a of this.schema.unions)e+=t(a.description),e+=`union ${a.name} = ${a.types.join(" | ")} `;for(let a of this.schema.interfaces){e+=t(a.description),e+=`interface ${a.name}`,a.implements&&a.implements.length>0&&(e+=` implements ${[...a.implements].sort((r,n)=>r.localeCompare(n)).join(" & ")}`),e+=` { `;for(let r of a.fields)e+=`${t(r.type.description)}`,e+=`${r.name}: ${s(r.type)} `;e+=`} `}for(let a of this.schema.scalars)e+=`scalar ${a} `;for(let a of this.schema.enums){e+=t(a.description),e+=`enum ${a.name} { `;for(let r of a.values)e+=` ${r} `;e+=`} `}return e}getSchema(){return this.schema}getResolvers(){let s={};for(let t of this.schema.unions)s[t.name]={__resolveType:t.__resolveType};for(let t of this.schema.interfaces)s[t.name]={__resolveType:t.__resolveType};return s}processSchemaReference(s,t,e,a="types"){let{getTypeDefinition:r}=this.typeDefinitionBuilder,n=a==="inputs",i=r(s,{isInputType:n}),c=e||i.name,d=this.schema[a].find(f=>f.name===c);if(d){if(d.fields.length>0)return}else{if(this.schema.scalars.includes(c))return;this.schema[a].push({name:c,description:this.getTypeDocumentation(s),fields:[],rawType:C(this.checker,s)&&(s.getNumberIndexType()||s.getStringIndexType())||s}),d=this.schema[a][this.schema[a].length-1]}for(let[f,l]of Object.entries(t)){let u=l.returnType,m=r(u,{isInputType:n,propertyName:f});if(a==="types"){let T={name:f,type:{...m,description:this.getSymbolDocumentation(l.symbol)},args:[]};if(l.args)for(let[h,p]of Object.entries(l.args)){let y=p,g=r(y.type,{isInputType:!0,propertyName:f+h.charAt(0).toUpperCase()+h.slice(1),isRequired:p.isRequired});this.schema.scalars.includes(this.checker.typeToString(y.type))&&(g.name=this.checker.typeToString(y.type)),T.args.push({name:h,type:{...g,description:y.documentation}})}d.fields.push(T)}else if(a==="inputs"){let T={name:f,type:{...m,description:this.getTypeDocumentation(u)}};d.fields.find(h=>h.name===T.name)||d.fields.push(T)}}}getSymbolDocumentation(s){let t="";t+=F.displayPartsToString(s.getDocumentationComment(this.checker));let e=s.getJsDocTags(this.checker).map(a=>`@${a.name} ${F.displayPartsToString(a.text)}`).join(` `);return e&&(t+=` `+e),t}getTypeDocumentation=s=>{let t=s.getSymbol();return t?this.getSymbolDocumentation(t):""};extractForbiddenFieldNamesFromSchema(){let s=/^[_A-Za-z][_0-9A-Za-z]*$/,t=e=>s.test(e)?e.startsWith("__"):!0;for(let e of this.schema.types)e.fields=e.fields.filter(a=>!t(a.name));for(let e of this.schema.inputs)e.fields=e.fields.filter(a=>!t(a.name))}makeReferenceSchema(s){let t={types:new Map,inputs:new Map,classImplementsMap:new Map,inheritanceMap:new Map},e=(n,i={},c="types",d=[])=>{if(t[c].has(n))return;if(H(n)){let l=this.checker.getTypeArguments(n)[0];e(l,i,c,[...d,"REPEATER_ITEM"]);return}if(this.checker.typeToString(n)!=="[]"&&!this.schema.scalars.includes(this.checker.typeToString(n))&&!w(n)){if(L(n)){if(c==="inputs")return;let l=_(n);l&&e(l,i,c,[...d,"PROMISE"]);return}if(n.getSymbol()?.flags&F.SymbolFlags.Class){let l=n.getBaseTypes();l&&l.forEach(u=>{u.getSymbol()?.flags&F.SymbolFlags.Class&&(t.inheritanceMap.has(u)||t.inheritanceMap.set(u,[]),t.inheritanceMap.get(u).push(n),e(u))})}if(n.isUnion())if(x(n))t[c].has(n)||t[c].set(n,{}),e(n,i,c,[...d,"ENUM"]);else if(c==="types")n.types.forEach(l=>{l.flags&F.TypeFlags.Null||l.flags&F.TypeFlags.Undefined||w(l)||e(l,i,c,[...d,l.symbol?.getName()||`N/A ${this.checker.typeToString(l)}`])});else{let l=n.getNonNullableType();l.isUnion()&&!w(l)&&(X.warn(`Warning: Union types in input fields are not supported yet. Defaulting to the first type (${this.checker.typeToString(l)}) at path: ${d.join(" > ")}`),l=l.types[0]),e(l,i,c,[...d,"NON_NULLABLE"])}else if(J(n)){if(c==="inputs")return;if(!i.parentType)throw new Error("Cannot have a function without a parent type");let l=n.getCallSignatures()[0],u=l?.getParameters()||[],m=l?.getReturnType(),T=t[c].get(i.parentType)[i.propetyName];u.forEach(h=>{let p=this.checker.getTypeOfSymbolAtLocation(h,this.sfiFile);if(this.checker.isTupleType(p))p.target.labeledElementDeclarations.forEach((D,Se)=>{let ie=this.checker.getTypeAtLocation(D),se=D.name.text,ve=this.checker.getSymbolAtLocation(D),we=this.getSymbolDocumentation(ve||h);T.args[se]={type:ie,isRequired:D.initializer===void 0?void 0:!1,documentation:we},e(ie,{parentType:n},"inputs",[...d,se])});else if(h.valueDeclaration&&F.isParameter(h.valueDeclaration)&&h.valueDeclaration.dotDotDotToken)X.warn(`Warning: Rest parameters without explicit names are not supported. Skipping rest parameter at path: ${d.join(" > ")}. Unsupported: \`function example(...args: any[]) { }\`. Supported: \`function example(...namedArgs: [first: string, second: number]) { }\`. Please provide named rest parameters to ensure proper type resolution.`);else{let y=h.valueDeclaration;T.args&&(T.args[h.escapedName]={type:p,isRequired:y.initializer===void 0?void 0:!1,documentation:this.getSymbolDocumentation(h)},e(p,{parentType:n},"inputs",[...d,h.escapedName]))}}),m&&e(m,i,c,[...d,"RETURN_TYPE"])}else if(C(this.checker,n)){let l=this.checker.getIndexTypeOfType(n,F.IndexKind.Number);l&&!w(l)&&(t[c].has(n)||t[c].set(n,{}),e(l,i,c,[...d,"ITEM_TYPE"]))}else if(!w(n)){let l=he(this.checker,n);t[c].has(n)||t[c].set(n,{}),l.forEach(u=>{let m=this.checker.getTypeOfSymbolAtLocation(u,this.sfiFile);t[c].get(n)[u.escapedName]||(t[c].get(n)[u.escapedName]={symbol:u,returnType:m,args:{}}),e(m,{propetyName:u.escapedName,parentType:n},c,[...d,u.escapedName])})}}};s.Query&&e(s.Query),s.Mutation&&e(s.Mutation),s.Subscription&&e(s.Subscription);let a=this.program.getSourceFiles();for(let n of a)n.isDeclarationFile||F.forEachChild(n,i=>{if(F.isClassDeclaration(i)||F.isInterfaceDeclaration(i)){let c=this.checker.getTypeAtLocation(i),d=i.heritageClauses;d&&d.forEach(f=>{f.types.forEach(l=>{let u=this.checker.getTypeAtLocation(l),m=u,T=u.getSymbol();if(T){for(let y of t.inheritanceMap.keys())if(y.getSymbol()===T){m=y;break}}t.inheritanceMap.has(m)||t.inheritanceMap.set(m,[]);let h=t.inheritanceMap.get(m),p=c.getSymbol();p&&!h.some(y=>y.getSymbol()===p)&&h.push(c)})})}});let r=!0;for(;r;){r=!1;for(let[n,i]of t.inheritanceMap){let c=t.types.has(n);if(!c){let f=n.getSymbol();if(f){for(let l of t.types.keys())if(l.getSymbol()===f){c=!0;break}}}let d=!1;for(let f of i){if(t.types.has(f)){d=!0;break}let l=f.getSymbol();if(l){for(let u of t.types.keys())if(u.getSymbol()===l){d=!0;break}}if(d)break}if(c)for(let f of i){let l=t.types.has(f);if(!l){let u=f.getSymbol();if(u){for(let m of t.types.keys())if(m.getSymbol()===u){l=!0;break}}}l||(e(f),r=!0)}else d&&(e(n),r=!0)}}return t}};import A from"path";var z=class{program;checker;sfiFile;sfi;sfiFilePath;constructor(s){this.sfiFilePath=s;let t=this.loadTsConfigOptions(),e=P.sys.readDirectory(A.dirname(this.sfiFilePath),[".ts"],[".d.ts"]).concat([A.join(A.dirname(this.sfiFilePath),"..","pylon.d.ts")]);this.program=P.createProgram(e,t),this.checker=this.program.getTypeChecker(),this.loadSfi()}loadSfi(){let t=this.program.getSourceFiles().find(n=>A.resolve(n.fileName)===this.sfiFilePath);if(!t)throw new Error("Could not find index.ts (pylon entrypoint)");this.sfiFile=t;let e=this.checker.getSymbolAtLocation(t),r=this.checker.getExportsOfModule(e).find(n=>n.escapedName==="graphql");if(!r)throw new Error("Could not find graphql export");this.sfi=r}loadTsConfigOptions(){let s={target:P.ScriptTarget.ESNext,module:P.ModuleKind.CommonJS,strict:!0,esModuleInterop:!0,skipLibCheck:!1,forceConsistentCasingInFileNames:!0,noImplicitAny:!0,experimentalDecorators:!0},t=P.findConfigFile(A.dirname(this.sfiFilePath),P.sys.fileExists,"tsconfig.json");if(!t)return console.log("Could not find tsconfig.json"),s;let e=P.readConfigFile(t,P.sys.readFile);return e.error?(console.log("Could not read tsconfig.json",e.error),s):P.parseJsonConfigFileContent(e.config,P.sys,A.dirname(t)).options}build(){let s=this.checker.getTypeOfSymbolAtLocation(this.sfi,this.sfiFile),t=s.getProperty("Query"),e=s.getProperty("Mutation"),a=s.getProperty("Subscription"),r=t?this.checker.getTypeOfSymbolAtLocation(t,this.sfiFile):void 0,n=e?this.checker.getTypeOfSymbolAtLocation(e,this.sfiFile):void 0,i=a?this.checker.getTypeOfSymbolAtLocation(a,this.sfiFile):void 0,c=new G(this.checker,this.sfiFile,this.program);return c.parse({Query:r,Mutation:n,Subscription:i}),{typeDefs:c.toString(),schema:c.getSchema(),resolvers:c.getResolvers()}}};var ee=async o=>await new q(o.sfiFilePath,o.outputFilePath).build({getBuildDefs:()=>{let e=new z(Le.join(process.cwd(),o.sfiFilePath)).build();return{typeDefs:e.typeDefs,resolvers:e.resolvers}},onBuild:o.onBuild,skipInitialBuild:o.skipInitialBuild});import{generateClient as _e}from"@gqty/cli";import Me from"esbuild";import W from"fs/promises";import{buildSchema as Ue}from"graphql";import K from"path";var ge=K.join(process.cwd(),".pylon/schema.graphql"),M=K.join(process.cwd(),".pylon/client/index.ts"),te=async({schemaChanged:o})=>{try{await W.access(ge)}catch{throw new Error("Schema not found. Please run `pylon build` or `pylon dev` first.")}if(!o)try{await W.access(M);return}catch{}let s=await W.readFile(ge,"utf-8"),t=Ue(s);await W.mkdir(K.dirname(M),{recursive:!0}),await k(M,qe),await _e(t,{endpoint:"will-be-overwritten",frameworks:["react"],destination:M,react:!0,scalarTypes:{Number:"number",JSONObject:"Record<string, unknown>"}}),await Me.build({entryPoints:[M],bundle:!0,outfile:K.join(process.cwd(),".pylon/client/index.js"),packages:"external",format:"esm",platform:"node"})},qe=`/** * GQty: You can safely modify this file based on your needs. */ import {createReactClient} from '@gqty/react' import { Cache, createClient, defaultResponseHandler, type QueryFetcher } from 'gqty' import { generatedSchema, scalarsEnumsHash, type GeneratedSchema } from './schema.generated' const queryFetcher: QueryFetcher = async function ( {query, variables, operationName}, fetchOptions ) { const headers = new Headers({}); let fetchToUse: typeof fetch | typeof app.request = fetch try { // 1. Try importing Pylon \u2014 if this works, we're on the server const moduleNameToPreventBundling = '@getcronit/pylon' const { app, getContext } = await import(moduleNameToPreventBundling) fetchToUse = app.request // 2. Get headers from the original server request and forward them const context = getContext() for (const [key, value] of context.req.raw.headers.entries()) { headers.append(key, value) // Set Accept-Encoding header to identity so the internal fetch returns JSON headers.set('Accept-Encoding', 'identity') } } catch { // 3. Pylon not available \u2014 fallback to default fetch (runs in browser) // No additional headers are needed; browser sends cookies automatically } const formData = buildGraphQLMultipartForm(query, variables); const response = await fetchToUse('/graphql', { method: 'POST', headers, body: formData, mode: 'cors', ...fetchOptions }) return await defaultResponseHandler(response) } function buildGraphQLMultipartForm(query, variables) { const form = new FormData(); const operations = { query, variables: structuredClone(variables) }; const map = {}; const files = []; let fileIndex = 0; // Helper to find all files in variables function recurse(value, path = []) { if (value instanceof File || value instanceof Blob) { map[fileIndex] = [\`variables.\${path.join(".")}\`]; set(operations.variables, path, null); files.push({ index: fileIndex, file: value }); fileIndex++; } else if (Array.isArray(value)) { value.forEach((item, i) => recurse(item, [...path, i])); } else if (value && typeof value === "object") { Object.entries(value).forEach(([key, val]) => recurse(val, [...path, key]) ); } } recurse(variables); form.append("operations", JSON.stringify(operations)); form.append("map", JSON.stringify(map)); files.forEach(({ index, file }) => { form.append(index, file); }); return form; } // Utility to set a value at a path inside an object function set(obj, path, value) { let curr = obj; for (let i = 0; i < path.length - 1; i++) { curr = curr[path[i]]; } curr[path[path.length - 1]] = value; } export const cache = new Cache( undefined, /** * Default option is immediate cache expiry but keep it for 5 minutes, * allowing soft refetches in background. */ { maxAge: Infinity, staleWhileRevalidate: 5 * 60 * 1000, normalization: true } ) export const client = createClient<GeneratedSchema>({ schema: generatedSchema, scalars: scalarsEnumsHash, cache, fetchOptions: { fetcher: queryFetcher } }) export const pageClient = () => { const client = createClient<GeneratedSchema>({ schema: generatedSchema, scalars: scalarsEnumsHash, cache: new Cache( undefined, { maxAge: Infinity, staleWhileRevalidate: 5 * 60 * 1000, normalization: true } ), fetchOptions: { fetcher: queryFetcher } }) const react = createReactClient(client, { defaults: { suspense: false } }) return {client, ...react, pageClient} } // Core functions export const {resolve, subscribe, schema} = client // Legacy functions export const {query, mutation, mutate, subscription, resolved, refetch, track} = client export const { graphql, useQuery, usePaginatedQuery, useTransactionQuery, useLazyQuery, useRefetch, useMutation, useMetaState, prepareReactRender, useHydrateCache, prepareQuery } = createReactClient<GeneratedSchema>(client, { defaults: { // Enable Suspense, you can override this option for each hook. suspense: false } }) export * from './schema.generated'`;import{execSync as Je,spawnSync as He}from"child_process";function be(o,s){if(process.platform==="win32"){Je("taskkill /pid "+o+" /T /F");return}Ge(o).forEach(function(e){Te(e,s)}),Te(o,s)}function Qe(){let o=He("ps",["-A","-o","pid,ppid"],{encoding:"utf-8",stdio:"pipe"});return o.error||!o.stdout?[]:o.stdout.trim().split(` `).slice(1).map(function(t){let e=t.match(/\s*(\d+)\s*(\d+)/);return e===null?null:{pid:Number(e[1]),ppid:Number(e[2])}}).filter(t=>t!=null)}function Ge(o){let s=Qe(),t={},e=[];s.forEach(function(r){t[r.ppid]=t[r.ppid]||[],t[r.ppid].push(r.pid)});let a=function(r){t[r]=t[r]||[],t[r].forEach(function(n){e.push(n),a(n)})};return a(o),e}function Te(o,s){try{process.kill(o,s)}catch(t){if(t.code!=="ESRCH")throw t}}We.config();V.name("pylon-dev").description("Pylon Development CLI").version(ne);V.command("build").description("Build the Pylon Schema").action(async()=>{let o=await ee({sfiFilePath:"./src/index.ts",outputFilePath:"./.pylon",onBuild:async({totalFiles:t,totalSize:e,duration:a,schemaChanged:r})=>{try{I.capture({distinctId:j,event:"build completed",properties:{duration:a,totalFiles:t,totalSize:e,schemaChanged:r,dependencies:R,isDevelopment:!1,$session_id:E}}),await te({schemaChanged:r})}catch(n){O.error("Error during build callback",n)}}}),s=async()=>{await o.dispose(),process.exit(0)};process.on("SIGINT",s),process.on("SIGTERM",s),process.on("SIGHUP",s),await o.rebuild(),await o.dispose()});V.command("dev").description("Start the Pylon Development Server").option("-c, --command <command>","Command to run the server","bun run .pylon/index.js").action(async o=>{let s=null,t=async()=>{if(s&&s.pid){try{be(s.pid)}catch(a){O.error("Failed to kill server process",a)}s=null}},e=null;await new Promise(async(a,r)=>{try{e=await ee({sfiFilePath:"./src/index.ts",outputFilePath:"./.pylon",onBuild:async({schemaChanged:i,totalFiles:c,totalSize:d,duration:f})=>{try{await te({schemaChanged:i}),await t(),s=await Ke(o.command),I.capture({distinctId:j,event:"build completed",properties:{duration:f,totalFiles:c,totalSize:d,schemaChanged:i,dependencies:R,pylonConfig:await Y(),isDevelopment:!0,$session_id:E}})}catch(l){O.error("Error during dev build callback",l)}},skipInitialBuild:!0}),await e.watch(),O.box(`Pylon is up and running! Press \`Ctrl + C\` to stop the server. Encounter any issues? Report them here: https://github.com/getcronit/pylon/issues We value your feedback\u2014help us make Pylon even better!`);let n=async()=>{e&&await e.dispose(),await t(),process.exit(0)};process.on("SIGINT",n),process.on("SIGTERM",n),process.on("SIGHUP",n),process.on("exit",()=>t()),I.capture({distinctId:j,event:"dev server started",properties:{command:o.command,dependencies:R,pylonConfig:await Y(),$session_id:E}})}catch(n){e&&await e.dispose(),await t(),r(n)}})});var Ke=async o=>{let[s,...t]=o.split(" "),e=ze(s,t,{stdio:"inherit",env:{...process.env,NODE_ENV:"development",FORCE_COLOR:"1"}});return e.on("error",a=>{O.error(a)}),e};try{await V.parseAsync(process.argv)}catch(o){O.error(o),I.captureException(o,j,{$session_id:E,dependencies:R})}finally{await I.shutdown()} //# sourceMappingURL=index.js.map