UNPKG

@lunora/cli

Version:

The Lunora CLI: init, dev, deploy, codegen, migrate, seed, doctor, insights, logs, registry, and the rest of the project commands

9 lines (8 loc) 1.43 kB
import{Project as m,SyntaxKind as i,Node as a}from"ts-morph";const u=/^[A-Za-z_$][\w$]*$/u,o=t=>`// lunora:add:${t}:start`,l=t=>`// lunora:add:${t}:end`,g=t=>`./${t}/schema`,x=(t,e)=>t.getLocal(e)!==void 0?!0:t.getImportDeclarations().some(r=>r.getDefaultImport()?.getText()===e||r.getNamespaceImport()?.getText()===e||r.getNamedImports().some(n=>(n.getAliasNode()??n.getNameNode()).getText()===e)),E=t=>{for(const e of t)if(e.getExpression().getText()==="defineSchema")return e},$=t=>{let e=t;for(let r=e.getParent();r!==void 0;r=e.getParent())if(a.isPropertyAccessExpression(r)&&r.getExpression()===e)e=r;else if(a.isCallExpression(r)&&r.getExpression()===e)e=r;else break;return e},h=(t,e)=>{if(!u.test(e))return{ok:!1,reason:"invalid-identifier"};if(t.includes(o(e)))return{ok:!1,reason:"already-applied"};const n=new m({compilerOptions:{allowJs:!0},useInMemoryFileSystem:!0}).createSourceFile("schema.ts",t,{overwrite:!0});if(x(n,e))return{ok:!1,reason:"already-applied"};const c=n.getDescendantsOfKind(i.CallExpression),s=E(c);if(!s)return{ok:!1,reason:"no-define-schema"};if(s.getArguments()[0]?.getKind()!==i.ObjectLiteralExpression)return{ok:!1,reason:"non-object-argument"};const d=$(s).getEnd(),p=` ${o(e)} .extend(${e}.extension) ${l(e)} `;n.insertText(d,p);const f=`${o(e)} import { ${e} } from "${g(e)}"; ${l(e)} `;return n.insertText(0,f),{ok:!0,text:n.getFullText()}};export{h as insertSchemaExtension};