UNPKG

@syncify/codegen

Version:

Shopify GraphQL codegen handling for the sane developer.

9 lines (6 loc) 11.5 kB
var D=Object.create;var N=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var h=(t,o,i,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of C(o))!$.call(t,n)&&n!==i&&N(t,n,{get:()=>o[n],enumerable:!(s=I(o,n))||s.enumerable});return t};var k=(t,o,i)=>(i=t!=null?D(P(t)):{},h(o||!t||!t.__esModule?N(i,"default",{value:t,enumerable:!0}):i,t)),b=t=>h(N({},"__esModule",{value:!0}),t);var V={};module.exports=b(V);var A=require("@graphql-codegen/typescript"),x=require("prettier"),e=k(require("typescript")),g=require("@syncify/ansi"),S=new Set(["string","number","boolean","null","undefined","any","never","unknown","Array"]),M=["DisplayableError","PageInfo","UserError","Node","Maybe"],R={ID:"string",String:"string",URL:"string",Date:"string",DateTime:"string",Color:"string",UnsignedInt64:"string",UtcOffset:"string",Decimal:"string",Money:"string",FormattedString:"string",HTML:"string",Int:"number",Float:"number",BigInt:"number",Boolean:"boolean",ARN:"any",StorefrontID:"any",JSON:"Record<string, any>"};function E(t){return Array.from(new Set([...M,...t]))}var w={plugin:async(t,o,i,s)=>{let n=(0,g.Create)().Break().Top("Generating Types").Newline().toLog({clear:!0});i.pickTypes=E(i.pickTypes);try{let a=await(0,A.plugin)(t,o,{skipTypename:i?.skipTypeName??!0},s),{transformedContent:r,typeLiterals:c,includedTypes:y}=await U(a.content,i,n);return c.length>0&&s?.outputFile&&q(c,s.outputFile,n),z(y.size,n),{content:r}}catch(a){throw n.Error(`Failed to generate types: ${a instanceof Error?a.message:String(a)}`),a}}};async function U(t,o,i){let s=e.default.createSourceFile("temp.ts",t,e.default.ScriptTarget.Latest,!0);i.Line(`Base TypeScript output generated (${t.length} chars)`);let{typeMap:n,enumNames:a,typeLiterals:r}=F(s,i),c=v(n,o,i),y=Q(n,c,a,s,i),f=J(y,s,i);return f=G(f,i),f=O(f,i),{transformedContent:await(0,x.format)(`/* eslint-disable no-use-before-define */ `+f,{parser:"typescript",tabWidth:2,printWidth:120,singleQuote:!0,useTabs:!1}),typeLiterals:r,includedTypes:c}}function F(t,o){let i=new Map,s=new Set,n=[];function a(r){if(e.default.isTypeAliasDeclaration(r)||e.default.isInterfaceDeclaration(r)){let c=r.name?.text;c&&(i.set(c,r),n.push(c),o.Line(`Found type: ${c} (${e.default.isInterfaceDeclaration(r)?"interface":"type alias"})`))}else e.default.isEnumDeclaration(r)&&r.name&&(s.add(r.name.text),o.Line(`Found enum: ${r.name.text} - will be replaced with 'string'`));e.default.forEachChild(r,a)}return a(t),{typeMap:i,enumNames:s,typeLiterals:n}}function v(t,o,i){let s=new Map,n=o.depthInclusion||1/0;o.pickTypes.forEach(r=>s.set(r,0));function a(r,c){if(c>n)return;function y(f,p){if(!t.has(f)||S.has(f))return;let l=s.get(f);if(l===void 0||l>p){s.set(f,p),i.Line(`Including ${f} at depth ${p}`);let m=t.get(f);m&&(p<n||o.pickTypes.includes(f))&&a(m,p)}}e.default.isTypeReferenceNode(r)&&e.default.isIdentifier(r.typeName)?y(r.typeName.text,c+1):e.default.isArrayTypeNode(r)?a(r.elementType,c):e.default.isUnionTypeNode(r)||e.default.isIntersectionTypeNode(r)?r.types.forEach(f=>a(f,c)):e.default.isParenthesizedTypeNode(r)&&a(r.type,c),e.default.forEachChild(r,f=>a(f,c))}return o.pickTypes.forEach(r=>{t.has(r)?a(t.get(r),0):i.Warn(`Type ${r} not found in source`)}),s}function Q(t,o,i,s,n){let a=[],r=j(i,s,n);return o.forEach((c,y)=>{let f=t.get(y);if(!f){n.Warn(`Type ${y} not found in typeMap`);return}a.push(B(f,y,r,s,n))}),H(t.get("QueryRoot"),a,r,s,n),_(a,o,s,n)}function j(t,o,i){return function s(n){if(i.Line(`Visiting type node: ${n.getText(o)}`),e.default.isTypeReferenceNode(n)&&e.default.isIdentifier(n.typeName)){let a=n.typeName.text;if(a==="Maybe"&&n.typeArguments?.length)return i.Line(`Unwrapping Maybe<${n.typeArguments[0].getText(o)}>`),s(n.typeArguments[0]);if(t.has(a))return i.Line(`Replacing enum ${a} with 'string'`),e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.StringKeyword)}if(e.default.isArrayTypeNode(n)){let a=s(n.elementType);if(a!==n.elementType)return e.default.factory.createArrayTypeNode(a)}else if(e.default.isUnionTypeNode(n)){let a=n.types.map(s),r=a.every(y=>y.kind===e.default.SyntaxKind.AnyKeyword),c=a.some(y=>y.kind!==e.default.SyntaxKind.AnyKeyword);if(r)return e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword);if(c){let y=a.filter(f=>f.kind!==e.default.SyntaxKind.AnyKeyword);if(y.length===0)return e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword);if(y.length!==a.length)return y.length===1?y[0]:e.default.factory.createUnionTypeNode([...y,e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword)])}}return n}}function B(t,o,i,s,n){let a;if(o.endsWith("Payload")){n.Line(`Transforming Payload type: ${o}`);let r=o.replace(/Payload$/,""),c=r.charAt(0).toLowerCase()+r.slice(1),y=`Mutation${r}`,f=e.default.isTypeAliasDeclaration(t)?i(t.type):e.default.factory.createTypeLiteralNode(t.members.map(l=>e.default.isPropertySignature(l)&&l.type?e.default.factory.createPropertySignature(l.modifiers,l.name,l.questionToken,i(l.type)):l)),p=e.default.factory.createTypeLiteralNode([e.default.factory.createPropertySignature(void 0,c,void 0,f)]);a=e.default.factory.createTypeAliasDeclaration([e.default.factory.createModifier(e.default.SyntaxKind.ExportKeyword)],e.default.factory.createIdentifier(y),void 0,p)}else if(e.default.isTypeAliasDeclaration(t))a=e.default.factory.createTypeAliasDeclaration([e.default.factory.createModifier(e.default.SyntaxKind.ExportKeyword)],t.name,t.typeParameters,i(t.type));else{let r=K(t,n),c=t.members.map(y=>e.default.isPropertySignature(y)&&y.type?e.default.factory.createPropertySignature(y.modifiers,y.name,y.questionToken,i(y.type)):y);a=e.default.factory.createInterfaceDeclaration([e.default.factory.createModifier(e.default.SyntaxKind.ExportKeyword)],t.name,t.typeParameters,r?.length>0?r:void 0,c)}return W(a,t,s,n)}function K(t,o){return t.heritageClauses?t.heritageClauses.map(i=>{let s=i.types.filter(n=>e.default.isIdentifier(n.expression)&&n.expression.text==="any"?(o.Line(`Removing 'any' from heritage clause for ${t.name.text}`),!1):!0);return s.length>0?e.default.factory.createHeritageClause(i.token,s):null}).filter(Boolean):[]}function W(t,o,i,s){let n=e.default.setSyntheticLeadingComments(t,void 0),a=L(o,i);if(a){let r=e.default.isInterfaceDeclaration(t)||e.default.isTypeAliasDeclaration(t)?t.name.text:"node";s.Line(`Adding JSDoc to ${r}: "${a}"`),n=e.default.addSyntheticLeadingComment(n,e.default.SyntaxKind.MultiLineCommentTrivia,`* ${a} `,!0)}return n}function H(t,o,i,s,n){if(!t){n.Warn("QueryRoot not found in typeMap");return}let a=r=>{if(!r.name||!e.default.isIdentifier(r.name)||!r.type){n.Line(`Skipping property in QueryRoot: ${r.name?r.name.getText(s):"unnamed"} - missing required fields`,g.gray);return}let c=r.name.getText(s),y=`Query${c.charAt(0).toUpperCase()+c.slice(1)}`,f=L(r,s),p=i(r.type),l=p.kind===e.default.SyntaxKind.TypeReference&&e.default.isIdentifier(p.typeName)&&p.typeName.getText(s)==="Maybe"&&p.typeArguments?.length,m=l?p.typeArguments[0]:p,u=e.default.factory.createTypeLiteralNode([e.default.factory.createPropertySignature(void 0,c,void 0,m)]),d=l?e.default.factory.createTypeReferenceNode("Maybe",[u]):u,T=e.default.factory.createTypeAliasDeclaration([e.default.factory.createModifier(e.default.SyntaxKind.ExportKeyword)],e.default.factory.createIdentifier(y),void 0,d);f&&(n.Line(`Adding JSDoc to ${y}: "${f}"`),T=e.default.addSyntheticLeadingComment(T,e.default.SyntaxKind.MultiLineCommentTrivia,`* ${f} `,!0)),o.push(T),n.Line(`Generated ${y} for QueryRoot property ${c}`)};e.default.isInterfaceDeclaration(t)?(n.Line("Processing QueryRoot (interface) for augmentation"),t.members.filter(e.default.isPropertySignature).forEach(a)):e.default.isTypeAliasDeclaration(t)&&e.default.isTypeLiteralNode(t.type)?(n.Line("Processing QueryRoot (type alias) for augmentation"),t.type.members.filter(e.default.isPropertySignature).forEach(a)):n.Line("QueryRoot type is not a type literal or interface, skipping augmentation")}function J(t,o,i){let s=e.default.createPrinter({newLine:e.default.NewLineKind.LineFeed});return t.map(n=>{let a=s.printNode(e.default.EmitHint.Unspecified,n,o);return i.Line(`Processed node: ${e.default.SyntaxKind[n.kind]}`),a}).join(` `)}function _(t,o,i,s){let n=new Set(o.keys()),a=c=>y=>{let f=p=>{if(e.default.isTypeReferenceNode(p)&&e.default.isIdentifier(p.typeName)){let l=p.typeName.text;if(!n.has(l)&&!S.has(l))return s.Line(`Post-processing: Replacing undefined ${l} with 'any'`),e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword)}else if(e.default.isArrayTypeNode(p)&&e.default.isTypeReferenceNode(p.elementType)&&e.default.isIdentifier(p.elementType.typeName)){let l=p.elementType.typeName.text;if(!n.has(l)&&!S.has(l))return s.Line(`Post-processing: Replacing Array<${l}> with Array<any>`),e.default.factory.createArrayTypeNode(e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword))}else if(e.default.isIntersectionTypeNode(p)){let l=p.types.map(f);if(l.every(d=>d.kind===e.default.SyntaxKind.AnyKeyword))return e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword);let u=l.filter(d=>d.kind!==e.default.SyntaxKind.AnyKeyword);return u.length===0?e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword):u.length<l.length?u.length===1?u[0]:e.default.factory.createIntersectionTypeNode(u):e.default.factory.createIntersectionTypeNode(l)}else if(e.default.isUnionTypeNode(p)){let l=p.types.map(f);if(l.every(d=>d.kind===e.default.SyntaxKind.AnyKeyword))return e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword);if(l.some(d=>d.kind===e.default.SyntaxKind.AnyKeyword))return e.default.factory.createKeywordTypeNode(e.default.SyntaxKind.AnyKeyword)}else if(e.default.isInterfaceDeclaration(p)&&p.heritageClauses){let l=K(p,s);if(l.length!==p.heritageClauses.length)return e.default.factory.createInterfaceDeclaration(p.modifiers,p.name,p.typeParameters,l.length>0?l:void 0,p.members)}return e.default.visitEachChild(p,f,c)};return e.default.visitNode(y,f)};return t.map(c=>e.default.transform(c,[a]).transformed[0]).filter(c=>{if(e.default.isTypeAliasDeclaration(c)){let y=c.name.text;if(y==="InputMaybe"||y==="Scalars")return s.Line(`Removing ${y} type definition`),!1}return!0})}function G(t,o){return t.replace(/Scalars\['([^']+)'\]\['(input|output)'\]/g,(i,s)=>{let n=R[s]||"any";return o.Line(`Replacing ${i} with ${n}`),n})}function O(t,o){return t.replace(/\* \*/g,"*").replace(/(\/\*\*.*?\*\/)\s*\1/g,"$1").replace(/InputMaybe<([^]+?)>(?=;)/g,"$1").replace(/export type Maybe<T> = null \| any;/,"").replace(/(?<=(?:<|: ))Maybe<([^]+?)>(?=(?:;|>))/g,"$1")}function L(t,o){let i=e.default.getLeadingCommentRanges(o.text,t.getFullStart());return!i||i.length===0?void 0:i.filter(n=>n.kind===e.default.SyntaxKind.MultiLineCommentTrivia).map(n=>o.text.slice(n.pos+2,n.end-2).trim()).find(n=>n.startsWith("*"))?.replace(/^\*/,"").trim()}function q(t,o,i){let n=["import type { LiteralUnion } from 'type-fest';","",`export type Models = LiteralUnion<${Array.from(new Set(t)).map(a=>`'${a}'`).join(" | ")}, string>;`].join(` `);i.Line(`Models type generated with ${Array.from(new Set(t)).length} unique type literals`)}function z(t,o){o.Line(`Extracted ${t} types (including dependencies)`).Newline().End("Generated Types").Break()}module.exports=w;