UNPKG

@lunora/cli

Version:

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

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