UNPKG

@hacxy/json2ts

Version:

Json to typescript types generator

8 lines (5 loc) 2.28 kB
"use strict";const E=require("quicktype-core"),s=require("typescript");function S(u){const r=s.createSourceFile("virtual.ts",u,s.ScriptTarget.Latest,!0),g=new Map,f=new Map,c=new Set,l=new Map;s.forEachChild(r,e=>{if(s.isTypeAliasDeclaration(e)||s.isInterfaceDeclaration(e)){const i=e.name.getText(r);c.add(i),g.set(i,e),l.set(i,e.getFullText(r).trim())}}),s.forEachChild(r,e=>{if(s.isTypeAliasDeclaration(e)||s.isInterfaceDeclaration(e)){const i=e.name.getText(r),o=new Set,a=t=>{if(s.isTypeReferenceNode(t)){const y=t.typeName.getText(r);c.has(y)&&y!==i&&o.add(y)}else s.isArrayTypeNode(t)?a(t.elementType):s.isUnionTypeNode(t)||s.isIntersectionTypeNode(t)?t.types.forEach(a):(s.isPropertySignature(t)&&t.type||s.isMethodSignature(t)&&t.type||s.isIndexSignatureDeclaration(t)&&t.type)&&a(t.type);s.forEachChild(t,a)};s.isTypeAliasDeclaration(e)&&e.type&&a(e.type),s.isInterfaceDeclaration(e)&&e.members.forEach(t=>{a(t)}),s.isInterfaceDeclaration(e)&&e.heritageClauses&&e.heritageClauses.forEach(t=>{t.types.forEach(y=>{const x=y.expression.getText(r);c.has(x)&&x!==i&&o.add(x)})}),f.set(i,Array.from(o))}});const n=[],d=new Map,p=new Set,h=[],T=(e,i=[])=>{if(d.has(e))return;if(p.has(e)){const t=i.indexOf(e);t!==-1&&h.push(i.slice(t));return}p.add(e);const o=[...i,e],a=f.get(e)||[];for(const t of a)T(t,o);p.delete(e),d.set(e,!0),n.push(e)};f.forEach((e,i)=>{d.has(i)||T(i)}),h.forEach(e=>{const i=n.findIndex(o=>e.includes(o));i!==-1&&(e.forEach(o=>{const a=n.indexOf(o);a!==-1&&n.splice(a,1)}),n.splice(i,0,...e))});const C=[];return s.forEachChild(r,e=>{!s.isTypeAliasDeclaration(e)&&!s.isInterfaceDeclaration(e)&&C.push(e.getFullText(r))}),{sortedCode:`${n.map(e=>l.get(e)).filter(Boolean).join(` `)} ${C.join("")}`,sortedTypes:n}}async function w(u,r="Root",g={}){const{indentation:f=2}=g;let c=!1;try{c=Array.isArray(JSON.parse(u))}catch(T){throw new Error(String(T))}const l=E.jsonInputForTargetLanguage("typescript");await l.addSource({name:c?`${r}Element`:r,samples:[u]});const n=new E.InputData;n.addInput(l);const{lines:d}=await E.quicktype({inputData:n,lang:"typescript",rendererOptions:{"just-types":!0},indentation:" ".repeat(f)});let p=d.join(` `);c&&(p=`${p} export type ${r} = ${r}Element[];`);const{sortedCode:h}=S(p);return h.trim()}module.exports=w;