svhost 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";var ie=Object.create;var Z=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var he=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ae(e))!ce.call(n,s)&&s!==r&&Z(n,s,{get:()=>e[s],enumerable:!(t=ne(e,s))||t.enumerable});return n};var L=(n,e,r)=>(r=n!=null?ie(le(n)):{},he(e||!n||!n.__esModule?Z(r,"default",{value:n,enumerable:!0}):r,n));var R=L(require("path"));var _=L(require("fs-extra")),U=require("fs/promises"),u=L(require("path"));async function Q(n){try{return await _.default.exists(n)}catch{return!1}}async function P(n){try{return(await _.default.stat(n)).isFile()}catch{return!1}}async function b(n){try{return(await _.default.stat(n)).isDirectory()}catch{return!1}}async function X(n,e){let{recursive:r=!1,filesOnly:t=!1,dirsOnly:s=!1,returnType:o="absolute",forwardSlashes:a=!1,ignorefile:l,quiet:i=!0,includeIgnorefile:c=!1}=e||{};return new Promise(async(h,f)=>{function m(v){return a?v.replace(/\\/g,"/"):v}i||console.log(`Reading directory: ${n}`,{recursive:r,filesOnly:t,dirsOnly:s,returnType:o,forwardSlashes:a,quiet:i,includeIgnorefile:c,ignorefile:l});try{if(!await Q(n))return f(new Error(`Directory does not exist: ${n}`));if(!await b(n))return f(new Error(`Path is not a directory: ${n}`));let g=(await(0,U.readdir)(n,{withFileTypes:!0,recursive:r})).filter(p=>!c&&p.name===".ignore"&&u.default.resolve(n)===u.default.resolve(p.parentPath)?!1:t?p.isFile():s?p.isDirectory():!0);if(l?.data||l?.path||await Q(u.default.join(n,".ignore"))){i||console.log(`Applying ignore rules from: ${l?.path||"provided data"}`);let p="";if(l?.data)p=l.data;else if(l?.path)try{p=await _.default.readFile(l.path,"utf8")}catch(d){i||console.warn(`Warning: Could not read ignorefile at ${l.path}: ${d.message}`)}else try{p=await _.default.readFile(u.default.join(n,".ignore"),"utf8")}catch(d){i||console.warn(`Warning: Could not read ignorefile at ${u.default.join(n,".ignore")}: ${d.message}`)}if(p){i||(console.log(`All .ignore data:
3
- ------------------------`),console.log(p),console.log("------------------------"));let d="",x="",G=y=>y?.replace(/(([ \t]*)#.*$)/gm,"")?.replace(/^([ \t])*|([ \t])*$/gm,"")?.split(/\r?\n/)?.filter(I=>I.length),oe=y=>y.match(/RegExp[ \s]*\([ \s]*['"`](?<regex>.*)['"`][ \s]*,[ \s]*['"`](?<flags>.*)['"`][ \s]*\)|RegExp[ \s]*\([ \s]*['"`](?<regex>.*)['"`][ \s]*\)/m),K=(y,Y,I)=>y.filter(z=>{let $=m(u.default.relative(n,u.default.resolve(z.parentPath,z.name)));for(let J of Y){let j=oe(J);if($){if(j){let q=j?.groups?.regex||"",M=j?.groups?.flags||"m";if($?.match(new RegExp(q,M)))return I?(i||console.log(`Included path "${$}" via Regex("${q}","${M}") Match pattern.`),!0):(i||console.log(`Ignored path "${$}" via Regex("${q}","${M}") Match pattern.`),!1)}if($?.match(new RegExp(`^${J}$`,"gm")))return I?(i||console.log(`Included path "${$}" via Match pattern.`),!0):(i||console.log(`Ignored path "${$}" via Match pattern.`),!1)}}return!I});if(p.match(/^[ \t]*#?[ \t]*EXCLUDE EXCLUDE EXCLUDE[ \t]*$/gm)&&(p.match(/^[ \t]*#[ \t]*EXCLUDE EXCLUDE EXCLUDE[ \t]*$/gm)?d=p.replace(/^[ \t]*#[ \t]*EXCLUDE EXCLUDE EXCLUDE[ \t]*.*/gms,""):x=p.replace(/.*[ \t]*EXCLUDE EXCLUDE EXCLUDE[ \t]*$/gms,"")),i||(console.log(`Include data:
4
- ------------------------`),console.log(x),console.log("------------------------"),console.log(`Exclude data - EXCLUDE EXCLUDE EXCLUDE:
5
- ------------------------`),console.log(d),console.log("------------------------")),console.log("Applying exclude and include rules from .ignore file"),console.log("Initial file count before applying ignore rules:",g.length),d){let y=G(d);i||console.log("Exclude lines:",y),g=K(g,y,!1)}if(x){let y=G(x);i||console.log("Include lines:",y),g=K(g,y,!0)}console.log("Final file count after applying ignore rules:",g.length)}}let C=u.default.resolve(n);switch(o){case"absolute":{let p=g.map(d=>{let x=u.default.join(d.parentPath,d.name);return m(x)});return h(p)}case"relative":{let p=g.map(d=>{let x=u.default.join(d.parentPath,d.name);return m(u.default.relative(C,x))});return h(p)}case"dirent":return h(g);case"all":{let p=g.map(d=>{let x=u.default.join(d.parentPath,d.name);return{name:d.name,absolutePath:m(x),relativePath:m(u.default.relative(C,x)),isFile:d.isFile(),isDirectory:d.isDirectory()}});return h(p)}default:return f(new Error(`Invalid returnType option: ${o}`))}}catch(v){f(v)}})}(async(n=!1)=>{let e=`
6
- # Ignore files and directories
7
-
8
- dir1
9
-
10
- EXCLUDE EXCLUDE EXCLUDE
11
- react-app.yml
12
- RegExp("node-app.yml$")
13
-
14
- `;if(n){let t=u.default.resolve("src/classes/svhost-nginx/sample/data"),s=await X(t,{recursive:!0,returnType:"relative",forwardSlashes:!0,filesOnly:!1,quiet:!1,ignorefile:{data:e}});console.log("Directory contents:",s)}})(!1);var W=class{constructor(e){this.svhostNginx=e}};function ee(n){let e=n?.date||new Date;switch(n?.format||"standard"){case"email":{let t={timeZone:"Asia/Kolkata",year:"numeric",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"longOffset"};return new Intl.DateTimeFormat("en-IN",t).format(e)}case"standard":{let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),l=String(e.getMinutes()).padStart(2,"0"),i=String(e.getSeconds()).padStart(2,"0");return`${t}-${s}-${o} ${a}:${l}:${i}`}}}var D=require("fs/promises");var te=require("js-yaml"),k=require("fs/promises"),re=require("path"),F=class{constructor(){}async _readFile(e){if(!e||typeof e!="string")throw new TypeError("Path must be a non-empty string");let r=(0,re.resolve)(e);if(!(await(0,k.stat)(r)).isFile())throw new Error(`Not a readable file: ${r}`);try{return await(0,k.readFile)(r,{encoding:"utf8"})}catch(s){let o=s;throw o.code==="EACCES"||o.code==="EPERM"?new Error(`No read permission for file: ${r}`,{cause:o}):new Error(`Error reading file: ${r}`,{cause:o})}}_resolveVars(e,r){return JSON.parse(JSON.stringify(e),(t,s)=>typeof s=="string"?s.replace(/\$\{(\w+)\}/g,(o,a)=>String(r[a])):s)}async read(e){let r=await this._readFile(e),t=(0,te.load)(r);return this._resolveVars(t,t?.vars)}};var H=class{};function A(n,e={}){let{notAllowed:r=[void 0,null,"",0],message:t=s=>`"${s}" is required.`}=e;if(typeof n=="object"&&Object.keys(n).length){Object.entries(n).forEach(([s,o])=>{if(r.includes(o))throw new Error(t(s));if(e.noEmptyArray&&Array.isArray(o)&&o.length===0)throw new Error(`${s} cannot be an empty array.`);if(e.noEmptyObject&&o instanceof Object&&Object.keys(o).length===0)throw new Error(`${s} cannot be an empty object.`)});return}throw new Error('Invalid arg passed to "validateRequired"')}function E(n,e={}){let{tab:r=1,joinArray:t=!1,tabSize:s=4}=e;if(typeof n=="string")return E([n],e);if(Array.isArray(n)){let o=" ".repeat(r*s),a=n.map(l=>`${o}${l}`);return t?a.join(`
15
- `):a}else throw new Error("Argument passed to indent method should be string or string[].")}var w=class{constructor(e){this.order=10;this.items=[];A({location:e}),this.location=e}setItem(e=""){Array.isArray(e)?this.items.push(...e):this.items.push(e)}setOrder(e){this.order=e}getData(e){let{joinArray:r=!1}=e||{},t=[];return t.push(`location ${this.location} {`),t.push(...E(this.items)),t.push("}"),r?t.join(`
16
- `):t}};var S=class{constructor(e){let{host:r="localhost",port:t,location:s="/",hostUri:o="/",headers:a=new Map,resetHeader:l=!1}=e;if(A({port:t},{message:i=>`"${i}" is required in ReverseProxy constructor.`}),this.host=r,this.port=t,this.location=s,this.hostUri=o,this.resetHeader=l,!(a instanceof Map))throw new Error('"headers" must be a Map');this.headers=new Map,this.headerArgs=a,this.setDefaultHeaders()}setHost(e){this.host=e}setPort(e){this.port=e}setResetHeader(e){this.resetHeader=e,this.setDefaultHeaders()}setHeader(e,r){this.headers.set(e,r)}deleteHeader(e){this.headers.delete(e)}getHeader(e){return this.headers.get(e)}getHeaders(){return new Map(this.headers)}getHeadersList(){let e=[];for(let[r,t]of this.headers.entries())e.push(`${r} ${t};`);return e}setDefaultHeaders(e){let r=e?.reset||!1;this.headers.clear();let t=new Map;t.set("proxy_pass",`http://${this.host}:${this.port}${this.hostUri}`),r||(this.resetHeader||(t.set("proxy_set_header Host","$host"),t.set("proxy_set_header X-Real-IP","$remote_addr"),t.set("proxy_set_header X-Forwarded-Host","$http_host"),t.set("proxy_set_header X-Forwarded-Proto","$scheme"),t.set("proxy_set_header X-Forwarded-For","$proxy_add_x_forwarded_for"),t.set("proxy_cache_bypass","$http_upgrade"),t.set("proxy_http_version","1.1"),t.set("proxy_set_header Upgrade","$http_upgrade"),t.set("proxy_set_header Connection","upgrade")),this.headers=new Map([...t,...this.headerArgs]))}getData(e={}){let{joinArray:r=!1}=e,t=this.getHeadersList(),s=new w(this.location);return s.setItem(t),s.getData({joinArray:r})}};var N=class{constructor(){this.serverItems=[];this.sslItems=[];this.locationBlocks=[];this.redirectItems=[]}addServerItem(e){Array.isArray(e)?this.serverItems.push(...e):this.serverItems.push(e)}addSslItem(e){Array.isArray(e)?this.sslItems.push(...e):this.sslItems.push(e)}addLocationBlock(e=null){e&&e instanceof w&&this.locationBlocks.push(e)}addRedirectItem(e){Array.isArray(e)?this.redirectItems.push(...e):this.redirectItems.push(e)}getData(e={}){let{joinArray:r=!1}=e,t=[];if(t.push("server {"),t.push(...E(this.serverItems)),this.sslItems?.length&&(t.push(`
17
- `),this.sslItems.forEach(s=>{t.push(E(s))})),this.redirectItems?.length)t.push(`
18
- `),this.redirectItems.forEach(s=>{t.push(E(s))});else if(this.locationBlocks?.length){let s=this.locationBlocks.toSorted((o,a)=>o.order-a.order);t.push(""),s.forEach(o=>{t.push(""),t.push(...E(o.getData()))})}return t.push("}"),r?t.join(`
19
- `):t}};var T=class{constructor(e){let{id:r,domainName:t="",tld:s="com",serverNames:o=[],redirectToFirstServer:a=!0,appType:l="reverseProxy",reverseProxies:i=new Map,ssl:c=!1,sslCertificateName:h,redirectToHttps:f=!1,rootDirectory:m="/var/www/html",http_port:v=80,https_port:g="443 ssl",meta:C}=e||{};if(A({id:r,domainName:t,tld:s,serverNames:o,rootDirectory:m,appType:l,http_port:v,https_port:g},{noEmptyArray:!0,noEmptyObject:!0}),this.reverseProxies=i,!Array.isArray(o)||o.length===0)throw new Error('"serverNames" must be a non-empty array of server-names');this.id=r,this.domainName=t,this.tld=s,this.serverNames=o,this.redirectToFirstServer=a,this.appType=l,this.ssl=c,this.sslCertificateName=h??`${t}.${s}`,this.redirectToHttps=f,this.rootDirectory=m,this.http_port=v,this.https_port=g,this.meta=C??{},this.meta.group=this.meta?.group??"default"}setReverseProxy(e){if(e instanceof S&&e?.location){if(this.reverseProxies)this.reverseProxies.set(e?.location,e);else{let r=`Error: Server ID: ${this.id} - reverseProxies Map is not initialized.`;throw console.error(r),new Error(r)}return}console.warn("Error: Server ID: ${this.id} - Invalid reverseProxy passed",JSON.stringify(e))}getLocationBlocks(){let e=[];if(this.reverseProxies?.size&&this.reverseProxies instanceof Map)this.reverseProxies?.forEach(r=>{let t=new w(r.location);t.setItem(r.getHeadersList()),e.push(t)});else{let r=new w("/");r.setItem("try_files $uri $uri/ =404;"),e.push(r)}return e}createServerBlock(e={}){let{joinArray:r=!1,serverDirectives:t=[],addSslCertificates:s=!1,redirects:o=[],locationBlocks:a=[]}=e,l=new N;if(t?.length&&t.forEach(i=>{l.addServerItem(i)}),s){let i=[];if(this.ssl===void 0)throw new Error(`Please provide/set valid value for "this.ssl" in 'Vhost' constructor, if you want to redirect to HTTPS`);if(this.ssl===!0)l.addSslItem([`ssl_certificate /etc/letsencrypt/live/${this.sslCertificateName}/fullchain.pem;`,`ssl_certificate_key /etc/letsencrypt/live/${this.sslCertificateName}/privkey.pem;`,...i]);else if(this.ssl!==!1)if(typeof this.ssl=="object")l.addSslItem([`ssl_certificate ${this.ssl?.crt};`,`ssl_certificate_key ${this.ssl?.key};`,...i]);else throw new Error("Something Went Wrong in SSL Directives.")}if(o?.length)l.addRedirectItem(o);else{let c=[...this.getLocationBlocks(),...a].sort((h,f)=>h?.order-f?.order);c?.length&&c.forEach(h=>{l.addLocationBlock(h)})}return l.getData({joinArray:r})}getIndexDirective(){let e="index index.html index.htm";switch(this.appType){case"reverseProxy":return`${e};`;case"html":return`${e};`;case"react":return`${e};`;case"node":return`${e};`;case"react-node":return`${e};`;case"php":return`index.php ${e};`;case"python":return`index.py ${e};`;default:return`${e}; # Default`}}getServerDirectives(e={}){let{serverNames:r,redirect:t=!1,port:s=this.http_port}=e,o=[`listen ${s};`,`listen [::]:${s};`,"",`server_name ${r?.join(" ")};`];return t||o.push("",this.getIndexDirective(),`root ${this.rootDirectory};`),o}_generateFullServerBlock(e){let{redirectHttps:r=!1,redirectWWW:t=!1,port:s,onlyFirstServerName:o=!1}=e||{},a=[];if(r||t){let c=r||s===this.https_port?"s":"",h=t?this.serverNames?.[0]:"$host";a.push(`return 301 http${c}://${h}$request_uri;`)}let l=t?this.serverNames?.slice(1):this.serverNames;return this.createServerBlock({serverDirectives:this.getServerDirectives({serverNames:o?[l?.[0]]:l,port:s,redirect:r||t}),addSslCertificates:!!(this.ssl&&s===this.https_port),redirects:a?.length?a:void 0})}getData(e){let{joinArray:r=!1}=e??{},t=[],s=this.serverNames,o=this.redirectToFirstServer&&this.serverNames?.length>1?this.serverNames?.[0]:"",a=this.redirectToHttps;return a?o?(t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!0,redirectWWW:!0})),t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!0,redirectWWW:!0})),t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!0,redirectWWW:!1,onlyFirstServerName:!0})),t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!1,redirectWWW:!1,onlyFirstServerName:!0}))):(t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!0,redirectWWW:!1})),t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!1,redirectWWW:!1}))):o?(t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!1,redirectWWW:!0})),t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!1,redirectWWW:!0})),t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!1,redirectWWW:!1,onlyFirstServerName:!0})),t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!1,redirectWWW:!1,onlyFirstServerName:!0}))):(console.log(22222222222222,{redirectToHttps:a,redirectToFirtServerName:o,serverNames:s}),t.push(this._generateFullServerBlock({port:this.http_port,redirectHttps:!1,redirectWWW:!1})),this.ssl&&t.push(this._generateFullServerBlock({port:this.https_port,redirectHttps:!1,redirectWWW:!1}))),((i={})=>{let{joinArray:c=!1}=i,h=[];return t?.map((f,m)=>{h.push(...f),m+1<t?.length&&h.push("")}),c?h?.join(`
20
- `):h})({joinArray:r})}};var V=class{constructor(e){this.helper=new W(this)}async yamlToVhostInstances(e,r){let{quiet:t=!1}=r||{};try{let o=await new F().read(e),a=o?.vhosts||[],l=o?.meta||{};t||(console.log(`YAML Config Data : -------- Total VHosts in file "${e}":`,a.length),console.log("VHosts Default Meta:",{defaultMeta:l}));for(let c of a)t||(console.log("VHost Data:",c),console.log("VHost reverseProxies:",c?.reverseProxies));let i=[];return a.forEach(c=>{let h=structuredClone(c);h.meta={...l,...h.meta??{}},delete h.reverseProxies,console.log(222,h);let f=new T(h);i.push(f),t||(console.log("Processing VHost:",f.id),console.log("vhostData?.reverseProxies:",c?.reverseProxies)),[...c?.reverseProxies??[]].forEach(m=>{let[[v,g]]=Object.entries(m??{});t||console.log("Reverse Proxy Data:",{pathKey:v,proxyConfig:g}),g.location=v;let C=new S(g);f.setReverseProxy(C)})}),t||console.log(`Loaded (${i.length}) vhost(s) from YAML file: "${e}"`),i}catch(s){throw new Error(`Error reading YAML file "${e}": ${s?.message}`,{cause:s})}}async getVhostInstanceArray(e,r){let{quiet:t=!1}=r||{};try{return P(e)?await this.yamlToVhostInstances(e,{quiet:t}):(t||console.warn(`The path "${e}" is not a valid file.`),null)}catch(s){throw console.error("-----------------------------------"),console.error(`Error Message: ${s?.message}`),console.error("----------------- Complete Error ------------------"),console.error(s),console.error("-----------------------------------"),new Error(`YAML File Error, while importing "${e}": ${s?.message}`)}}async getVhostInstances(e,r){let{quiet:t=!1}=r||{};try{let s=await X(e,{recursive:!0,filesOnly:!0,returnType:"relative",forwardSlashes:!0,quiet:t});t||(console.log(4444,{quiet:t},{files:s}),console.log(s));let o=[];for(let a of s)if(a.endsWith(".yml")||a.endsWith(".yaml")){let l=R.default.resolve(e,a),i=await this.getVhostInstanceArray(l,{quiet:t});i?.length&&o.push(...i)}return o}catch(s){throw new Error(`Error in "getVhostInstances()" from directory "${e}": Error:"${s.message}"`,{cause:s})}}async ensureDir(e,r){let{quiet:t=!1,directoryName:s="Output"}=r||{};if(!await b(e))if(await b(R.default.dirname(e)))t||console.log(`## ${s} directory does not exist. Creating directory: "${e}"`),await(0,D.mkdir)(e);else throw new Error(`## ${s} directory does not exist: ${e}`)}getVhostConfigFileData(e,r){let{joinArray:t=!1}=r||{},s=e.getData()??[],o=e.reverseProxies?.size?[...e.reverseProxies].map(([l,i])=>`${l} => ${i?.host}:${i?.port}${i?.hostUri}`).join(", "):"",a=[`# Created at: ${ee()}`,`# ID: ${e.id}`,`# HOST (s): ${o}`,`# GROUP: ${e?.meta?.group}`,"###################################",`
21
-
22
- `,...s];return t?a.join(`
23
- `):a}async generateVhostConfig(e){let{vhosts:r,destDir:t,quiet:s=!1}=e;await this.ensureDir(t,{quiet:s,directoryName:"Destination"});for(let o of r){let a=this.getVhostConfigFileData(o,{joinArray:!0}),l=o?.meta?.confFileName??`${o?.meta?.group}--${o.id}.conf`,i=R.default.resolve(t,l);console.log(`Generating vhost config file: "${i}" ...`,a);try{await(0,D.writeFile)(i,a)}catch(c){throw new Error(`Error writing vhost config file "${i}": ${c?.message}`,{cause:c})}}}async generate(e){let{file:r,srcDir:t,outputDir:s,quiet:o=!1,cleanDir:a=!1}=e;try{if(!r&&!t)throw new Error('Either "file" or "srcDir" must be provided.');if(r&&!await P(r))throw new Error(`The specified file does not exist: ${r}`);if(t&&!await b(t))throw new Error(`The specified source directory does not exist: ${t}`);await this.ensureDir(s,{quiet:o,directoryName:"output"});let l=[];if(o||console.log(1111,{file:r,srcDir:t}),r){let i=await this.getVhostInstanceArray(r,{quiet:o});i?.length&&l.push(...i)}if(t){let i=await this.getVhostInstances(t,{quiet:o});o||(console.log({"vhostInstances Count":i.length}),console.log(3333,i)),l.push(...i)}if(a){let i=(await(0,D.readdir)(s)).map(c=>R.default.resolve(s,c));await Promise.all(i.map(c=>(0,D.rm)(c,{recursive:!0,force:!0})))}await(0,D.writeFile)(R.default.resolve(s,".empty"),"8"),o||console.log(`Total vhosts to generate: ${l.length} . Output Directory: "${s}"`),await this.generateVhostConfig({vhosts:l,destDir:s,quiet:o}),o||console.log(`Generated (${l.length}) vhost configuration file(s) in "${s}".`)}catch(l){throw new Error(`Error in generate method: "${l.message}"`,{cause:l})}}};var se=require("commander");var O=L(require("path"));var B=class extends H{constructor(){super();this.quiet=!0}setupCommand(){let r=new se.Command;return r.name("svhost-nginx").description("Nginx - Simple Virtual Host").version("1.0.0"),r.description("Generate Nginx configuration for a virtual host").option("-f, --src-file <srcFile>","Source file for configuration").option("--src-dir <srcDir>","Source directory for configuration").requiredOption("-d, --dest-dir <destDir>","Destination directory for configuration").action(this.actionDefault.bind(this)),r.parseAsync(process.argv)}async run(r){let{quiet:t=!0}=r||{};this.quiet=t,await this.setupCommand()}async actionDefault(r,t,s){let{srcFile:o,srcDir:a,destDir:l}=r;if(this.quiet||console.log("Commander:",{name:r,command:s}),o&&a)throw new Error("Please provide either --src-file or --src-dir, not both.");if(!o&&!a)throw new Error("Please provide either --src-file or --src-dir.");let i=O.default.resolve(o||""),c=O.default.resolve(a||""),h=O.default.resolve(l);if(this.quiet||console.table({"Source File":i,"Source Directory":c,"Destination Directory":h}),o&&!await P(o))throw new Error(`Source file does not exist: "${o}"`);if(a&&!await b(a))throw new Error(`Source directory does not exist: "${a}"`);console.log("Generating Nginx configuration ...");let f=new V;o?await f.generate({file:i,outputDir:h,quiet:this.quiet,cleanDir:!0}):a&&await f.generate({srcDir:c,outputDir:h,quiet:this.quiet,cleanDir:!0}),this.quiet||(console.log("option1 action executed"),console.log("Name:",r,typeof r))}};var pe=new B;pe.run().then(()=>{process.exit(0)}).catch(n=>{console.error("Error executing CLI:",n),process.exit(1)});
24
- //# sourceMappingURL=svhostNginx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/classes/svhost-nginx/SvhostNginx.ts","../src/lib/utils/fs-extra.ts","../src/classes/svhost-nginx/SvhostNginxHelper.ts","../src/lib/utils/datetime.ts","../src/lib/utils/js-yaml.ts","../src/lib/command/Command.ts","../src/lib/utils/utils.ts","../src/classes/vhost/LocationBlock.ts","../src/classes/vhost/ReverseProxy.ts","../src/classes/vhost/ServerBlock.ts","../src/classes/vhost/Vhost.ts","../src/classes/svhost-nginx/SvhostNginxCli.ts","../src/commands/svhost-nginx/index.cli.ts"],"sourcesContent":["import path from 'path';\nimport { exists, isDir, isFile, readDirectory } from '../../lib/utils/fs-extra';\nimport { SvhostNginxHelper } from './SvhostNginxHelper';\n\nimport { getFullDateTime } from '../../lib/utils/datetime';\nimport { mkdir, readdir, readFile, rm, writeFile } from 'fs/promises';\nimport JsYaml from '../../lib/utils/js-yaml';\nimport Vhost, { VhostArgs } from '../vhost/Vhost';\nimport { VHostConfig } from './yaml/types';\nimport ReverseProxy from '../vhost/ReverseProxy';\n\ninterface SvhostNginxOptions {}\n\ninterface SvhostNginxGenerateOptions {\n file?: string;\n srcDir?: string;\n outputDir: string;\n quiet?: boolean;\n cleanDir?: boolean;\n}\n\nexport class SvhostNginx {\n private helper: SvhostNginxHelper;\n\n constructor(props?: SvhostNginxOptions) {\n this.helper = new SvhostNginxHelper(this);\n }\n\n async yamlToVhostInstances(yamlFilePath: string, options?: { quiet?: boolean }): Promise<Vhost[]> {\n const { quiet = false } = options || {};\n try {\n const jsYaml = new JsYaml();\n const yamlConfig = (await jsYaml.read(yamlFilePath)) as VHostConfig;\n const vhostsData = yamlConfig?.vhosts || [];\n const defaultMeta = yamlConfig?.meta || {};\n\n if (!quiet) {\n console.log(`YAML Config Data : -------- Total VHosts in file \"${yamlFilePath}\":`, vhostsData.length);\n console.log('VHosts Default Meta:', { defaultMeta });\n }\n for (const vhost of vhostsData) {\n if (!quiet) {\n console.log('VHost Data:', vhost);\n console.log('VHost reverseProxies:', vhost?.reverseProxies);\n }\n }\n\n const vhosts: Vhost[] = [];\n\n vhostsData.forEach((vhostData) => {\n const newVhostData = structuredClone(vhostData) as VhostArgs;\n newVhostData.meta = { ...defaultMeta, ...(newVhostData.meta ?? {}) };\n delete newVhostData.reverseProxies;\n console.log(222, newVhostData);\n\n const vhost = new Vhost(newVhostData);\n vhosts.push(vhost);\n if (!quiet) {\n console.log('Processing VHost:', vhost.id);\n console.log('vhostData?.reverseProxies:', vhostData?.reverseProxies);\n }\n [...(vhostData?.reverseProxies ?? [])]?.forEach((reverseProxyItem) => {\n const [[pathKey, proxyConfig]] = Object.entries(reverseProxyItem ?? {});\n if (!quiet) {\n console.log('Reverse Proxy Data:', { pathKey, proxyConfig });\n }\n proxyConfig.location = pathKey;\n const reverseProxy = new ReverseProxy(proxyConfig);\n // console.log(6666, { pathKey, reverseProxy });\n vhost.setReverseProxy(reverseProxy);\n });\n });\n\n if (!quiet) {\n console.log(`Loaded (${vhosts.length}) vhost(s) from YAML file: \"${yamlFilePath}\"`);\n }\n\n return vhosts;\n } catch (error: any) {\n throw new Error(`Error reading YAML file \"${yamlFilePath}\": ${error?.message}`, { cause: error });\n }\n }\n\n async getVhostInstanceArray(filePath: string, options?: { quiet?: boolean }): Promise<Vhost[] | null> {\n const { quiet = false } = options || {};\n\n try {\n if (!isFile(filePath)) {\n if (!quiet) {\n console.warn(`The path \"${filePath}\" is not a valid file.`);\n }\n return null;\n }\n const vhostInstances = await this.yamlToVhostInstances(filePath, { quiet });\n return vhostInstances;\n } catch (error: any) {\n console.error('-----------------------------------');\n console.error(`Error Message: ${error?.message}`);\n console.error('----------------- Complete Error ------------------');\n console.error(error);\n console.error('-----------------------------------');\n throw new Error(`YAML File Error, while importing \"${filePath}\": ${error?.message}`);\n }\n }\n\n async getVhostInstances(dirPath: string, options?: { quiet?: boolean }): Promise<Vhost[]> {\n const { quiet = false } = options || {};\n\n try {\n const files = await readDirectory(dirPath, {\n recursive: true,\n filesOnly: true,\n returnType: 'relative',\n forwardSlashes: true,\n quiet,\n });\n if (!quiet) {\n console.log(4444, { quiet }, { files });\n console.log(files);\n }\n\n const vhosts: Vhost[] = [];\n\n for (const file of files) {\n if (file.endsWith('.yml') || file.endsWith('.yaml')) {\n const fullPath = path.resolve(dirPath, file);\n // console.log(5555, { fullPath });\n const vhostArray = await this.getVhostInstanceArray(fullPath, { quiet });\n if (vhostArray?.length) {\n vhosts.push(...vhostArray);\n }\n }\n }\n return vhosts;\n } catch (error) {\n throw new Error(\n `Error in \"getVhostInstances()\" from directory \"${dirPath}\": Error:\"${(error as Error).message}\"`,\n { cause: error },\n );\n }\n }\n\n async ensureDir(outputDir: string, options?: { quiet?: boolean; directoryName?: string }): Promise<void> {\n const { quiet = false, directoryName = 'Output' } = options || {};\n if (!(await isDir(outputDir))) {\n if (!(await isDir(path.dirname(outputDir)))) {\n throw new Error(`## ${directoryName} directory does not exist: ${outputDir}`);\n } else {\n if (!quiet) {\n console.log(`## ${directoryName} directory does not exist. Creating directory: \"${outputDir}\"`);\n }\n await mkdir(outputDir);\n }\n }\n }\n\n getVhostConfigFileData(confData: Vhost, options?: { joinArray: false }): string[];\n getVhostConfigFileData(confData: Vhost, options?: { joinArray?: true }): string;\n getVhostConfigFileData(vhost: Vhost, options?: { joinArray?: boolean }): string | string[] {\n const { joinArray = false } = options || {};\n const confData = vhost.getData() ?? [];\n const hosts_list = vhost.reverseProxies?.size\n ? [...vhost.reverseProxies]\n ?.map(([key, value]) => `${key} => ${value?.host}:${value?.port}${value?.hostUri}`)\n .join(', ')\n : '';\n\n const dataArr = [\n `# Created at: ${getFullDateTime()}`,\n `# ID: ${vhost.id}`,\n `# HOST (s): ${hosts_list}`,\n `# GROUP: ${vhost?.meta?.group}`,\n `###################################`,\n `\\n\\n`,\n ...confData,\n ];\n\n return joinArray ? dataArr.join('\\n') : dataArr;\n }\n\n async generateVhostConfig(options: { vhosts: Vhost[]; destDir: string; quiet?: boolean }): Promise<void> {\n const { vhosts, destDir, quiet = false } = options;\n\n await this.ensureDir(destDir, { quiet, directoryName: 'Destination' });\n\n for (const vhost of vhosts) {\n const vhostConfData = this.getVhostConfigFileData(vhost, { joinArray: true });\n const fileName = vhost?.meta?.confFileName ?? `${vhost?.meta?.group}--${vhost.id}.conf`;\n const filePath = path.resolve(destDir, fileName);\n console.log(`Generating vhost config file: \"${filePath}\" ...`, vhostConfData);\n try {\n await writeFile(filePath, vhostConfData);\n } catch (error: any) {\n throw new Error(`Error writing vhost config file \"${filePath}\": ${error?.message}`, { cause: error });\n }\n }\n }\n\n async generate(options: SvhostNginxGenerateOptions & { file: string }): Promise<void>;\n async generate(options: SvhostNginxGenerateOptions & { srcDir: string }): Promise<void>;\n async generate(options: SvhostNginxGenerateOptions): Promise<void> {\n const { file, srcDir, outputDir, quiet = false, cleanDir = false } = options;\n\n try {\n if (!file && !srcDir) {\n throw new Error('Either \"file\" or \"srcDir\" must be provided.');\n }\n if (file && !(await isFile(file))) {\n throw new Error(`The specified file does not exist: ${file}`);\n }\n if (srcDir && !(await isDir(srcDir))) {\n throw new Error(`The specified source directory does not exist: ${srcDir}`);\n }\n\n await this.ensureDir(outputDir, { quiet, directoryName: 'output' });\n\n const vhosts: Vhost[] = [];\n if (!quiet) {\n console.log(1111, { file, srcDir });\n }\n\n if (file) {\n const vhostInstancesArray = await this.getVhostInstanceArray(file, { quiet });\n if (vhostInstancesArray?.length) {\n vhosts.push(...vhostInstancesArray);\n }\n }\n\n if (srcDir) {\n const vhostInstances = await this.getVhostInstances(srcDir, { quiet });\n if (!quiet) {\n console.log({ 'vhostInstances Count': vhostInstances.length });\n console.log(3333, vhostInstances);\n }\n vhosts.push(...vhostInstances);\n }\n if (cleanDir) {\n const paths = (await readdir(outputDir)).map((f) => path.resolve(outputDir, f));\n await Promise.all(paths.map((filePath) => rm(filePath, { recursive: true, force: true })));\n }\n await writeFile(path.resolve(outputDir, '.empty'), '8');\n\n if (!quiet) {\n console.log(`Total vhosts to generate: ${vhosts.length} . Output Directory: \"${outputDir}\"`);\n }\n\n // console.log(4444, 'Total vhosts to generate:', { vhosts, destDir: outputDir, quiet });\n\n await this.generateVhostConfig({ vhosts, destDir: outputDir, quiet });\n\n if (!quiet) {\n console.log(`Generated (${vhosts.length}) vhost configuration file(s) in \"${outputDir}\".`);\n }\n } catch (error) {\n throw new Error(`Error in generate method: \"${(error as Error).message}\"`, { cause: error });\n }\n }\n}\n","import { Dirent } from 'fs';\nimport fs from 'fs-extra';\nimport { constants, readdir } from 'fs/promises';\n// import { console } from 'inspector';\nimport path from 'path';\n\nexport async function exists(path: string): Promise<boolean> {\n try {\n return await fs.exists(path);\n } catch {\n return false;\n }\n}\n\nexport async function isFile(path: string): Promise<boolean> {\n try {\n return (await fs.stat(path)).isFile();\n } catch {\n return false;\n }\n}\n\nexport async function isDir(path: string): Promise<boolean> {\n try {\n return (await fs.stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function canRead(path: string): Promise<boolean> {\n try {\n await fs.access(path, constants.R_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function canWrite(path: string): Promise<boolean> {\n try {\n await fs.access(path, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function canReadWrite(path: string): Promise<boolean> {\n try {\n await fs.access(path, constants.R_OK | constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function inspectPath(targetPath: string) {\n try {\n const stats = await fs.stat(targetPath);\n\n const readable = await fs\n .access(targetPath, constants.R_OK)\n .then(() => true)\n .catch(() => false);\n const writable = await fs\n .access(targetPath, constants.W_OK)\n .then(() => true)\n .catch(() => false);\n\n return {\n exists: true,\n isFile: stats.isFile(),\n isDir: stats.isDirectory(),\n canRead: readable,\n canWrite: writable,\n canReadWrite: readable && writable,\n };\n } catch {\n // path does not exist\n const dir = path.dirname(targetPath);\n const canWriteParent = await fs\n .access(dir, constants.W_OK)\n .then(() => true)\n .catch(() => false);\n\n return {\n exists: false,\n isFile: false,\n isDir: false,\n canRead: false,\n canWrite: canWriteParent,\n canReadWrite: false,\n };\n }\n}\n\n/**\n * Read Directory\n */\nexport enum ReadDirReturnEnum {\n ABSOLUTE = 'absolute',\n RELATIVE = 'relative',\n DIRENT = 'dirent',\n ALL = 'all',\n}\n\nexport type ReadDirReturnType = 'absolute' | 'relative' | 'dirent' | 'all';\n\nexport type ReadDirOptionsBase = {\n recursive?: boolean;\n filesOnly?: boolean;\n dirsOnly?: boolean;\n encoding?: BufferEncoding | null;\n returnType?: ReadDirReturnType; // default = 'absolute'\n forwardSlashes?: boolean;\n ignorefile?: {\n path?: string;\n data?: string;\n };\n quiet?: boolean;\n includeIgnorefile?: boolean;\n};\n\nexport interface ReadDirectoryItem {\n name: string;\n absolutePath: string;\n relativePath: string;\n isFile: boolean;\n isDirectory: boolean;\n}\n\ntype ReadDirResult<T extends ReadDirReturnType> = T extends 'absolute'\n ? string[]\n : T extends 'relative'\n ? string[]\n : T extends 'dirent'\n ? Dirent[]\n : T extends 'all'\n ? ReadDirectoryItem[]\n : [];\n\nexport async function readDirectory<T extends ReadDirReturnType = 'absolute'>(\n dirPath: string,\n options?: ReadDirOptionsBase & { returnType?: ReadDirReturnType },\n): Promise<ReadDirResult<T>> {\n const {\n recursive = false,\n filesOnly = false,\n dirsOnly = false,\n returnType = 'absolute',\n forwardSlashes = false,\n ignorefile,\n quiet = true,\n includeIgnorefile = false,\n // encoding = 'utf8',\n } = options || {};\n return new Promise(async (resolve, reject) => {\n function normalize(path: string): string {\n return forwardSlashes ? path.replace(/\\\\/g, '/') : path; // Normalize Windows paths to use forward slashes\n }\n\n if (!quiet) {\n console.log(`Reading directory: ${dirPath}`, {\n recursive,\n filesOnly,\n dirsOnly,\n returnType,\n forwardSlashes,\n quiet,\n includeIgnorefile,\n ignorefile,\n });\n }\n\n try {\n if (!(await exists(dirPath))) {\n return reject(new Error(`Directory does not exist: ${dirPath}`));\n }\n if (!(await isDir(dirPath))) {\n return reject(new Error(`Path is not a directory: ${dirPath}`));\n }\n\n const files = await readdir(dirPath, { withFileTypes: true, recursive });\n let filteredFiles = files.filter((dirent) => {\n if (\n !includeIgnorefile &&\n dirent.name === '.ignore' &&\n path.resolve(dirPath) === path.resolve(dirent.parentPath)\n // .ignore is handled only at the top level directory\n ) {\n return false;\n }\n if (filesOnly) return dirent.isFile();\n if (dirsOnly) return dirent.isDirectory();\n return true;\n });\n\n /**\n * Handle ignore rules from .ignore file or (ignorefile option)\n */\n if (ignorefile?.data || ignorefile?.path || (await exists(path.join(dirPath, '.ignore')))) {\n if (!quiet) {\n console.log(`Applying ignore rules from: ${ignorefile?.path || 'provided data'}`);\n }\n let ignoreData = '';\n if (ignorefile?.data) {\n ignoreData = ignorefile.data;\n } else if (ignorefile?.path) {\n try {\n ignoreData = await fs.readFile(ignorefile.path, 'utf8');\n } catch (err) {\n if (!quiet) {\n console.warn(\n `Warning: Could not read ignorefile at ${ignorefile.path}: ${(err as Error).message}`,\n );\n }\n }\n } else {\n // Read from .ignore in dirPath\n try {\n ignoreData = await fs.readFile(path.join(dirPath, '.ignore'), 'utf8');\n } catch (err) {\n if (!quiet) {\n console.warn(\n `Warning: Could not read ignorefile at ${path.join(dirPath, '.ignore')}: ${\n (err as Error).message\n }`,\n );\n }\n }\n }\n\n if (ignoreData) {\n if (!quiet) {\n console.log('All .ignore data:\\n------------------------');\n console.log(ignoreData);\n console.log('------------------------');\n }\n let excludeData = '';\n let includeData = '';\n const extractLines = (data: string) => {\n const lines = data\n ?.replace(/(([ \\t]*)#.*$)/gm, '') // Remove comments\n ?.replace(/^([ \\t])*|([ \\t])*$/gm, '') // Trim lines\n ?.split(/\\r?\\n/)\n ?.filter((v) => v.length);\n\n return lines;\n };\n\n const matchRegExp = (line: string) => {\n return line.match(\n /RegExp[ \\s]*\\([ \\s]*['\"`](?<regex>.*)['\"`][ \\s]*,[ \\s]*['\"`](?<flags>.*)['\"`][ \\s]*\\)|RegExp[ \\s]*\\([ \\s]*['\"`](?<regex>.*)['\"`][ \\s]*\\)/m,\n );\n };\n\n const applyIgnoreRules = (filterLines: Dirent[], rules: string[], includeMatched: boolean) => {\n return filterLines.filter((dirent) => {\n const relativePath = normalize(\n path.relative(dirPath, path.resolve(dirent.parentPath, dirent.name)),\n );\n for (const rule of rules) {\n const checkIsRegExp = matchRegExp(rule);\n if (relativePath) {\n if (checkIsRegExp) {\n const regex = checkIsRegExp?.groups?.regex || '';\n const flags = checkIsRegExp?.groups?.flags || 'm';\n if (relativePath?.match(new RegExp(regex, flags))) {\n if (includeMatched) {\n if (!quiet) {\n console.log(\n `Included path \"${relativePath}\" \\t\\t via Regex(\"${regex}\",\"${flags}\") Match pattern.`,\n );\n }\n return true;\n } else {\n if (!quiet) {\n console.log(\n `Ignored path \"${relativePath}\" \\t\\t via Regex(\"${regex}\",\"${flags}\") Match pattern.`,\n );\n }\n return false;\n }\n }\n }\n const match = relativePath?.match(new RegExp(`^${rule}$`, 'gm'));\n if (match) {\n if (includeMatched) {\n if (!quiet) {\n console.log(`Included path \"${relativePath}\" \\t\\t via Match pattern.`);\n }\n return true;\n } else {\n if (!quiet) {\n console.log(`Ignored path \"${relativePath}\" \\t\\t via Match pattern.`);\n }\n return false;\n }\n }\n }\n }\n // return true;\n return includeMatched ? false : true;\n });\n };\n\n // Look for `EXCLUDE EXCLUDE EXCLUDE`\n const excludeLineExists = ignoreData.match(/^[ \\t]*#?[ \\t]*EXCLUDE EXCLUDE EXCLUDE[ \\t]*$/gm);\n if (excludeLineExists) {\n const excludeLineCommented = ignoreData.match(/^[ \\t]*#[ \\t]*EXCLUDE EXCLUDE EXCLUDE[ \\t]*$/gm);\n if (excludeLineCommented) {\n excludeData = ignoreData.replace(/^[ \\t]*#[ \\t]*EXCLUDE EXCLUDE EXCLUDE[ \\t]*.*/gms, '');\n } else {\n includeData = ignoreData.replace(/.*[ \\t]*EXCLUDE EXCLUDE EXCLUDE[ \\t]*$/gms, '');\n }\n }\n if (!quiet) {\n console.log('Include data:\\n------------------------');\n console.log(includeData);\n console.log('------------------------');\n console.log('Exclude data - EXCLUDE EXCLUDE EXCLUDE:\\n------------------------');\n console.log(excludeData);\n console.log('------------------------');\n }\n\n console.log('Applying exclude and include rules from .ignore file');\n console.log('Initial file count before applying ignore rules:', filteredFiles.length);\n if (excludeData) {\n const excludeLines = extractLines(excludeData);\n if (!quiet) {\n console.log('Exclude lines:', excludeLines);\n }\n filteredFiles = applyIgnoreRules(filteredFiles, excludeLines, false);\n }\n if (includeData) {\n const includeLines = extractLines(includeData);\n if (!quiet) {\n console.log('Include lines:', includeLines);\n }\n filteredFiles = applyIgnoreRules(filteredFiles, includeLines, true);\n }\n console.log('Final file count after applying ignore rules:', filteredFiles.length);\n }\n }\n\n const baseDir = path.resolve(dirPath);\n\n switch (returnType) {\n case ReadDirReturnEnum.ABSOLUTE: {\n const filePaths = filteredFiles.map((dirent) => {\n const absPath = path.join(dirent.parentPath, dirent.name);\n return normalize(absPath);\n });\n return resolve(filePaths as ReadDirResult<T>);\n }\n\n case ReadDirReturnEnum.RELATIVE: {\n const filePaths = filteredFiles.map((dirent) => {\n const absPath = path.join(dirent.parentPath, dirent.name);\n return normalize(path.relative(baseDir, absPath));\n });\n return resolve(filePaths as ReadDirResult<T>);\n }\n case ReadDirReturnEnum.DIRENT: {\n return resolve(filteredFiles as ReadDirResult<T>);\n }\n case ReadDirReturnEnum.ALL: {\n const filePaths = filteredFiles.map((dirent) => {\n const absPath = path.join(dirent.parentPath, dirent.name);\n return {\n name: dirent.name,\n absolutePath: normalize(absPath),\n relativePath: normalize(path.relative(baseDir, absPath)),\n isFile: dirent.isFile(),\n isDirectory: dirent.isDirectory(),\n };\n });\n return resolve(filePaths as ReadDirResult<T>);\n }\n default: {\n return reject(new Error(`Invalid returnType option: ${returnType}`));\n }\n }\n } catch (err) {\n reject(err);\n }\n });\n}\n\n////////////////////////////////////////\n\n/**\n * Commands to run this file directly for testing purposes\n *\n * npx ts-node src/lib/utils/fs-extra.ts\n *\n *\n * Expamples:\n */\n\n(async (run = false) => {\n const ignoreFileData = `\n# Ignore files and directories\n\ndir1\n\nEXCLUDE EXCLUDE EXCLUDE\nreact-app.yml\nRegExp(\"node-app.yml$\")\n\n`;\n if (run) {\n const testPath = 'src/classes/svhost-nginx/sample/data';\n const testFullPath = path.resolve(testPath);\n const dirContents = await readDirectory(testFullPath, {\n recursive: true,\n returnType: 'relative',\n forwardSlashes: true,\n filesOnly: false,\n quiet: false,\n ignorefile: {\n data: ignoreFileData,\n // path: path.resolve('src/lib/utils/.ignore'),\n },\n });\n console.log('Directory contents:', dirContents);\n }\n})(false);\n","import { SvhostNginx } from './SvhostNginx';\n\nexport class SvhostNginxHelper {\n private svhostNginx: SvhostNginx;\n constructor(svhostNginx: SvhostNginx) {\n this.svhostNginx = svhostNginx;\n }\n}\n","export function getFullDateTime(options?: { date?: Date; format?: 'email' | 'standard' }): string {\r\n // Get the current date and time\r\n const now = options?.date || new Date();\r\n const format = options?.format || 'standard';\r\n\r\n switch (format) {\r\n case 'email': {\r\n // Create an options object for formatting\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n timeZone: 'Asia/Kolkata',\r\n year: 'numeric',\r\n month: 'short',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false, // Use 24-hour format\r\n timeZoneName: 'longOffset',\r\n };\r\n\r\n // Format the date and time for IST\r\n const formatter = new Intl.DateTimeFormat('en-IN', dateOptions);\r\n const istTime = formatter.format(now);\r\n return istTime;\r\n // console.log(\"Current time in IST:\", istTime);\r\n }\r\n case 'standard': {\r\n const year = now.getFullYear();\r\n const month = String(now.getMonth() + 1).padStart(2, '0');\r\n const day = String(now.getDate()).padStart(2, '0');\r\n const hours = String(now.getHours()).padStart(2, '0');\r\n const minutes = String(now.getMinutes()).padStart(2, '0');\r\n const seconds = String(now.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n }\r\n }\r\n}\r\n\r\n// console.log(getFullDateTime({ format: 'email' }));\r\n// console.log(getFullDateTime());\r\n","import { load } from 'js-yaml';\r\nimport { readFile as fsReadFile, stat } from 'node:fs/promises';\r\nimport { resolve } from 'node:path';\r\nimport Ajv, { Options } from 'ajv';\r\n\r\nexport default class JsYaml {\r\n constructor() {}\r\n\r\n async _readFile(path: string): Promise<string> {\r\n if (!path || typeof path !== 'string') {\r\n throw new TypeError('Path must be a non-empty string');\r\n }\r\n\r\n const resolvedPath = resolve(path);\r\n const stats = await stat(resolvedPath);\r\n\r\n if (!stats.isFile()) {\r\n throw new Error(`Not a readable file: ${resolvedPath}`);\r\n }\r\n\r\n try {\r\n return await fsReadFile(resolvedPath, { encoding: 'utf8' });\r\n } catch (error) {\r\n const err = error as NodeJS.ErrnoException;\r\n\r\n if (err.code === 'EACCES' || err.code === 'EPERM') {\r\n throw new Error(`No read permission for file: ${resolvedPath}`, { cause: err });\r\n }\r\n throw new Error(`Error reading file: ${resolvedPath}`, { cause: err });\r\n }\r\n }\r\n\r\n _resolveVars(obj: any, vars: Record<string, string | number>) {\r\n return JSON.parse(JSON.stringify(obj), (_, v) =>\r\n typeof v === 'string' ? v.replace(/\\$\\{(\\w+)\\}/g, (_, k) => String(vars[k])) : v,\r\n );\r\n }\r\n\r\n async read(path: string): Promise<any> {\r\n const content = await this._readFile(path);\r\n const data = load(content) as any;\r\n return this._resolveVars(data, data?.vars);\r\n }\r\n\r\n /**\r\n * Load config and validate against schema from URL\r\n */\r\n /**\r\n * Note: This method is not implemented correctly.\r\n */\r\n // async validate<TData = VHostConfig>(options: {\r\n // configPath?: string;\r\n // schemaUrl: string;\r\n // data?: TData;\r\n // options?: Options;\r\n // }): Promise<TData>;\r\n // async validate<TData = VHostConfig>(options: {\r\n // configPath: string;\r\n // schemaUrl?: string;\r\n // data?: TData;\r\n // options?: Options;\r\n // }): Promise<TData>;\r\n // async validate<TData = VHostConfig>(options: {\r\n // configPath?: string;\r\n // schemaUrl?: string;\r\n // data?: TData;\r\n // options?: Options;\r\n // }): Promise<TData> {\r\n // try {\r\n // const { configPath, schemaUrl, options: ajvOptions = {}, data } = options;\r\n // let schema: unknown = {};\r\n // if (schemaUrl) {\r\n // const res = await fetch(schemaUrl);\r\n // if (!res.ok) throw new Error(`Failed to fetch ${schemaUrl}: ${res.status}`);\r\n // const text = await res.text();\r\n // schema = await load(text);\r\n // } else if (configPath) {\r\n // const content = await fsReadFile(configPath, 'utf8');\r\n // schema = await load(content);\r\n // } else {\r\n // throw new Error('Either schemaUrl or configPath must be provided');\r\n // }\r\n\r\n // /**\r\n // * Validate config\r\n // */\r\n // console.log(1111111111111, schema);\r\n\r\n // const ajv = new Ajv({ allErrors: true, strict: true, useDefaults: true, ...ajvOptions });\r\n // console.log(22222222222, ajv);\r\n\r\n // const validate = ajv.compile(schema as object);\r\n // console.log(33333333333, validate);\r\n\r\n // return validate as TData;\r\n // // return function validate(data: T) {\r\n // // return validate(data);\r\n // // };\r\n\r\n // // if (!validate(schema)) {\r\n // // throw new Error('Config validation failed:\\n' + ajv.errorsText(validate.errors, { separator: '\\n' }));\r\n // // }\r\n\r\n // // return rawConfig as T;\r\n // } catch (error) {\r\n // throw new Error(`Error loading config: ${(error as Error).message}`, { cause: error });\r\n // }\r\n // }\r\n}\r\n","import { Command as CommanderCommand } from 'commander';\n\nexport abstract class Command {\n abstract setupCommand(): Promise<CommanderCommand>;\n abstract run(): Promise<void>;\n}\n","interface ValidateRequiredOptions {\r\n notAllowed?: any[];\r\n message?: (key: string) => string;\r\n noEmptyArray?: boolean;\r\n noEmptyObject?: boolean;\r\n}\r\n\r\nexport function validateRequired(obj: { [key: string]: any }, options: ValidateRequiredOptions = {}) {\r\n const { notAllowed = [undefined, null, '', 0], message = (m) => `\"${m}\" is required.` } = options;\r\n if (typeof obj === 'object' && Object.keys(obj).length) {\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (notAllowed.includes(value)) {\r\n throw new Error(message(key));\r\n }\r\n if (options.noEmptyArray && Array.isArray(value) && value.length === 0) {\r\n throw new Error(`${key} cannot be an empty array.`);\r\n }\r\n if (options.noEmptyObject && value instanceof Object && Object.keys(value).length === 0) {\r\n throw new Error(`${key} cannot be an empty object.`);\r\n }\r\n });\r\n return;\r\n }\r\n throw new Error(`Invalid arg passed to \"validateRequired\"`);\r\n}\r\n\r\ninterface IndentOptions {\r\n tab?: number;\r\n joinArray?: boolean;\r\n tabSize?: number;\r\n}\r\n\r\nexport function indent(item: string | string[], options: IndentOptions = {}) {\r\n const { tab = 1, joinArray = false, tabSize = 4 } = options;\r\n if (typeof item === 'string') {\r\n return indent([item], options);\r\n } else if (Array.isArray(item)) {\r\n const tabSpace = ' '.repeat(tab * tabSize);\r\n const items = item.map((v) => `${tabSpace}${v}`);\r\n if (joinArray) {\r\n return items.join('\\n');\r\n }\r\n return items;\r\n } else {\r\n throw new Error('Argument passed to indent method should be string or string[].');\r\n }\r\n}\r\n","import { indent, validateRequired } from '../../lib';\n\n/**\n * Helper class to create Nginx Location Blocks\n */\n\nexport default class LocationBlock {\n location;\n order = 10;\n items: string[] = [];\n\n constructor(location: string) {\n validateRequired({\n location,\n });\n\n this.location = location;\n }\n\n setItem(item: string | string[] = '') {\n if (Array.isArray(item)) {\n this.items.push(...item);\n } else {\n this.items.push(item);\n }\n }\n\n setOrder(order: number) {\n this.order = order;\n }\n\n getData(options?: { joinArray?: boolean }) {\n const { joinArray = false } = options || {};\n\n const finalArr = [];\n finalArr.push(`location ${this.location} {`);\n finalArr.push(...indent(this.items));\n finalArr.push('}');\n\n return joinArray ? finalArr.join('\\n') : finalArr;\n }\n}\n","import { indent, validateRequired } from '../../lib';\nimport LocationBlock from './LocationBlock';\n\ninterface ReverseProxyOptions {\n host?: string;\n port: number;\n location?: string;\n hostUri?: string;\n headers?: Map<string, string>;\n resetHeader?: boolean;\n}\n\nexport default class ReverseProxy {\n host: string;\n port: number;\n location: string;\n hostUri: string;\n headers: Map<string, string>;\n private headerArgs: Map<string, string>;\n resetHeader: boolean;\n\n constructor(options: ReverseProxyOptions) {\n const {\n host = 'localhost',\n port,\n location = '/',\n hostUri = '/',\n headers = new Map(),\n resetHeader = false,\n } = options;\n\n validateRequired({ port }, { message: (v) => `\"${v}\" is required in ReverseProxy constructor.` });\n\n this.host = host;\n this.port = port;\n this.location = location;\n this.hostUri = hostUri;\n this.resetHeader = resetHeader;\n\n if (!(headers instanceof Map)) {\n throw new Error(`\"headers\" must be a Map`);\n }\n this.headers = new Map();\n this.headerArgs = headers;\n\n this.setDefaultHeaders();\n }\n\n /* =======================\n Mutators\n ======================= */\n\n setHost(host: string): void {\n this.host = host;\n }\n\n setPort(port: number): void {\n this.port = port;\n }\n\n setResetHeader(reset: boolean): void {\n this.resetHeader = reset;\n this.setDefaultHeaders();\n }\n\n setHeader(header: string, value: string): void {\n this.headers.set(header, value);\n }\n\n deleteHeader(header: string): void {\n this.headers.delete(header);\n }\n\n /* =======================\n Accessors\n ======================= */\n\n getHeader(header: string): string | undefined {\n return this.headers.get(header);\n }\n\n getHeaders(): Map<string, string> {\n return new Map(this.headers);\n }\n\n /* =======================\n Private Helper Methods\n ======================= */\n\n getHeadersList(): string[] {\n const headers: string[] = [];\n for (const [key, value] of this.headers.entries()) {\n headers.push(`${key} ${value};`);\n }\n return headers;\n }\n\n private setDefaultHeaders(props?: { reset: boolean }): void {\n const reset = props?.reset || false;\n\n // Set main Headers\n this.headers.clear();\n const headers = new Map<string, string>();\n headers.set('proxy_pass', `http://${this.host}:${this.port}${this.hostUri}`);\n\n if (!reset) {\n if (!this.resetHeader) {\n headers.set('proxy_set_header Host', '$host');\n headers.set('proxy_set_header X-Real-IP', '$remote_addr');\n headers.set('proxy_set_header X-Forwarded-Host', '$http_host');\n headers.set('proxy_set_header X-Forwarded-Proto', '$scheme');\n headers.set('proxy_set_header X-Forwarded-For', '$proxy_add_x_forwarded_for');\n headers.set('proxy_cache_bypass', '$http_upgrade');\n\n // add support for websockets\n headers.set('proxy_http_version', '1.1');\n headers.set('proxy_set_header Upgrade', '$http_upgrade');\n headers.set('proxy_set_header Connection', 'upgrade');\n }\n\n this.headers = new Map([...headers, ...this.headerArgs]);\n }\n }\n\n /* =======================\n Nginx Config Helpers\n ======================= */\n\n getData(options: { joinArray?: boolean } = {}) {\n const { joinArray = false } = options;\n const headers = this.getHeadersList();\n\n const locationBlock = new LocationBlock(this.location);\n locationBlock.setItem(headers);\n\n return locationBlock.getData({ joinArray });\n }\n}\n","import { indent } from '../../lib';\nimport LocationBlock from './LocationBlock';\n\nexport default class ServerBlock {\n serverItems: string[] = [];\n sslItems: string[] = [];\n locationBlocks: LocationBlock[] = [];\n redirectItems: string[] = [];\n\n addServerItem(item: string | string[]) {\n if (Array.isArray(item)) {\n this.serverItems.push(...item);\n } else {\n this.serverItems.push(item);\n }\n }\n\n addSslItem(item: string | string[]) {\n if (Array.isArray(item)) {\n this.sslItems.push(...item);\n } else {\n this.sslItems.push(item);\n }\n }\n\n addLocationBlock(block: LocationBlock | null = null) {\n if (block && block instanceof LocationBlock) {\n this.locationBlocks.push(block);\n }\n }\n\n addRedirectItem(item: string | string[]) {\n if (Array.isArray(item)) {\n this.redirectItems.push(...item);\n } else {\n this.redirectItems.push(item);\n }\n }\n\n getData(options: { joinArray?: boolean } = {}) {\n const { joinArray = false } = options;\n\n const finalArr = [];\n finalArr.push('server {');\n\n // 1. Server Items\n finalArr.push(...indent(this.serverItems));\n\n // 2. SSL Items\n if (this.sslItems?.length) {\n finalArr.push('\\n');\n this.sslItems.forEach((sslItem) => {\n finalArr.push(indent(sslItem));\n });\n }\n\n // 3. Either `Redirect Items` or `Location Blocks`\n\n if (this.redirectItems?.length) {\n finalArr.push('\\n');\n this.redirectItems.forEach((redirectItem) => {\n finalArr.push(indent(redirectItem));\n });\n } else if (this.locationBlocks?.length) {\n const orderedLocationBlocks = this.locationBlocks.toSorted((a, b) => {\n return a.order - b.order;\n });\n finalArr.push('');\n orderedLocationBlocks.forEach((block) => {\n finalArr.push('');\n finalArr.push(...indent(block.getData()));\n });\n }\n\n finalArr.push('}');\n return joinArray ? finalArr.join('\\n') : finalArr;\n }\n}\n","// import ReverseProxy from './ReverseProxy.mjs';\n// import { getDate, indent, validateRequired } from './../utils.mjs';\n// import ServerBlock from './ServerBlock.mjs';\n// import LocationBlock from './LocationBlock.mjs';\n// import { writeFile } from '../fileUtils.mjs';\n\nimport { validateRequired } from '../../lib';\nimport LocationBlock from './LocationBlock';\nimport ReverseProxy from './ReverseProxy';\nimport ServerBlock from './ServerBlock';\n\nexport type VhostAppType = 'reverseProxy' | 'html' | 'react' | 'node' | 'react-node' | 'php' | 'python';\n\ntype VhostSslType = boolean | { crt: string; key: string };\n// Default: false\n// true => use Let's Encrypt certs using sslCertificateName\n// false => no SSL\n// {crt, key} => use custom certs\n\nexport interface VhostArgs {\n id: string;\n domainName: string;\n tld?: string;\n serverNames: string[];\n redirectToFirstServer?: boolean;\n appType?: VhostAppType;\n\n reverseProxies?: Map<string, ReverseProxy>;\n\n ssl?: VhostSslType;\n sslCertificateName?: string;\n redirectToHttps?: boolean;\n\n // Fixed values\n rootDirectory?: string;\n http_port?: number;\n https_port?: number;\n\n meta?: VhostMeta;\n}\n\nexport interface VhostMeta {\n confFileName?: string;\n group?: string;\n}\n\nexport default class Vhost {\n id: string;\n domainName: string;\n tld: string;\n serverNames: string[];\n redirectToFirstServer: boolean;\n\n appType: VhostAppType;\n\n reverseProxies?: Map<string, ReverseProxy>;\n\n ssl: boolean | { crt: string; key: string };\n sslCertificateName: string;\n redirectToHttps: boolean;\n\n rootDirectory: string;\n http_port: number;\n https_port: number | string;\n\n meta?: VhostMeta;\n\n constructor(args: VhostArgs) {\n const {\n id,\n domainName = '',\n tld = 'com',\n serverNames = [],\n redirectToFirstServer = true,\n appType = 'reverseProxy',\n\n reverseProxies = new Map<string, ReverseProxy>(),\n\n ssl = false,\n sslCertificateName, // required if `ssl` is empty array\n redirectToHttps = false,\n\n rootDirectory = '/var/www/html',\n http_port = 80,\n https_port = `443 ssl`,\n\n meta,\n } = args || {};\n\n validateRequired(\n {\n id,\n domainName,\n tld,\n serverNames,\n rootDirectory,\n appType,\n http_port,\n https_port,\n },\n {\n noEmptyArray: true,\n noEmptyObject: true,\n },\n );\n\n this.reverseProxies = reverseProxies;\n\n if (!Array.isArray(serverNames) || serverNames.length === 0) {\n throw new Error(`\"serverNames\" must be a non-empty array of server-names`);\n }\n\n this.id = id;\n this.domainName = domainName;\n this.tld = tld;\n this.serverNames = serverNames;\n this.redirectToFirstServer = redirectToFirstServer;\n this.appType = appType;\n this.ssl = ssl;\n this.sslCertificateName = sslCertificateName ?? `${domainName}.${tld}`;\n this.redirectToHttps = redirectToHttps;\n this.rootDirectory = rootDirectory;\n this.http_port = http_port;\n this.https_port = https_port;\n\n this.meta = meta ?? {};\n this.meta.group = this.meta?.group ?? 'default';\n\n // this.leSslFolderName = \"\";\n // this.sslCertificateFile = \"\";\n // this.sslCertificateKeyFile = \"\";\n }\n\n /* ========================\n Reverse Proxy\n ======================== */\n\n setReverseProxy(reverseProxy: ReverseProxy) {\n if (reverseProxy instanceof ReverseProxy) {\n if (reverseProxy?.location) {\n if (this.reverseProxies) {\n this.reverseProxies.set(reverseProxy?.location, reverseProxy);\n } else {\n const errMsg = `Error: Server ID: ${this.id} - reverseProxies Map is not initialized.`;\n console.error(errMsg);\n throw new Error(errMsg);\n }\n return;\n }\n }\n console.warn('Error: Server ID: ${this.id} - Invalid reverseProxy passed', JSON.stringify(reverseProxy));\n }\n\n /* ========================\n Location Blocks\n ======================== */\n\n getLocationBlocks() {\n const locationBlocks = [];\n if (this.reverseProxies?.size && this.reverseProxies instanceof Map) {\n this.reverseProxies?.forEach((rp) => {\n const locationBlock = new LocationBlock(rp.location);\n locationBlock.setItem(rp.getHeadersList());\n locationBlocks.push(locationBlock);\n });\n } else {\n // This will be used for non-reverse-proxy vhosts\n const locationBlock = new LocationBlock('/');\n locationBlock.setItem('try_files $uri $uri/ =404;');\n locationBlocks.push(locationBlock);\n }\n return locationBlocks;\n }\n\n /* ========================\n Server Block Creation\n ======================== */\n\n createServerBlock(\n options: {\n joinArray?: boolean;\n serverDirectives?: string[];\n addSslCertificates?: boolean;\n redirects?: string[];\n locationBlocks?: LocationBlock[];\n } = {},\n ) {\n const {\n joinArray = false,\n serverDirectives = [],\n addSslCertificates = false,\n redirects = [],\n locationBlocks = [],\n } = options;\n\n const serverBlock = new ServerBlock();\n\n if (serverDirectives?.length) {\n serverDirectives.forEach((directive) => {\n serverBlock.addServerItem(directive);\n });\n }\n\n if (addSslCertificates) {\n const sslDirectives: string[] = [\n // ``,\n // `ssl_session_cache shared:le_nginx_SSL:30m;`,\n // `keepalive_timeout 120;`,\n // `ssl_protocols TLSv1.2 TLSv1.3;`, // TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;\n // `ssl_prefer_server_ciphers on;`,\n // `ssl_ciphers HIGH:!aNULL:!MD5;`,\n ];\n if (this.ssl === undefined) {\n throw new Error(\n `Please provide/set valid value for \"this.ssl\" in 'Vhost' constructor, if you want to redirect to HTTPS`,\n );\n }\n if (this.ssl === true) {\n serverBlock.addSslItem([\n `ssl_certificate /etc/letsencrypt/live/${this.sslCertificateName}/fullchain.pem;`,\n `ssl_certificate_key /etc/letsencrypt/live/${this.sslCertificateName}/privkey.pem;`,\n ...sslDirectives,\n ]);\n } else if (this.ssl === false) {\n // do nothing\n } else if (typeof this.ssl === 'object') {\n serverBlock.addSslItem([\n `ssl_certificate ${this.ssl?.crt};`,\n `ssl_certificate_key ${this.ssl?.key};`,\n ...sslDirectives,\n ]);\n } else {\n throw new Error('Something Went Wrong in SSL Directives.');\n }\n }\n\n if (redirects?.length) {\n serverBlock.addRedirectItem(redirects);\n } else {\n const defaultLocationBlocks = this.getLocationBlocks();\n const allLocationBlocks = [...defaultLocationBlocks, ...locationBlocks].sort((a, b) => {\n return a?.order - b?.order;\n });\n\n if (allLocationBlocks?.length) {\n allLocationBlocks.forEach((block) => {\n serverBlock.addLocationBlock(block);\n });\n }\n }\n\n // serverBlock.addLocationItem(this.getLocationDirectives());\n return serverBlock.getData({ joinArray });\n }\n\n /* ========================\n Directives\n ======================== */\n\n getIndexDirective() {\n const indexFiles = `index index.html index.htm`;\n switch (this.appType) {\n case 'reverseProxy': {\n return `${indexFiles};`;\n }\n case 'html': {\n return `${indexFiles};`;\n }\n case 'react': {\n return `${indexFiles};`;\n }\n case 'node': {\n return `${indexFiles};`;\n }\n case 'react-node': {\n return `${indexFiles};`;\n }\n case 'php': {\n return `index.php ${indexFiles};`;\n }\n case 'python': {\n return `index.py ${indexFiles};`;\n }\n default: {\n return `${indexFiles}; # Default`;\n }\n }\n }\n\n getServerDirectives(\n options: {\n serverNames?: string[];\n redirect?: boolean;\n port?: number | string;\n } = {},\n ) {\n const { serverNames, redirect = false, port = this.http_port } = options;\n\n let arr = [`listen ${port};`, `listen [::]:${port};`, ``, `server_name ${serverNames?.join(' ')};`];\n\n if (!redirect) {\n arr.push(``, this.getIndexDirective(), `root ${this.rootDirectory};`);\n }\n\n return arr;\n }\n\n _generateFullServerBlock(options: {\n redirectHttps: boolean;\n redirectWWW: boolean;\n port: number | string;\n onlyFirstServerName?: boolean;\n }) {\n const { redirectHttps = false, redirectWWW = false, port, onlyFirstServerName = false } = options || {};\n\n const redirects = [];\n\n if (redirectHttps || redirectWWW) {\n const httpSecured = redirectHttps || port === this.https_port ? 's' : '';\n const serverName = redirectWWW ? this.serverNames?.[0] : '$host';\n\n redirects.push(`return 301 http${httpSecured}://${serverName}$request_uri;`);\n }\n\n const serverNames = redirectWWW ? this.serverNames?.slice(1) : this.serverNames;\n const block = this.createServerBlock({\n serverDirectives: this.getServerDirectives({\n serverNames: onlyFirstServerName ? [serverNames?.[0]] : serverNames,\n port,\n redirect: redirectHttps || redirectWWW,\n }),\n addSslCertificates: Boolean(this.ssl && port === this.https_port),\n redirects: redirects?.length ? redirects : undefined,\n });\n return block;\n }\n\n /* ========================\n VHost Creation (createVHost())\n ======================== */\n\n getData(options?: { joinArray: false }): string[];\n getData(options?: { joinArray?: true }): string;\n getData(options?: { joinArray?: boolean }): string | string[] {\n const { joinArray = false } = options ?? {};\n\n const serverBlocks: any[] = [];\n\n const serverNames = this.serverNames;\n const redirectToFirtServerName =\n this.redirectToFirstServer && this.serverNames?.length > 1 ? this.serverNames?.[0] : '';\n const redirectToHttps = this.redirectToHttps;\n\n if (!redirectToHttps) {\n if (!redirectToFirtServerName) {\n console.log(22222222222222, { redirectToHttps, redirectToFirtServerName, serverNames });\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: false,\n redirectWWW: false,\n }),\n );\n\n if (Boolean(this.ssl)) {\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: false,\n redirectWWW: false,\n }),\n );\n }\n } else {\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: false,\n redirectWWW: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: false,\n redirectWWW: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: false,\n redirectWWW: false,\n onlyFirstServerName: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: false,\n redirectWWW: false,\n onlyFirstServerName: true,\n }),\n );\n }\n } else {\n if (!redirectToFirtServerName) {\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: true,\n redirectWWW: false,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: false,\n redirectWWW: false,\n }),\n );\n } else {\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: true,\n redirectWWW: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: true,\n redirectWWW: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.http_port,\n redirectHttps: true,\n redirectWWW: false,\n onlyFirstServerName: true,\n }),\n );\n\n serverBlocks.push(\n this._generateFullServerBlock({\n port: this.https_port,\n redirectHttps: false,\n redirectWWW: false,\n onlyFirstServerName: true,\n }),\n );\n }\n }\n\n const serverBlocksArr = (\n options: {\n joinArray?: boolean;\n } = {},\n ) => {\n const { joinArray = false } = options;\n const arr: any[] = [];\n serverBlocks?.map((serverBlock, i) => {\n arr.push(...serverBlock);\n if (i + 1 < serverBlocks?.length) {\n arr.push('');\n }\n });\n return joinArray ? arr?.join(`\\n`) : arr;\n };\n return serverBlocksArr({ joinArray });\n }\n\n /* ========================\n File Generation\n ======================== */\n\n // async generateServerConfFile() {\n // const data = this.createVHost({\n // joinArray: true,\n // });\n\n // const HOSTS = new Set();\n // if (this.isReverseProxy) {\n // this.reverseProxies?.forEach((rp) => {\n // if (rp?.host) {\n // HOSTS.add(rp?.host);\n // }\n // });\n // }\n // // console.log(11111111, data);\n\n // const HOSTS_STR = HOSTS.size ? [...HOSTS].join(', ') : '';\n\n // const dataArr = [\n // `# Created at: ${getDate()}`,\n // `# ID: ${this.id}`,\n // `# HOST: ${HOSTS_STR}`,\n // `###################################`,\n // `\\n\\n`,\n // data,\n // ];\n // const fileName = this.id + '.conf';\n // // writeFile(fileName, dataArr.join('\\n'));\n // }\n}\n\n// npx ts-node src/classes/vhost/sample/vhost.ts\n","import { Command } from '../../lib';\nimport { Command as CommanderCommand } from 'commander';\nimport { isDir, isFile } from '../../lib/utils/fs-extra';\nimport path from 'path';\nimport { SvhostNginx } from './SvhostNginx';\n// import { SvhostNginxHelper } from './SvhostNginxHelper';\n\nexport class SvhostNginxCli extends Command {\n // private helper: SvhostNginxHelper;\n private quiet: boolean = true;\n\n constructor() {\n super();\n // this.helper = new SvhostNginxHelper(this);\n }\n\n setupCommand(): Promise<CommanderCommand> {\n const program = new CommanderCommand();\n program.name('svhost-nginx').description('Nginx - Simple Virtual Host').version('1.0.0');\n\n program\n .description('Generate Nginx configuration for a virtual host')\n .option('-f, --src-file <srcFile>', 'Source file for configuration')\n .option('--src-dir <srcDir>', 'Source directory for configuration')\n .requiredOption('-d, --dest-dir <destDir>', 'Destination directory for configuration')\n .action(this.actionDefault.bind(this));\n\n return program.parseAsync(process.argv);\n }\n\n async run(options?: { quiet?: boolean }): Promise<void> {\n const { quiet = true } = options || {};\n this.quiet = quiet;\n await this.setupCommand();\n }\n\n async actionDefault(name: { [key: string]: string }, options: any, command: CommanderCommand) {\n const { srcFile, srcDir, destDir } = name;\n if (!this.quiet) {\n console.log('Commander:', { name, command });\n }\n\n if (srcFile && srcDir) {\n throw new Error('Please provide either --src-file or --src-dir, not both.');\n }\n\n if (!srcFile && !srcDir) {\n throw new Error('Please provide either --src-file or --src-dir.');\n }\n\n // Implement the logic to generate Nginx configuration here using srcFile/srcDir and destDir\n const srcFilePath = path.resolve(srcFile || '');\n const srcDirPath = path.resolve(srcDir || '');\n const destDirPath = path.resolve(destDir);\n\n if (!this.quiet) {\n console.table({\n 'Source File': srcFilePath,\n 'Source Directory': srcDirPath,\n 'Destination Directory': destDirPath,\n });\n }\n if (srcFile && !(await isFile(srcFile))) {\n throw new Error(`Source file does not exist: \"${srcFile}\"`);\n }\n\n if (srcDir && !(await isDir(srcDir))) {\n throw new Error(`Source directory does not exist: \"${srcDir}\"`);\n }\n\n console.log(`Generating Nginx configuration ...`);\n const svhostNginx = new SvhostNginx();\n if (srcFile) {\n await svhostNginx.generate({\n file: srcFilePath,\n outputDir: destDirPath,\n quiet: this.quiet,\n cleanDir: true,\n });\n } else if (srcDir) {\n await svhostNginx.generate({\n srcDir: srcDirPath,\n outputDir: destDirPath,\n quiet: this.quiet,\n cleanDir: true,\n });\n }\n\n if (!this.quiet) {\n console.log('option1 action executed');\n console.log('Name:', name, typeof name);\n // console.log('Options:', options);\n }\n }\n}\n","#!/usr/bin/env node\n\nimport { SvhostNginxCli } from './index';\n\nconst cli = new SvhostNginxCli();\n\ncli.run()\n .then(() => {\n // console.log('CLI executed successfully');\n process.exit(0);\n })\n .catch((e: any) => {\n console.error('Error executing CLI:', e);\n process.exit(1);\n });\n\n// npm run build && node dist/svhostNginx.js\n\n// npm run build && node dist/svhostNginx.js -d \"src/classes/svhost-nginx/sample/output.cli\" -f \"src/classes/svhost-nginx/sample/data/dir3/react-app.ts\"\n"],"mappings":"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","names":["import_path","import_fs_extra","import_promises","import_path","exists","path","fs","isFile","isDir","readDirectory","dirPath","options","recursive","filesOnly","dirsOnly","returnType","forwardSlashes","ignorefile","quiet","includeIgnorefile","resolve","reject","normalize","path","exists","isDir","filteredFiles","dirent","ignoreData","fs","err","excludeData","includeData","extractLines","data","v","matchRegExp","line","applyIgnoreRules","filterLines","rules","includeMatched","relativePath","rule","checkIsRegExp","regex","flags","excludeLines","includeLines","baseDir","filePaths","absPath","run","ignoreFileData","testFullPath","dirContents","SvhostNginxHelper","svhostNginx","getFullDateTime","options","now","dateOptions","year","month","day","hours","minutes","seconds","import_promises","import_js_yaml","import_promises","import_node_path","JsYaml","path","resolvedPath","fsReadFile","error","err","obj","vars","_","v","k","content","data","Command","validateRequired","obj","options","notAllowed","message","m","key","value","indent","item","tab","joinArray","tabSize","tabSpace","items","v","LocationBlock","location","validateRequired","item","order","options","joinArray","finalArr","indent","ReverseProxy","options","host","port","location","hostUri","headers","resetHeader","validateRequired","v","reset","header","value","key","props","joinArray","locationBlock","LocationBlock","ServerBlock","item","block","LocationBlock","options","joinArray","finalArr","indent","sslItem","redirectItem","orderedLocationBlocks","a","b","Vhost","args","id","domainName","tld","serverNames","redirectToFirstServer","appType","reverseProxies","ssl","sslCertificateName","redirectToHttps","rootDirectory","http_port","https_port","meta","validateRequired","reverseProxy","ReverseProxy","errMsg","locationBlocks","rp","locationBlock","LocationBlock","options","joinArray","serverDirectives","addSslCertificates","redirects","serverBlock","ServerBlock","directive","sslDirectives","allLocationBlocks","a","b","block","indexFiles","redirect","port","arr","redirectHttps","redirectWWW","onlyFirstServerName","httpSecured","serverName","serverBlocks","redirectToFirtServerName","i","SvhostNginx","props","SvhostNginxHelper","yamlFilePath","options","quiet","yamlConfig","JsYaml","vhostsData","defaultMeta","vhost","vhosts","vhostData","newVhostData","Vhost","reverseProxyItem","pathKey","proxyConfig","reverseProxy","ReverseProxy","error","filePath","isFile","dirPath","files","readDirectory","file","fullPath","path","vhostArray","outputDir","directoryName","isDir","joinArray","confData","hosts_list","key","value","dataArr","getFullDateTime","destDir","vhostConfData","fileName","srcDir","cleanDir","vhostInstancesArray","vhostInstances","paths","f","import_commander","import_path","SvhostNginxCli","Command","program","CommanderCommand","options","quiet","name","command","srcFile","srcDir","destDir","srcFilePath","path","srcDirPath","destDirPath","isFile","isDir","svhostNginx","SvhostNginx","cli","SvhostNginxCli","e"]}
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env node
2
- import { i as e, k as o } from './chunk-JW5IYKN2.mjs';
3
- import { b as n } from './chunk-OVT4E7N5.mjs';
4
- var i = n(() => {
5
- o();
6
- var c = new e();
7
- c.run()
8
- .then(() => {
9
- process.exit(0);
10
- })
11
- .catch((r) => {
12
- console.error('Error executing CLI:', r), process.exit(1);
13
- });
14
- });
15
- export default i();
16
- //# sourceMappingURL=svhostNginx.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/svhost-nginx/index.cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { SvhostNginxCli } from './index';\n\nconst cli = new SvhostNginxCli();\n\ncli.run()\n .then(() => {\n // console.log('CLI executed successfully');\n process.exit(0);\n })\n .catch((e: any) => {\n console.error('Error executing CLI:', e);\n process.exit(1);\n });\n\n// npm run build && node dist/svhostNginx.js\n\n// npm run build && node dist/svhostNginx.js -d \"src/classes/svhost-nginx/sample/output.cli\" -f \"src/classes/svhost-nginx/sample/data/dir3/react-app.ts\"\n"],"mappings":";yFAAA,IAAAA,EAAAC,EAAA,KAEAC,IAEA,IAAMC,EAAM,IAAIC,EAEhBD,EAAI,IAAI,EACH,KAAK,IAAM,CAER,QAAQ,KAAK,CAAC,CAClB,CAAC,EACA,MAAOE,GAAW,CACf,QAAQ,MAAM,uBAAwBA,CAAC,EACvC,QAAQ,KAAK,CAAC,CAClB,CAAC","names":["require_index_cli","__commonJSMin","init_svhost_nginx","cli","SvhostNginxCli","e"]}