fullstx 1.0.1 → 1.0.3

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.
package/README.md CHANGED
@@ -15,9 +15,9 @@ A high-performance, custom backend framework with a static file frontend. Equipp
15
15
  Scaffold a new Fullstx project instantly:
16
16
 
17
17
  ```bash
18
- npm create fullstx-app my-project
18
+ npm create fullstx@latest my-app
19
19
  # or
20
- npx create-fullstx-app my-project
20
+ npx create-fullstx@latest my-app
21
21
  ```
22
22
 
23
23
  Then run your app:
package/dist/index.js CHANGED
@@ -66,7 +66,7 @@ ${h}
66
66
  `:`Running ${r.duration}s ${x} @ ${r.url}${d}
67
67
  ${h}
68
68
  `;f(w),r.workers?c():r.amount?s=E6(e,t,r):a=D6(e,t,r),p()}}),e.on("done",d=>{if(t.renderResultsTable===!1)return;let h=b6(d,t);t.outputStream.write(h)});function c(){u=v6()}function l(){u&&(clearInterval(u),u=null)}function p(){if(!o){if(o=!0,r.workers){e.prependOnceListener("done",l);return}t.outputStream.isTTY&&(r.amount?(e.on("response",()=>{s.tick()}),e.on("reqError",()=>{s.tick()}),e.on("done",()=>{s.tick(r.amount-1)}),process.once("SIGINT",()=>{s.tick(r.amount-1)})):(e.on("tick",()=>{a.tick()}),e.on("done",()=>{a.tick(r.duration-1)}),process.once("SIGINT",()=>{a.tick(r.duration-1)})))}}function f(d){C1&&t.outputStream.write(d+`
69
- `)}}function D6(e,t,n){if(!t.outputStream.isTTY)return;let i=new S1(t.progressBarString,{width:20,incomplete:" ",total:n.duration,clear:!0,stream:t.outputStream});return i.tick(0),i}function E6(e,t,n){if(!t.outputStream.isTTY)return;let i=new S1(t.progressBarString,{width:20,incomplete:" ",total:n.amount,clear:!0,stream:t.outputStream});return i.tick(0),i}A1.exports=w6});var _1=m((vP,k1)=>{"use strict";var Cs=require("events").EventEmitter,{isMainThread:C6}=ir(),S6=N0(),A6=Ju(),k6=ns(),_6=g1(),F6=ql();function T6(e,t){return!(typeof t=="function")&&!e.forever?e.warmup?R6(e):I6(e):Ss(e,null,t)}function I6(e){let t=new Cs,n=new Promise((i,r)=>{Ss(e,t,(a,s)=>{if(a)return r(a);i(s)})});return t.then=n.then.bind(n),t.catch=n.catch.bind(n),t}function R6(e){let t={...e,...e.warmup,warmupRunning:!0,renderResultsTable:!1},n=new Cs,i=new Cs,r=new Promise((a,s)=>{Ss(t,i,(o,u)=>{if(o)return s(o);Ss(e,n,(c,l)=>{if(c)return s(c);l.warmup=u,a(l)})})});return n.then=r.then.bind(r),n.catch=r.catch.bind(r),n}function Ss(e,t,n){let i=typeof n=="function";n=n||k6,t=t||new Cs,e=A6(e,i);function r(a,s){if(a)return i?n(a):setImmediate(()=>t.emit("error",a));t.emit("done",s),n(null,s),!a&&e.json&&console.log(JSON.stringify(s))}return e instanceof Error?(r(e),t):(t.opts=e,e.workers&&C6?S6(e,t,r):_6(e,t,r),e[Symbol.for("internal")]&&(!e.json||!process.stdout.isTTY)&&F6(t,e),t)}k1.exports=T6});var I1=m((bP,T1)=>{"use strict";var O6=ws(),F1={warmup:{c:"connections",d:"duration"}};function B6(e){let t=O6(e);function n(a){return t[a]}function i(a,s){return a[s]}function r(a,s){let o=t[s];for(let u in o)i(a,u)&&(o[a[u]]=o[u])}for(let a in F1){let s=F1[a];n(a)&&r(s,a)}return t}T1.exports=B6});var R1=m((yP,q6)=>{q6.exports={name:"autocannon",version:"8.0.0",description:"Fast HTTP benchmarking tool written in Node.js",main:"autocannon.js",bin:{autocannon:"autocannon.js"},scripts:{test:"standard && tap test/serial/*.test.js test/*.test.js","standard:fix":"standard --fix"},"pre-commit":["test"],repository:{type:"git",url:"git+https://github.com/mcollina/autocannon.git"},keywords:["http","soak","load","fast","wrk","ab","test"],author:"Matteo Collina <hello@matteocollina.com>",contributors:["Glen Keane <glenkeane.94@gmail.com>","Donald Robertson <donaldarobertson89@gmail.com","Salman Mitha <SalmanMitha@gmail.com>"],license:"MIT",bugs:{url:"https://github.com/mcollina/autocannon/issues"},homepage:"https://github.com/mcollina/autocannon#readme",devDependencies:{"ansi-regex":"^5.0.1",bl:"^6.0.0",busboy:"^0.3.1","pre-commit":"^1.1.2",proxyquire:"^2.1.3",sinon:"^15.0.0",split2:"^4.0.0",standard:"^17.0.0",tap:"^16.0.0","why-is-node-running":"^2.3.0"},dependencies:{"@minimistjs/subarg":"^1.0.0",chalk:"^4.1.0","char-spinner":"^1.0.1","cli-table3":"^0.6.0","color-support":"^1.1.1","cross-argv":"^2.0.0","form-data":"^4.0.0","has-async-hooks":"^1.0.0","hdr-histogram-js":"^3.0.0","hdr-histogram-percentiles-obj":"^3.0.0","http-parser-js":"^0.5.2",hyperid:"^3.0.0","lodash.chunk":"^4.2.0","lodash.clonedeep":"^4.5.0","lodash.flatten":"^4.4.0","manage-path":"^2.0.0","on-net-listen":"^1.1.1","pretty-bytes":"^5.4.1",progress:"^2.0.3",reinterval:"^1.1.0",retimer:"^3.0.0",semver:"^7.3.2",timestring:"^6.0.0"}}});var q1=m((wP,rn)=>{"use strict";var L6=Kp(),kn=require("fs"),j6=require("os"),P6=require("net"),jl=require("path"),Di=require("url").URL,N6=require("child_process").spawn,M6=id(),U6=ad(),H6=pd(),z6=iu(),Ll=_1(),V6=ql(),W6=I1(),{checkURL:G6,ofURL:As}=Ia(),{parseHAR:Z6}=_u(),Y6=Ta(),X6=Ju();typeof Di!="function"&&(console.error("autocannon requires the WHATWG URL API, but it is not available. Please upgrade to Node 6.13+."),process.exit(1));rn.exports=Ll;rn.exports.track=V6;rn.exports.start=B1;rn.exports.printResult=z6;rn.exports.parseArguments=O1;rn.exports.aggregateResult=function(t,n={}){if(!Array.isArray(t))throw new Error('"results" must be an array of results');if(n=X6(n,!1),n instanceof Error)throw n;return Y6(t,n)};var J6={connections:"c",pipelining:"p",timeout:"t",duration:"d",sampleInt:"L",amount:"a",json:"j",renderLatencyTable:["l","latency"],onPort:"on-port",method:"m",headers:["H","header"],body:"b",form:"F",servername:"s",bailout:"B",input:"i",maxConnectionRequests:"M",maxOverallRequests:"O",connectionRate:"r",overallRate:"R",ignoreCoordinatedOmission:"C",reconnectRate:"D",renderProgressBar:"progress",renderStatusCodes:"statusCodes",title:"T",verbose:"V",version:"v",forever:"f",idReplacement:"I",socketPath:"S",excludeErrorStats:"x",expectBody:"E",workers:"w",warmup:"W",help:"h"},K6={connections:10,timeout:10,pipelining:1,duration:10,sampleInt:1e3,reconnectRate:0,renderLatencyTable:!1,renderProgressBar:!0,renderStatusCodes:!1,json:!1,forever:!1,method:"GET",idReplacement:!1,excludeErrorStats:!1,debug:!1,workers:0,verbose:!0};function O1(e){let t=H6(e,{boolean:["json","n","help","renderLatencyTable","renderProgressBar","renderStatusCodes","forever","idReplacement","excludeErrorStats","onPort","debug","ignoreCoordinatedOmission","verbose"],alias:J6,default:K6,"--":!0});if(t=W6(t),t.url=t._.length>1?t._:t._[0],t["--"][0]==="node"&&(t.onPort=!0),t.onPort&&(t.spawn=t["--"]),t.n&&(t.renderProgressBar=!1,t.renderResultsTable=!1,t.renderStatusCodes=!1),t.version){console.log("autocannon","v"+R1().version),console.log("node",process.version);return}if(!G6(t.url)||t.help){let n=kn.readFileSync(jl.join(__dirname,"help.txt"),"utf8");console.error(n);return}if(process.env.PORT&&(t.url=As(t.url).map(n=>new Di(n,`http://localhost:${process.env.PORT}`).href)),t.url=As(t.url).map(n=>(n.indexOf("http")!==0&&n[0]!=="/"&&(n=`http://${n}`),n)),As(t.url).map(n=>{try{t.onPort?new Di(n,"http://localhost"):new Di(n)}catch(i){console.error(i.message),console.error(""),console.error("When targeting a path without a hostname, the PORT environment variable must be available."),console.error("Use a full URL or set the PORT variable."),process.exit(1)}return null}),t.input&&(t.body=kn.readFileSync(t.input,"utf8")),t.headers&&(Array.isArray(t.headers)||(t.headers=[t.headers]),t.headers=t.headers.reduce((n,i)=>{let r=i.indexOf(":"),a=i.indexOf("="),s=Math.min(r<0?1/0:r,a<0?1/0:a);if(Number.isFinite(s)&&s>0)return n[i.slice(0,s)]=i.slice(s+1),n;throw new Error(`An HTTP header was not correctly formatted: ${i}`)},{})),t.har)try{t.har=JSON.parse(kn.readFileSync(t.har));let n=Z6(t.har),i=As(t.url,!0).map(r=>new Di(r).origin);for(let[r]of n)i.includes(r)||console.error(`Warning: skipping requests to '${r}' as the target is ${i.join(", ")}`)}catch(n){throw new Error(`Failed to load HAR file content: ${n.message}`)}if(t.tlsOptions={},t.cert)try{t.tlsOptions.cert=kn.readFileSync(t.cert)}catch(n){throw new Error(`Failed to load cert file: ${n.message}`)}if(t.key)try{t.tlsOptions.key=kn.readFileSync(t.key)}catch(n){throw new Error(`Failed to load key file: ${n.message}`)}if(t.ca){typeof t.ca=="string"?t.ca=[t.ca]:Array.isArray(t.ca._)&&(t.ca=t.ca._);try{t.tlsOptions.ca=t.ca.map(n=>kn.readFileSync(n))}catch(n){throw new Error(`Failed to load ca file: ${n.message}`)}}return t[Symbol.for("internal")]=!0,t}function B1(e){if(e)if(e.onPort){U6()||(console.error("The --on-port flag requires the async_hooks builtin module, but it is not available. Please upgrade to Node 8.1+."),process.exit(1));let{socketPath:t,server:n}=$6(a=>{let s=new Di(e.url,`http://localhost:${a}`).href,o=Object.assign({},e,{onPort:!1,url:s}),u=Ll(o,()=>{r.kill("SIGINT"),n.close()});process.once("SIGINT",()=>{u.stop()})}),i=M6({PATH:process.env.NODE_PATH});i.unshift(jl.join(__dirname,"lib/preload"));let r=N6(e.spawn[0],e.spawn.slice(1),{stdio:["ignore","inherit","inherit"],env:Object.assign({},process.env,{NODE_OPTIONS:["-r","autocannonDetectPort"].join(" ")+(process.env.NODE_OPTIONS?` ${process.env.NODE_OPTIONS}`:""),NODE_PATH:i.get(),AUTOCANNON_SOCKET:t})})}else try{let t=Ll(e);t.then&&t.catch(n=>{console.error(n.message)})}catch(t){console.error(t.message)}}function $6(e){let t=`${process.pid}.autocannon`,n=process.platform==="win32"?`\\\\?\\pipe\\${t}`:jl.join(j6.tmpdir(),t),i=P6.createServer(r=>{r.once("data",a=>{let s=a.toString();e(s)})});return i.listen(n),i.on("close",()=>{try{kn.unlinkSync(n)}catch{}}),{socketPath:n,server:i}}if(require.main===rn){let e=L6(process.argv.slice(2));B1(O1(e))}});var j1=m((DP,L1)=>{Xs();L1.exports=function(t){let n=t.opts,i=t.router,r=zs(),a=t.sentry,s=t.faker,o=t.sanitizeHtml,u=t.wsRedisPub;["apiKey","basicAuth","authorize","requirePermission","rateLimit","session","csrf","i18n","redisCache","csp","htmx","routeLocalization"].forEach(c=>{Object.defineProperty(t,c,{get(){return Q6("../middlewares/"+c)}})}),Object.assign(t,{dbPoolStats(){if(!t.db)return{error:"Database is not configured"};if(n.db&&n.db.type==="postgres")return{totalCount:t.db.totalCount,idleCount:t.db.idleCount,waitingCount:t.db.waitingCount};if(n.db&&(n.db.type==="mysql"||n.db.type==="mariadb")){let c=t.db.pool||t.db,l=c.pool||c;if(l&&l._allConnections)return{totalCount:l._allConnections.length,idleCount:l._freeConnections.length,waitingCount:l._connectionQueue?l._connectionQueue.length:0}}return{message:"Pool stats not supported for this database type"}},sanitize(c,l){if(!o)throw new Error("Please install sanitize-html to use sanitize()");return o(c,l)},metaTags(c={}){let l="";for(let[p,f]of Object.entries(c))f&&(p==="title"?l+=`<title>${f}</title>
69
+ `)}}function D6(e,t,n){if(!t.outputStream.isTTY)return;let i=new S1(t.progressBarString,{width:20,incomplete:" ",total:n.duration,clear:!0,stream:t.outputStream});return i.tick(0),i}function E6(e,t,n){if(!t.outputStream.isTTY)return;let i=new S1(t.progressBarString,{width:20,incomplete:" ",total:n.amount,clear:!0,stream:t.outputStream});return i.tick(0),i}A1.exports=w6});var _1=m((vP,k1)=>{"use strict";var Cs=require("events").EventEmitter,{isMainThread:C6}=ir(),S6=N0(),A6=Ju(),k6=ns(),_6=g1(),F6=ql();function T6(e,t){return!(typeof t=="function")&&!e.forever?e.warmup?R6(e):I6(e):Ss(e,null,t)}function I6(e){let t=new Cs,n=new Promise((i,r)=>{Ss(e,t,(a,s)=>{if(a)return r(a);i(s)})});return t.then=n.then.bind(n),t.catch=n.catch.bind(n),t}function R6(e){let t={...e,...e.warmup,warmupRunning:!0,renderResultsTable:!1},n=new Cs,i=new Cs,r=new Promise((a,s)=>{Ss(t,i,(o,u)=>{if(o)return s(o);Ss(e,n,(c,l)=>{if(c)return s(c);l.warmup=u,a(l)})})});return n.then=r.then.bind(r),n.catch=r.catch.bind(r),n}function Ss(e,t,n){let i=typeof n=="function";n=n||k6,t=t||new Cs,e=A6(e,i);function r(a,s){if(a)return i?n(a):setImmediate(()=>t.emit("error",a));t.emit("done",s),n(null,s),!a&&e.json&&console.log(JSON.stringify(s))}return e instanceof Error?(r(e),t):(t.opts=e,e.workers&&C6?S6(e,t,r):_6(e,t,r),e[Symbol.for("internal")]&&(!e.json||!process.stdout.isTTY)&&F6(t,e),t)}k1.exports=T6});var I1=m((bP,T1)=>{"use strict";var O6=ws(),F1={warmup:{c:"connections",d:"duration"}};function B6(e){let t=O6(e);function n(a){return t[a]}function i(a,s){return a[s]}function r(a,s){let o=t[s];for(let u in o)i(a,u)&&(o[a[u]]=o[u])}for(let a in F1){let s=F1[a];n(a)&&r(s,a)}return t}T1.exports=B6});var R1=m((yP,q6)=>{q6.exports={name:"autocannon",version:"8.0.0",description:"Fast HTTP benchmarking tool written in Node.js",main:"autocannon.js",bin:{autocannon:"autocannon.js"},scripts:{test:"standard && tap test/serial/*.test.js test/*.test.js","standard:fix":"standard --fix"},"pre-commit":["test"],repository:{type:"git",url:"git+https://github.com/mcollina/autocannon.git"},keywords:["http","soak","load","fast","wrk","ab","test"],author:"Matteo Collina <hello@matteocollina.com>",contributors:["Glen Keane <glenkeane.94@gmail.com>","Donald Robertson <donaldarobertson89@gmail.com","Salman Mitha <SalmanMitha@gmail.com>"],license:"MIT",bugs:{url:"https://github.com/mcollina/autocannon/issues"},homepage:"https://github.com/mcollina/autocannon#readme",devDependencies:{"ansi-regex":"^5.0.1",bl:"^6.0.0",busboy:"^0.3.1","pre-commit":"^1.1.2",proxyquire:"^2.1.3",sinon:"^15.0.0",split2:"^4.0.0",standard:"^17.0.0",tap:"^16.0.0","why-is-node-running":"^2.3.0"},dependencies:{"@minimistjs/subarg":"^1.0.0",chalk:"^4.1.0","char-spinner":"^1.0.1","cli-table3":"^0.6.0","color-support":"^1.1.1","cross-argv":"^2.0.0","form-data":"^4.0.0","has-async-hooks":"^1.0.0","hdr-histogram-js":"^3.0.0","hdr-histogram-percentiles-obj":"^3.0.0","http-parser-js":"^0.5.2",hyperid:"^3.0.0","lodash.chunk":"^4.2.0","lodash.clonedeep":"^4.5.0","lodash.flatten":"^4.4.0","manage-path":"^2.0.0","on-net-listen":"^1.1.1","pretty-bytes":"^5.4.1",progress:"^2.0.3",reinterval:"^1.1.0",retimer:"^3.0.0",semver:"^7.3.2",timestring:"^6.0.0"}}});var q1=m((wP,rn)=>{"use strict";var L6=Kp(),kn=require("fs"),j6=require("os"),P6=require("net"),jl=require("path"),Di=require("url").URL,N6=require("child_process").spawn,M6=id(),U6=ad(),H6=pd(),z6=iu(),Ll=_1(),V6=ql(),W6=I1(),{checkURL:G6,ofURL:As}=Ia(),{parseHAR:Z6}=_u(),Y6=Ta(),X6=Ju();typeof Di!="function"&&(console.error("autocannon requires the WHATWG URL API, but it is not available. Please upgrade to Node 6.13+."),process.exit(1));rn.exports=Ll;rn.exports.track=V6;rn.exports.start=B1;rn.exports.printResult=z6;rn.exports.parseArguments=O1;rn.exports.aggregateResult=function(t,n={}){if(!Array.isArray(t))throw new Error('"results" must be an array of results');if(n=X6(n,!1),n instanceof Error)throw n;return Y6(t,n)};var J6={connections:"c",pipelining:"p",timeout:"t",duration:"d",sampleInt:"L",amount:"a",json:"j",renderLatencyTable:["l","latency"],onPort:"on-port",method:"m",headers:["H","header"],body:"b",form:"F",servername:"s",bailout:"B",input:"i",maxConnectionRequests:"M",maxOverallRequests:"O",connectionRate:"r",overallRate:"R",ignoreCoordinatedOmission:"C",reconnectRate:"D",renderProgressBar:"progress",renderStatusCodes:"statusCodes",title:"T",verbose:"V",version:"v",forever:"f",idReplacement:"I",socketPath:"S",excludeErrorStats:"x",expectBody:"E",workers:"w",warmup:"W",help:"h"},K6={connections:10,timeout:10,pipelining:1,duration:10,sampleInt:1e3,reconnectRate:0,renderLatencyTable:!1,renderProgressBar:!0,renderStatusCodes:!1,json:!1,forever:!1,method:"GET",idReplacement:!1,excludeErrorStats:!1,debug:!1,workers:0,verbose:!0};function O1(e){let t=H6(e,{boolean:["json","n","help","renderLatencyTable","renderProgressBar","renderStatusCodes","forever","idReplacement","excludeErrorStats","onPort","debug","ignoreCoordinatedOmission","verbose"],alias:J6,default:K6,"--":!0});if(t=W6(t),t.url=t._.length>1?t._:t._[0],t["--"][0]==="node"&&(t.onPort=!0),t.onPort&&(t.spawn=t["--"]),t.n&&(t.renderProgressBar=!1,t.renderResultsTable=!1,t.renderStatusCodes=!1),t.version){console.log("autocannon","v"+R1().version),console.log("node",process.version);return}if(!G6(t.url)||t.help){let n=kn.readFileSync(jl.join(__dirname,"help.txt"),"utf8");console.error(n);return}if(process.env.PORT&&(t.url=As(t.url).map(n=>new Di(n,`http://localhost:${process.env.PORT}`).href)),t.url=As(t.url).map(n=>(n.indexOf("http")!==0&&n[0]!=="/"&&(n=`http://${n}`),n)),As(t.url).map(n=>{try{t.onPort?new Di(n,"http://localhost"):new Di(n)}catch(i){console.error(i.message),console.error(""),console.error("When targeting a path without a hostname, the PORT environment variable must be available."),console.error("Use a full URL or set the PORT variable."),process.exit(1)}return null}),t.input&&(t.body=kn.readFileSync(t.input,"utf8")),t.headers&&(Array.isArray(t.headers)||(t.headers=[t.headers]),t.headers=t.headers.reduce((n,i)=>{let r=i.indexOf(":"),a=i.indexOf("="),s=Math.min(r<0?1/0:r,a<0?1/0:a);if(Number.isFinite(s)&&s>0)return n[i.slice(0,s)]=i.slice(s+1),n;throw new Error(`An HTTP header was not correctly formatted: ${i}`)},{})),t.har)try{t.har=JSON.parse(kn.readFileSync(t.har));let n=Z6(t.har),i=As(t.url,!0).map(r=>new Di(r).origin);for(let[r]of n)i.includes(r)||console.error(`Warning: skipping requests to '${r}' as the target is ${i.join(", ")}`)}catch(n){throw new Error(`Failed to load HAR file content: ${n.message}`)}if(t.tlsOptions={},t.cert)try{t.tlsOptions.cert=kn.readFileSync(t.cert)}catch(n){throw new Error(`Failed to load cert file: ${n.message}`)}if(t.key)try{t.tlsOptions.key=kn.readFileSync(t.key)}catch(n){throw new Error(`Failed to load key file: ${n.message}`)}if(t.ca){typeof t.ca=="string"?t.ca=[t.ca]:Array.isArray(t.ca._)&&(t.ca=t.ca._);try{t.tlsOptions.ca=t.ca.map(n=>kn.readFileSync(n))}catch(n){throw new Error(`Failed to load ca file: ${n.message}`)}}return t[Symbol.for("internal")]=!0,t}function B1(e){if(e)if(e.onPort){U6()||(console.error("The --on-port flag requires the async_hooks builtin module, but it is not available. Please upgrade to Node 8.1+."),process.exit(1));let{socketPath:t,server:n}=$6(a=>{let s=new Di(e.url,`http://localhost:${a}`).href,o=Object.assign({},e,{onPort:!1,url:s}),u=Ll(o,()=>{r.kill("SIGINT"),n.close()});process.once("SIGINT",()=>{u.stop()})}),i=M6({PATH:process.env.NODE_PATH});i.unshift(jl.join(__dirname,"lib/preload"));let r=N6(e.spawn[0],e.spawn.slice(1),{stdio:["ignore","inherit","inherit"],env:Object.assign({},process.env,{NODE_OPTIONS:["-r","autocannonDetectPort"].join(" ")+(process.env.NODE_OPTIONS?` ${process.env.NODE_OPTIONS}`:""),NODE_PATH:i.get(),AUTOCANNON_SOCKET:t})})}else try{let t=Ll(e);t.then&&t.catch(n=>{console.error(n.message)})}catch(t){console.error(t.message)}}function $6(e){let t=`${process.pid}.autocannon`,n=process.platform==="win32"?`\\\\?\\pipe\\${t}`:jl.join(j6.tmpdir(),t),i=P6.createServer(r=>{r.once("data",a=>{let s=a.toString();e(s)})});return i.listen(n),i.on("close",()=>{try{kn.unlinkSync(n)}catch{}}),{socketPath:n,server:i}}if(require.main===rn){let e=L6(process.argv.slice(2));B1(O1(e))}});var j1=m((DP,L1)=>{Xs();L1.exports=function(t){let n=t.opts,i=t.router,r=zs(),a=t.sentry,s=t.faker,o=t.sanitizeHtml,u=t.wsRedisPub;["apiKey","basicAuth","authorize","requirePermission","rateLimit","session","csrf","i18n","redisCache","csp","htmx","routeLocalization"].forEach(c=>{Object.defineProperty(t,c,{get(){return Q6("../middlewares/"+c+".js")}})}),Object.assign(t,{dbPoolStats(){if(!t.db)return{error:"Database is not configured"};if(n.db&&n.db.type==="postgres")return{totalCount:t.db.totalCount,idleCount:t.db.idleCount,waitingCount:t.db.waitingCount};if(n.db&&(n.db.type==="mysql"||n.db.type==="mariadb")){let c=t.db.pool||t.db,l=c.pool||c;if(l&&l._allConnections)return{totalCount:l._allConnections.length,idleCount:l._freeConnections.length,waitingCount:l._connectionQueue?l._connectionQueue.length:0}}return{message:"Pool stats not supported for this database type"}},sanitize(c,l){if(!o)throw new Error("Please install sanitize-html to use sanitize()");return o(c,l)},metaTags(c={}){let l="";for(let[p,f]of Object.entries(c))f&&(p==="title"?l+=`<title>${f}</title>
70
70
  `:p.startsWith("og:")||p.startsWith("twitter:")?l+=`<meta property="${p}" content="${f}">
71
71
  `:l+=`<meta name="${p}" content="${f}">
72
72
  `);return l},sentry:a,faker:s,wsBroadcast(c){let l=typeof c=="string"?c:JSON.stringify(c);if(u&&u.isOpen){let p=n.ws.pubSubChannel||"fullstx_ws_pubsub";u.publish(p,l).catch(console.error)}else this.wss&&this.wss.clients.forEach(p=>{p.readyState===1&&p.send(l)})},factory(c,l){if(!s)throw new Error("Please install @faker-js/faker to use factory()");let p=[];for(let f=0;f<c;f++)p.push(l(s,f));return p},zod:require("zod"),container:{services:new Map,register(c,l){this.services.set(c,l)},get(c){if(!this.services.has(c))throw new Error(`Service ${c} not found in IoC container`);return this.services.get(c)}},cache:new Map,upload(c={dest:"uploads/"}){return require("multer")(c)},knex(c){return require("knex")(c)},queue(c,l){let{Queue:p}=require("bullmq");return new p(c,{connection:l})},worker(c,l,p){let{Worker:f}=require("bullmq");return new f(c,l,{connection:p})},swagger(c="/api-docs",l={}){let p=require("swagger-ui-dist").getAbsoluteFSPath(),f=require("fs"),d=require("path");i.get(c+"/swagger.json",(h,x)=>{if(x.json)return x.json(l);x.writeHead(200,{"Content-Type":"application/json"}),x.end(JSON.stringify(l))}),i.use((h,x,w)=>{if(h.url.startsWith(c+"/assets/")){let C=h.url.replace(c+"/assets/",""),_=d.join(p,C);if(_.startsWith(p)&&f.existsSync(_)){let S=f.readFileSync(_),v=d.extname(_),g={".css":"text/css",".js":"application/javascript",".png":"image/png"};return x.writeHead(200,{"Content-Type":g[v]||"text/plain"}),x.end(S)}}w()}),i.get(c,(h,x)=>{let w=`