UNPKG

envsyncer

Version:

Sync your root .env files into monorepo subfolders with ease

19 lines 3.87 kB
#!/usr/bin/env node "use strict";var L=Object.create;var x=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var C=(n,o,e,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of P(o))!V.call(n,r)&&r!==e&&x(n,r,{get:()=>o[r],enumerable:!(t=N(o,r))||t.enumerable});return n};var c=(n,o,e)=>(e=n!=null?L(W(n)):{},C(o||!n||!n.__esModule?x(e,"default",{value:n,enumerable:!0}):e,n));var v=c(require("fs")),h=c(require("path")),g=c(require("chalk"));function j(n,o=[]){let e=v.default.readdirSync(n,{withFileTypes:!0});v.default.existsSync(h.default.join(n,"package.json"))&&n!==process.cwd()&&o.push(h.default.relative(process.cwd(),n));for(let t of e)if(t.isDirectory()){if(t.name==="node_modules"||t.name.startsWith("."))continue;let r=h.default.join(n,t.name);j(r,o)}return o}async function $(){try{console.log(g.default.blue("\u{1F50D} Scanning for projects in monorepo..."));let n=j(process.cwd());return n.length===0?(console.log(g.default.yellow("\u26A0\uFE0F No projects found in the monorepo")),[]):(console.log(g.default.blue(` \u{1F4C1} Found the following projects:`)),n.forEach(o=>console.log(g.default.gray(` - ${o}`))),n)}catch(n){return console.error(g.default.red("Error scanning directories:"),n),[]}}var b=c(require("inquirer")),S=c(require("chalk"));async function k(n){if(n.length===0)return[];let{selected:o}=await b.default.prompt([{type:"checkbox",name:"selected",message:"Select folders to sync .env into:",choices:n.map(e=>({name:e,checked:!0,value:e})),validate:e=>e.length>0||"You must choose at least one directory!"}]);return console.log(S.default.blue(` \u{1F3AF} Selected directories:`),o.map(e=>S.default.gray(e)).join(", ")),o}var m=c(require("fs")),y=c(require("path")),l=c(require("chalk")),F=[".env",".env.local",".env.development",".env.production"];function q(n){let o=new Set,e=n.split(` `);for(let t of e){let r=t.trim();if(r&&!r.startsWith("#")){let s=r.indexOf("=");if(s>0){let i=r.substring(0,s);o.add(i)}}}return o}function I(n,o){let e=n.split(` `),t=[];for(let r of e){let s=r.trim();if(!s||s.startsWith("#")){t.length>0&&t.push(r);continue}let i=s.indexOf("=");if(i>0){let p=s.substring(0,i);o.has(p)||t.push(r)}}for(;t.length>0&&!t[t.length-1].trim();)t.pop();return t}async function T(n){let o=F.filter(e=>m.default.existsSync(y.default.join(process.cwd(),e)));if(o.length===0){console.log(l.default.red("\u274C No .env files found in root directory.")),console.log(l.default.gray("Looked for:",F.join(", ")));return}console.log(l.default.blue(` \u{1F4C4} Found env files:`),o.join(", "));for(let e of o){let t=y.default.join(process.cwd(),e),r=m.default.readFileSync(t,"utf-8"),s=q(r);for(let i of n){let p=y.default.join(process.cwd(),i,e);try{let f=[];if(m.default.existsSync(p)){let u=m.default.readFileSync(p,"utf-8");f=I(u,s)}let a=r;f.length>0&&(a.endsWith(` `)||(a+=` `),a+=` # Local environment variables `,a+=f.join(` `),a.endsWith(` `)||(a+=` `)),m.default.writeFileSync(p,a);let E=f.filter(u=>u.trim()&&!u.trim().startsWith("#")).length,D=E>0?`\u2705 Synced ${e} to ${l.default.gray(`${i}/${e}`)} ${l.default.cyan(`(preserved ${E} local vars)`)}`:`\u2705 Synced ${e} to ${l.default.gray(`${i}/${e}`)}`;console.log(l.default.green(D))}catch(f){console.error(l.default.red(`\u274C Failed to sync ${e} to ${i}:`),f)}}}}var d=c(require("chalk"));async function O(){console.log(d.default.green.bold(` \u{1F331} EnvSync \u2014 syncing envs into your monorepo like magic `));let n=await $(),o=await k(n);o.length||(console.log(d.default.yellow("No folders selected. Exiting.")),process.exit(0)),await T(o),console.log(d.default.green(` \u2705 Done syncing env files! `))}O().catch(n=>{console.error(d.default.red("\u274C Something went wrong:"),n),process.exit(1)}); //# sourceMappingURL=index.js.map