@remotex-labs/xbuild
Version:
A versatile JavaScript and TypeScript toolchain build system
45 lines (43 loc) • 74.3 kB
JavaScript
#!/usr/bin/env node
var Er=Object.create;var Ve=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var yt=(r,e)=>(e=Symbol[r])?e:Symbol.for("Symbol."+r),fe=r=>{throw TypeError(r)};var Ir=(r,e,t)=>e in r?Ve(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var mt=(r,e)=>Ve(r,"name",{value:e,configurable:!0});var F=r=>[,,,Er(r?.[yt("metadata")]??null)],vt=["class","method","getter","setter","accessor","field","value","get","set"],le=r=>r!==void 0&&typeof r!="function"?fe("Function expected"):r,Tr=(r,e,t,i,o)=>({kind:vt[r],name:e,metadata:i,addInitializer:n=>t._?fe("Already initialized"):o.push(le(n||null))}),Or=(r,e)=>Ir(e,yt("metadata"),r[3]),k=(r,e,t,i)=>{for(var o=0,n=r[e>>1],s=n&&n.length;o<s;o++)e&1?n[o].call(t):i=n[o].call(t,i);return i},A=(r,e,t,i,o,n)=>{var s,a,c,l,p,f=e&7,d=!!(e&8),m=!!(e&16),$=f>3?r.length+1:f?d?1:2:0,_=vt[f+5],j=f>3&&(r[$-1]=[]),Le=r[$]||(r[$]=[]),w=f&&(!m&&!d&&(o=o.prototype),f<5&&(f>3||!m)&&Cr(f<4?o:{get[t](){return gt(this,n)},set[t](C){return ht(this,n,C)}},t));f?m&&f<4&&mt(n,(f>2?"set ":f>1?"get ":"")+t):mt(o,t);for(var ce=i.length-1;ce>=0;ce--)l=Tr(f,t,c={},r[3],Le),f&&(l.static=d,l.private=m,p=l.access={has:m?C=>Fr(o,C):C=>t in C},f^3&&(p.get=m?C=>(f^1?gt:kr)(C,o,f^4?n:w.get):C=>C[t]),f>2&&(p.set=m?(C,He)=>ht(C,o,He,f^4?n:w.set):(C,He)=>C[t]=He)),a=(0,i[ce])(f?f<4?m?n:w[_]:f>4?void 0:{get:w.get,set:w.set}:o,l),c._=1,f^4||a===void 0?le(a)&&(f>4?j.unshift(a):f?m?n=a:w[_]=a:o=a):typeof a!="object"||a===null?fe("Object expected"):(le(s=a.get)&&(w.get=s),le(s=a.set)&&(w.set=s),le(s=a.init)&&j.unshift(s));return f||Or(r,o),w&&Ve(o,t,w),m?f^4?n:w:o};var _e=(r,e,t)=>e.has(r)||fe("Cannot "+t),Fr=(r,e)=>Object(e)!==e?fe('Cannot use the "in" operator on this value'):r.has(e),gt=(r,e,t)=>(_e(r,e,"read from private field"),t?t.call(r):e.get(r));var ht=(r,e,t,i)=>(_e(r,e,"write to private field"),i?i.call(r,t):e.set(r,t),t),kr=(r,e,t)=>(_e(r,e,"access private method"),t);import{rmSync as jo}from"fs";import{cwd as Lo}from"process";import Se from"node:process";import{resolveError as Ur}from"@remotex-labs/xmap";var Ue=new Map,xt=new Map;function Ar(r){return typeof r=="object"&&r!==null&&"useClass"in r}function Pr(r){return typeof r=="object"&&r!==null&&"useFactory"in r}function Rr(r){return typeof r=="object"&&r!==null&&"useValue"in r}function P(r){return function(e){xt.set(e,r||{})}}function ze(r,e=[]){if(!r)return e;let t=e;for(let i of r.slice(t.length))if(Ar(i))t.push(u(i.useClass,...ze(i.providers)));else if(Pr(i))t.push(i.useFactory(...ze(i.providers)));else if(Rr(i))t.push(i.useValue);else if(typeof i=="function")t.push(u(i));else throw new Error(`Unknown provider type: ${typeof i}`);return t}function u(r,...e){if(Ue.has(r))return Ue.get(r);let t=xt.get(r);if(!t)throw new Error(`Cannot inject ${r.name} \u2013 not marked @Injectable`);let i=ze(t.providers,e),o=t.factory?t.factory(...i):new r(...i);return t?.scope==="singleton"&&Ue.set(r,o),o}import{xterm as Ye}from"@remotex-labs/xansi/xterm.component";import $r from"typescript";import{resolve as Mr}from"@remotex-labs/xmap";import{closeSync as Br,fstatSync as Nr,openSync as Dr,readFileSync as jr}from"fs";var bt,We;bt=[P({scope:"singleton"})];var v=class{resolvedPathCache=new Map;snapshotsByPath=new Map;clear(){this.snapshotsByPath.clear(),this.resolvedPathCache.clear()}getSnapshot(e){return this.snapshotsByPath.get(this.resolve(e))}getOrTouchFile(e){return this.snapshotsByPath.get(this.resolve(e))??this.touchFile(e)}getTrackedFilePaths(){return[...this.snapshotsByPath.keys()]}touchFile(e){let t=this.resolve(e),i=this.snapshotsByPath.get(t)??this.createEntry(t);try{this.syncEntry(t,i)}catch{(i.contentSnapshot!==void 0||i.version>0)&&(i.version++,i.mtimeMs=0,i.contentSnapshot=void 0)}return{...i}}resolve(e){let t=this.resolvedPathCache.get(e);if(t)return t;let i=Mr(e);return this.resolvedPathCache.set(e,i),i}createEntry(e){let t={version:0,mtimeMs:0,contentSnapshot:void 0};return this.snapshotsByPath.set(e,t),t}syncEntry(e,t){let i=Dr(e,"r");try{let{mtimeMs:o}=Nr(i);if(o===t.mtimeMs)return;let n=jr(i,"utf-8");t.version++,t.mtimeMs=o,t.contentSnapshot=n?$r.ScriptSnapshot.fromString(n):void 0}finally{Br(i)}}};We=F(null),v=A(We,0,"FilesModel",bt,v),k(We,1,v);import{readFileSync as Lr}from"fs";import{SourceService as Hr}from"@remotex-labs/xmap";import{resolve as Ge,toPosix as St}from"@remotex-labs/xmap";var wt,Ke;wt=[P({scope:"singleton"})];var b=class{filePath;distPath;rootPath;sourceMaps=new Map;constructor(){this.filePath=import.meta.filename,this.setSourceFile(this.filePath),this.rootPath=this.getRootDir(),this.distPath=this.getDistDir()}isFrameworkFile(e){let{source:t,sourceRoot:i}=e,o=t?.toLowerCase();return!!(t&&o.includes("xbuild")&&!o.includes("xbuild.config")||i&&i.includes("xBuild"))}getSourceMap(e){if(e=Ge(e),this.sourceMaps.has(e))return this.sourceMaps.get(e)}setSource(e,t){let i=Ge(t);try{return this.initializeSourceMap(e,i)}catch(o){throw new Error(`Failed to initialize SourceService: ${i}
${o instanceof Error?o.message:String(o)}`)}}setSourceFile(e){if(!e)return;let t=Ge(e),i=`${e}.map`;if(!this.sourceMaps.has(t))try{let o=Lr(i,"utf-8");return this.initializeSourceMap(o,t)}catch(o){throw new Error(`Failed to initialize SourceService: ${t}
${o instanceof Error?o.message:String(o)}`)}}getRootDir(){return St(process.cwd())}getDistDir(){return St(import.meta.dirname)}initializeSourceMap(e,t){if(e?.includes('"mappings": ""'))return;let i=new Hr(e,t);this.sourceMaps.set(t,i)}};Ke=F(null),b=A(Ke,0,"FrameworkService",wt,b),k(Ke,1,b);import{parseErrorStack as Ot}from"@remotex-labs/xmap/parser.component";function Et(r){return e=>new U(t=>e.subscribe({next:i=>{try{let o=r(i);t.next?.(o)}catch(o){t.error?.(o)}},error:i=>t.error?.(i),complete:()=>t.complete?.()}))}function Ct(r=(e,t)=>e===t){return e=>new U(t=>{let i=!1,o;return e.subscribe({next:n=>{try{if(!i){o=n,i=!0,t.next?.(n);return}r(o,n)||(o=n,t.next?.(n))}catch(s){t.error?.(s)}},error:n=>t.error?.(n),complete:()=>t.complete?.()})})}var U=class{constructor(e){this.handler=e}handler;subscribe(e,t,i){let o=this.createSafeObserver(e,t,i),n;try{n=this.handler(o)}catch(s){return o.error?.(s),()=>{}}return()=>{try{n?.()}catch(s){o.error?.(s)}}}pipe(...e){return e.length===0?this:e.reduce((t,i)=>i(t),this)}createSafeObserver(e,t,i){return typeof e=="function"?{next:e,error:t,complete:i}:e||{}}};var pe=class extends U{isCompleted=!1;observers=new Set;constructor(){super(e=>{if(this.isCompleted){e.complete?.();return}return this.observers.add(e),()=>this.observers.delete(e)})}next(e){if(this.isCompleted)return;let t=[];for(let i of[...this.observers])try{i.next?.(e)}catch(o){t.push(o);try{i.error?.(o)}catch{}}if(t.length>0)throw new AggregateError(t,`${t.length} observer(s) failed in next()`)}error(e){if(this.isCompleted)return;let t=[];for(let i of[...this.observers])try{i.error?.(e)}catch(o){t.push(o)}if(t.length>0)throw new AggregateError(t,`${t.length} observer(s) failed in error()`)}complete(){if(this.isCompleted)return;let e=[];for(let t of[...this.observers])try{t.complete?.()}catch(i){e.push(i)}if(this.observers.clear(),this.isCompleted=!0,e.length>0)throw new AggregateError(e,`${e.length} observer(s) failed in complete()`)}};var ue=class extends pe{lastValue;constructor(e){super(),this.lastValue=typeof e=="function"?e():e}get value(){return this.lastValue}subscribe(e,t,i){if(this.isCompleted)return()=>{};let o=this.createSafeObserver(e,t,i),n=super.subscribe(o);return o.next?.(this.lastValue),n}next(e){this.isCompleted||(this.lastValue=e,super.next(e))}};function xe(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function z(r,...e){if(!e.length)return r;let t=e.shift();if(xe(r)&&xe(t)){for(let i in t){let o=t[i],n=r[i];Array.isArray(o)&&Array.isArray(n)?Object.assign(r,{[i]:[...n,...o]}):xe(o)?Object.assign(r,{[i]:z(xe(n)?n:{},o)}):Object.assign(r,{[i]:o})}return z(r,...e)}return r}function be(r,e,t=!0){return r===e||Object.is(r,e)?!0:r===null||e===null?!1:r instanceof Date&&e instanceof Date?r.getTime()===e.getTime():r instanceof RegExp&&e instanceof RegExp?r.source===e.source&&r.flags===e.flags:URL&&r instanceof URL&&e instanceof URL?r.href===e.href:typeof r=="object"&&typeof e=="object"?_r(r,e,t):!1}function Vr(r,e){return r==null||typeof r!="object"&&typeof r!="function"?!1:e in r||Object.prototype.hasOwnProperty.call(r,e)}function _r(r,e,t=!0){if(Array.isArray(r)&&Array.isArray(e))return t&&r.length!==e.length?!1:r.every((n,s)=>be(n,e[s],t));let i=Object.keys(r),o=Object.keys(e);if(t&&i.length!==o.length)return!1;for(let n of i)if(!Vr(e,n)||!be(r[n],e[n],t))return!1;return!0}var It=Object.freeze({verbose:!1,common:Object.freeze({types:!0,declaration:!0,esbuild:Object.freeze({write:!0,bundle:!0,minify:!0,format:"cjs",outdir:"dist",platform:"browser",absWorkingDir:process.cwd()})})});var Tt,qe;Tt=[P({scope:"singleton"})];var x=class{constructor(e=It){this.initialConfig=e;this.config$=new ue(z({},e))}initialConfig;config$;getValue(e){return e?e(this.config$.value):this.config$.value}subscribe(e){return this.config$.subscribe(e)}select(e){return this.config$.pipe(Et(e),Ct((t,i)=>be(t,i)))}patch(e){let t=z({},this.config$.value,e);this.config$.next(t)}reload(e){this.config$.next(z({},this.initialConfig,e))}};qe=F(null),x=A(qe,0,"ConfigurationService",Tt,x),k(qe,1,x);import{formatErrorCode as zr}from"@remotex-labs/xmap/formatter.component";import{highlightCode as Wr}from"@remotex-labs/xmap/highlighter.component";function Gr(r=""){let t=u(b).getSourceMap(r);if(t)return t;let i=u(v).getOrTouchFile(r),o=i?.contentSnapshot?.text;if(!i||!o)return null;let n=o.split(`
`);return{getPositionWithCode:(s,a,c,l)=>{let p=l?.linesBefore??3,f=l?.linesAfter??3,d=Math.max(s-p,0),m=Math.min(s+f,n.length);return{line:s,column:a+1,code:n.slice(d,m).join(`
`),source:r,name:null,startLine:d,endLine:m,sourceRoot:null,sourceIndex:-1,generatedLine:-1,generatedColumn:-1}}}}function Kr(r){return r instanceof Error?Ot(r):r.detail instanceof Error?Ot(r.detail):r.location?{name:"esBuildMessage",message:r.text??"",rawStack:"",stack:[{source:`@${r.location.file}`,line:r.location.line,column:r.location.column,fileName:r.location.file,eval:!1,async:!1,native:!1,constructor:!1}]}:{stack:[],name:"esBuildMessage",message:r.text??"",rawStack:""}}function L(r,e){let t=u(b),i=u(x).getValue(s=>s.verbose)??!1,o=Kr(r),n=Ur(o,{...e,withNativeFrames:i||(e?.withFrameworkFrames??!1),getSource(s){return Gr(s)}});return n.stack.filter(s=>{if(!(e?.withFrameworkFrames??!1)&&t.isFrameworkFile(s))return!1;!n.formatCode&&s.code&&(n.formatCode=zr({code:Wr(s.code),line:s.line??0,column:s.column??0,startLine:s.stratLine??0},{color:Ye.brightPink}))}),n}function H(r,e,t,i=[]){let o=[`
${e}: ${Ye.lightCoral(t)}`];for(let n of i??[])n.text&&o.push(`
`+Ye.gray(n.text));return r.formatCode&&o.push(`
${r.formatCode}`),r.stack.length&&o.push(`
Enhanced Stack Trace:
${r.stack.map(n=>n.format).join(`
`)}
`),o.join("")}var y=class extends Error{errorMetadata;formattedStack;constructor(e,t="xBuildBaseError"){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=t,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}get metadata(){return this.errorMetadata}[Symbol.for("nodejs.util.inspect.custom")](){return this.formattedStack||this.stack}reformatStack(e,t){this.errorMetadata=L(e,t),this.formattedStack=H(this.errorMetadata,e.name,e.message)}};function Ft(r){if(r instanceof AggregateError){console.error("AggregateError:",r.message);for(let e of r.errors)if(e instanceof Error&&!(e instanceof y)){let t=L(e,{withFrameworkFrames:!0,withNativeFrames:!0});console.error(H(t,e.name,e.message))}else console.error(e);return}if(r instanceof Error&&!(r instanceof y)){let e=L(r,{withFrameworkFrames:!0,withNativeFrames:!0});console.error(H(e,r.name,r.message))}else console.error(r)}Se.on("uncaughtException",r=>{Ft(r),Se.exit(2)});Se.on("unhandledRejection",r=>{Ft(r),Se.exit(2)});import{join as Ho}from"@remotex-labs/xmap";import Xe from"yargs";import{hideBin as Yr}from"yargs/helpers";var qr="config.xbuild.ts",we={entryPoints:{describe:"Source files to build (supports glob patterns)",type:"string",array:!0},typeCheck:{describe:"Perform type checking without building output",alias:"tc",type:"boolean"},platform:{describe:"Target platform for the build output",alias:"p",type:"string",choices:["browser","node","neutral"]},serve:{describe:"Start server to the <folder>",alias:"s",type:"string"},outdir:{describe:"Directory for build output files",alias:"o",type:"string"},declaration:{describe:"Generate TypeScript declaration files (.d.ts)",alias:"de",type:"boolean"},watch:{describe:"Watch mode - rebuild on file changes",alias:"w",type:"boolean"},config:{describe:"Path to build configuration file",alias:"c",type:"string",default:qr},tsconfig:{describe:"Path to TypeScript configuration file",alias:"tsc",type:"string"},minify:{describe:"Minify the build output",alias:"m",type:"boolean"},bundle:{describe:"Bundle dependencies into output files",alias:"b",type:"boolean"},types:{describe:"Enable type checking during build process",alias:"btc",type:"boolean"},failOnError:{describe:"Fail build when TypeScript errors are detected",alias:"foe",type:"boolean"},format:{describe:"Output module format",alias:"f",type:"string",choices:["cjs","esm","iife"]},verbose:{describe:"Verbose error stack traces",alias:"v",type:"boolean"},build:{describe:"Select an build configuration variant by names (as defined in your config file)",alias:"xb",type:"string",array:!0}},kt=[["xBuild src/index.ts","Build a single file with default settings"],["xBuild src/**/*.ts --bundle --minify","Bundle and minify all TypeScript files"],["xBuild src/app.ts -s","Development mode with watch and dev server"],["xBuild src/app.ts -s dist","Development mode with watch and dev server from dist folder"],["xBuild src/lib.ts --format esm --declaration","Build ESM library with type definitions"],["xBuild src/server.ts --platform node --outdir dist","Build Node.js application to dist folder"],["xBuild --typeCheck","Type check only without generating output"],["xBuild --config custom.xbuild.ts","Use custom configuration file"]];var At,Je;At=[P({scope:"singleton"})];var Q=class{parseConfigFile(e){return Xe(e).help(!1).version(!1).options({config:we.config}).parseSync()}parseUserArgv(e,t){return t?Xe(e).help(!1).version(!1).options(t).parseSync():{}}enhancedParse(e,t={}){let i=Xe(Yr(e)).locale("en"),o=i.showHelp;return i.showHelp=function(n){return this.group(Object.keys(we),"xBuild Options:"),this.group(Object.keys(t),"user Options:"),o.call(this,n)},i.usage("Usage: xBuild [files..] [options]").command("* [entryPoints..]","Specific files to build (supports glob patterns)",n=>n.positional("entryPoints",{describe:"Specific files to build (supports glob patterns)",type:"string",array:!0})).options(t).options(we).epilogue("For more information, check the documentation https://remotex-labs.github.io/xBuild/").help().alias("help","h").strict().version(),kt.forEach(([n,s])=>{i.example(n,s)}),i.parseSync()}};Je=F(null),Q=A(Je,0,"ArgvModule",At,Q),k(Je,1,Q);import lt from"readline";import{exec as ho}from"child_process";import{cwd as Xr}from"process";import{readdirSync as Jr}from"fs";import{matchesGlob as Qe}from"path";import{join as Qr}from"@remotex-labs/xmap";function Zr(r){let e=[],t=[];for(let i of r)i.startsWith("!")?t.push(i.slice(1)):e.push(i);return{include:e,exclude:t}}function Pt(r,e){for(let t of e)if(t.endsWith(r)||Qe(r,t))return!0;return!1}function ei(r,e){let t=r+"/**";for(let i of e)if(Qe(r,i)||Qe(t,i))return!0;return!1}function Ee(r,e){let{include:t,exclude:i}=Zr(e),o=Object.create(null),s=Xr().length+1,a=r.length+1,c=i.length>0;function l(p){let f;try{f=Jr(p,{withFileTypes:!0})}catch{return}let d=f.length;for(let m=0;m<d;m++){let $=f[m],_=Qr(p,$.name),j=_.slice(a);if($.isDirectory()){(!c||!ei(j,i))&&l(_);continue}if(!(c&&Pt(j,i))&&Pt(j,t)){let Le=_.slice(s),w=j.lastIndexOf("."),ce=w>0?j.slice(0,w):j;o[ce]=Le}}}return l(r),o}var M=class r extends Error{diagnostics;constructor(e,t=[]){super(e),this.name="TypesError",this.diagnostics=t,Object.setPrototypeOf(this,r.prototype)}};var S=class extends y{constructor(e,t={withFrameworkFrames:!0}){super(e),this.reformatStack(this,t)}};var W=class extends y{id;constructor(e,t){super(e.text??"","esBuildError"),this.id=e.id??"",e.detail instanceof Error?(this.stack=e.detail.stack,this.message=e.detail.message,this.reformatStack(e.detail,t)):(this.errorMetadata=L(e,{withFrameworkFrames:!0}),this.stack=H(this.errorMetadata,this.name,this.message,e.notes))}};function ti(r){if(r instanceof y)return r;if(r.detail instanceof y||r.detail instanceof M)return r.detail;if(r.detail instanceof Error)return new W(r,{withFrameworkFrames:!0});if(r.location)return new W(r);if(r.text)return new S(r.text)}function de(r=[],e){for(let t of r){let i=ti(t);i&&e.push(i)}}function me(r){let e={errors:[],warnings:[],metafile:r.metafile,outputFiles:r.outputFiles,mangleCache:r.mangleCache};return de(r.errors,e.errors),de(r.warnings,e.warnings),e}function V(r){return typeof r=="object"&&r!==null&&"errors"in r}import*as Nt from"http";import*as Dt from"https";import{extname as Mt}from"path";import{readFileSync as Bt}from"fs";var Rt=`<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Dark File Browser \u2014 FTP-like</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" referrerpolicy="no-referrer" /><style>:root{--bg:#0b0f14;--panel:#0f1720;--muted:#9aa4b2;--accent:#E5C07B;--glass:rgba(255,255,255,0.03);--card:#0c1116;--radius:12px;--gap:12px;--shadow:0 6px 18px rgba(0,0,0,0.4);--file-icon-size:40px;font-family:Inter,ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,'Helvetica Neue',Arial}*{box-sizing:border-box;font-style:normal !important}html,body{height:100%;margin:0;font-size:14px;color:#dce7ef;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:radial-gradient(1200px 600px at 10% 10%,rgba(110,231,183,0.04),transparent 8%),linear-gradient(180deg,rgba(255,255,255,0.01),transparent 20%),var(--bg);padding:28px;display:flex;gap:20px;align-items:flex-start;justify-content:center}.app{width:1100px;max-width:98vw;display:flex;gap:18px;padding:18px;border-radius:16px;box-shadow:var(--shadow);border:1px solid rgba(255,255,255,0.03);background:linear-gradient(180deg,rgba(255,255,255,0.02),rgba(255,255,255,0));overflow:hidden}.sidebar{width:260px;background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent);border-radius:var(--radius);padding:14px}.brand{display:flex;gap:12px;align-items:center;margin-bottom:10px}.logo{width:46px;height:46px;border-radius:10px;background:linear-gradient(135deg,#b65b9f 0%,#804b8f 100%);display:flex;align-items:center;justify-content:center;font-weight:700}.brand h1{font-size:16px;margin:0}.muted{color:var(--muted);font-size:13px}.search{margin:12px 0}.search input{width:100%;padding:10px 12px;border-radius:10px;border:1px solid rgba(255,255,255,0.03);background:var(--glass);color:inherit}.quick-list{margin-top:12px}.quick-list a{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;background:transparent;color:var(--muted);text-decoration:none;cursor:pointer;transition:color 0.15s ease}.quick-list a:hover{color:var(--accent)}.main{flex:1;display:flex;flex-direction:column}.topbar{display:flex;align-items:center;gap:12px;padding-bottom:12px}.breadcrumbs{list-style:none;display:flex;gap:8px;align-items:center;background:var(--glass);padding:8px 12px;border-radius:var(--radius);margin:0}.breadcrumbs li{display:flex;align-items:center}.breadcrumbs li:not(:last-child)::after{content:'>';margin-left:8px;color:var(--muted)}.breadcrumbs a{color:var(--muted);text-decoration:none;transition:color 0.15s ease}.breadcrumbs a:hover{color:var(--accent)}.list{margin-top:14px;display:grid;grid-template-columns:1fr;gap:10px}.list a{display:flex;text-decoration:none;color:inherit}.folder-row,.file-row{display:flex;gap:12px;align-items:center;padding:10px;border-radius:10px;background:linear-gradient(180deg,rgba(255,255,255,0.01),transparent);border:1px solid rgba(255,255,255,0.02);transition:color 0.25s ease}.icon{width:var(--file-icon-size);height:var(--file-icon-size);border-radius:10px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.02);flex-shrink:0;transition:background 0.25s ease,color 0.25s ease}.folder-row:hover,.file-row:hover{color:var(--accent)}.folder-row:hover .icon{background:rgba(152,195,121,0.2)}.file-row:hover .icon{background:rgba(224,108,117,0.2)}.folder-row:hover .icon i{color:#98C379}.file-row:hover .icon i{color:#e09c6c}.meta{display:flex;flex-direction:column}.name{font-weight:600}.sub{color:var(--muted);font-size:13px}.empty{padding:40px;text-align:center;color:var(--muted)}@media (max-width:880px){.app{flex-direction:column;padding:12px}.sidebar,.main{width:100%}}</style></head><body><div class="app"><aside class="sidebar"><div class="brand"><div class="logo">F</div><div><h1>xBuildFTP</h1><div class="muted">Browse & serve files</div></div></div><div class="search"><input placeholder="Search files & folders..."/></div><div class="quick-list"><a href="/">\u{1F3E0} Home</a><a href="\${ up }">\u2B06\uFE0F Up</a></div></aside><main class="main"><div class="topbar"><div class="topbar"><ul class="breadcrumbs"> \${ paths } </ul></div></div> \${ fileList } </main></div></body><script> const searchInput = document.querySelector('.search input'); const listItems = document.querySelectorAll('.list > .folder-row, .list > .file-row'); const emptyMessage = document.querySelector('.empty'); searchInput.addEventListener('input', () => { const query = searchInput.value.toLowerCase(); let anyVisible = false; listItems.forEach(item => { const name = item.querySelector('.name').textContent.toLowerCase(); if (name.includes(query)) { item.style.display = 'flex'; anyVisible = true; } else { item.style.display = 'none'; } }); emptyMessage.style.display = anyVisible ? 'none' : 'block'; }); </script></html>`;import{resolve as oi,join as Ce}from"@remotex-labs/xmap";import{xterm as Ze}from"@remotex-labs/xansi/xterm.component";var ii=`
______ _ _ _
| ___ \\ (_) | | |
__ _| |_/ /_ _ _| | __| |
\\ \\/ / ___ \\ | | | | |/ _\` |
> <| |_/ / |_| | | | (_| |
/_/\\_\\____/ \\__,_|_|_|\\__,_|
`;function $t(){return`
\r${Ze.burntOrange(ii)}
\rVersion: ${Ze.brightPink("2.5.1")}
\r`}function I(){return Ze.lightCoral("[xBuild]")}import{readdir as ni,stat as si,readFile as ai}from"fs/promises";import{xterm as Ie}from"@remotex-labs/xansi/xterm.component";var ge=class{constructor(e,t){this.config=e;this.rootDir=oi(t),this.config.port||=0,this.config.host||="localhost"}config;server;rootDir;framework=u(b);async start(){if(this.config.https)return await this.startHttpsServer();await this.startHttpServer()}async stop(){if(!this.server){console.log(I(),Ie.gray("No server is currently running."));return}await new Promise((e,t)=>{this.server.close(i=>{i?t(i):e()})}),console.log(I(),Ie.dim("Server stopped.")),this.server=void 0}async restart(){console.log(I(),Ie.burntOrange("Restarting server...")),await this.stop(),await this.start()}setActualPort(){if(this.config.port===0){let e=this.server.address();e&&typeof e=="object"&&e.port&&(this.config.port=e.port)}}startHttpServer(){return new Promise(e=>{this.server=Nt.createServer((t,i)=>{this.handleRequest(t,i,()=>this.defaultResponse(t,i))}),this.server.listen(this.config.port,this.config.host,()=>{this.setActualPort(),this.config.onStart?.({host:this.config.host,port:this.config.port,url:`http://${this.config.host}:${this.config.port}`}),e()})})}startHttpsServer(){return new Promise(e=>{let t={key:Bt(this.config.key??Ce(this.framework.distPath,"..","certs","server.key")),cert:Bt(this.config.cert??Ce(this.framework.distPath,"..","certs","server.crt"))};this.server=Dt.createServer(t,(i,o)=>{this.handleRequest(i,o,()=>this.defaultResponse(i,o))}),this.server.listen(this.config.port,this.config.host,()=>{this.setActualPort(),this.config.onStart?.({host:this.config.host,port:this.config.port,url:`https://${this.config.host}:${this.config.port}`}),e()})})}handleRequest(e,t,i){try{this.config.verbose&&console.log(`${I()} Request ${Ie.lightCoral(e.url?.toString()??"")}`),this.config.onRequest?this.config.onRequest(e,t,i):i()}catch(o){this.sendError(t,o)}}getContentType(e){return{html:"text/html",css:"text/css",js:"application/javascript",cjs:"application/javascript",mjs:"application/javascript",ts:"text/plain",map:"application/json",json:"application/json",png:"image/png",jpg:"image/jpeg",gif:"image/gif",txt:"text/plain"}[e]||"application/octet-stream"}async defaultResponse(e,t){let i=e.url==="/"?"":e.url?.replace(/^\/+/,"")||"",o=Ce(this.rootDir,i);if(!o.startsWith(this.rootDir)){t.statusCode=403,t.end();return}try{let n=await si(o);n.isDirectory()?await this.handleDirectory(o,i,t):n.isFile()&&await this.handleFile(o,t)}catch(n){let s=n.message;s.includes("favicon")||console.log(I(),s),this.sendNotFound(t)}}async handleDirectory(e,t,i){let n=(await ni(e)).map(l=>{let p=Ce(t,l),f=Mt(l).slice(1)||"folder";return f==="folder"?`
<a href="/${p}" class="folder-row">
<div class="icon"><i class="fa-solid fa-folder"></i></div>
<div class="meta"><div class="name">${l}</div><div class="sub">Folder</div></div>
</a>
`:`
<a href="/${p}" class="file-row">
<div class="icon"><i class="fa-solid fa-file-code"></i></div>
<div class="meta"><div class="name">${l}</div><div class="sub">${f}</div></div>
</a>
`}).join("");n?n=`<div class="list">${n}</div>`:n='<div class="empty">No files or folders here.</div>';let s="/",a=t.split("/").map(l=>(s+=`${l}/`,`<li><a href="${s}">${l}</a></li>`)).join(""),c=Rt.replace("${ fileList }",n).replace("${ paths }",'<li><a href="/">root</a></li>'+a).replace("${ up }","/"+t.split("/").slice(0,-1).join("/"));i.writeHead(200,{"Content-Type":"text/html"}),i.end(c)}async handleFile(e,t){let i=Mt(e).slice(1)||"txt",o=this.getContentType(i),n=await ai(e);t.writeHead(200,{"Content-Type":o}),t.end(n)}sendNotFound(e){e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Not Found")}sendError(e,t){console.error(I(),t.toString()),e.writeHead(500,{"Content-Type":"text/plain"}),e.end("Internal Server Error")}};import{matchesGlob as jt}from"path";import{stat as ci,watch as li}from"fs/promises";import{normalize as fi,join as pi}from"@remotex-labs/xmap";var he=class{excludes;include;debounceTimer=null;framework=u(b);constructor(e=[],t=["**/*"]){this.include=t,this.excludes=e}async start(e){let t=new Set,i=li(this.framework.rootPath,{recursive:!0});for await(let{filename:o}of i){if(!o)continue;let n=fi(o);if(n.endsWith("~")||!this.include.some(a=>jt(n,a))||this.excludes.some(a=>jt(n,a)))continue;let s=pi(this.framework.rootPath,n);try{if(!(await ci(s)).isFile())continue}catch{}t.add(n),this.debounce(()=>this.handleChangedFiles(e,t))}}async handleChangedFiles(e,t){e?.([...t]),t.clear()}debounce(e,t=150){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(e,t)}};import Ni from"typescript";import{build as Di}from"esbuild";import{writeFile as Yt,mkdir as ji,readFile as Li}from"fs/promises";import g from"typescript";import ui from"typescript";import{dirname as Lt,relative as di,toPosix as mi}from"@remotex-labs/xmap";var gi=/^#!.*(\r?\n)?/,hi=/export {};\n?/g,yi=/(?:\/\*\*[\s\S]*?\*\/\s*)+(\/\*\*[\s\S]*?\*\/)/g,vi=/^export\s+(?:default\s+)?/gm,xi=/(?<=[:;,{}\[\]()\w"'`])[ \t]*\/\*\*[^\r\n]*?\*\/[ \t]*$/gm;function bi(r){return r.charCodeAt(0)===35&&r.charCodeAt(1)===33?r.replace(gi,""):r}function Si(r){return r.includes("export {}")?r.replace(hi,""):r}function wi(r){return r=r.replace(xi,""),r.replace(yi,"$1")}function Ht(r){return r.replace(vi,"")}function Ei(r){return r.charCodeAt(0)===35||r.includes("export {}")||r.includes("/**")}function Te(r){return Ei(r)&&(r=bi(r),r=Si(r),r=wi(r)),r}function et(r,e){let{outDir:t,rootDir:i,declarationDir:o}=e,n=o||t||Lt(r),s=i||Lt(r),c=di(s,r).replace(/\.tsx?$/,".d.ts"),l=ui.sys.resolvePath(`${n}/${c}`);return mi(l)}var Vt,tt;Vt=[P({scope:"singleton"})];var Z=class{languageService;languageHostService;printer;nodesCache=new Map;filesCache=u(v);constructor(){this.printer=g.createPrinter({newLine:g.NewLineKind.LineFeed})}clear(){this.nodesCache.clear()}get(e){let t=this.filesCache.resolve(e);return this.nodesCache.get(t)}scan(e,t,i){let o=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{languageService:t,languageHostService:i}),n=this.filesCache.getSnapshot(e.fileName).version.toString(),s=this.nodesCache.get(e.fileName);if(s?.version===n)return s;let a=this.initDeclaration(e.fileName,n),c=this.emitDeclaration.call(o,e);return a.content=this.stripImportsExports.call(o,c,a),this.nodesCache.set(e.fileName,a),a}initDeclaration(e,t){return{version:t,fileName:e,content:"",internalDeps:new Set,externalImports:{named:Object.create(null),default:Object.create(null),namespace:Object.create(null)},internalExports:{star:[],exports:[],namespace:Object.create(null)},externalExports:{star:[],exports:Object.create(null),namespace:Object.create(null)}}}resolveModule(e,t){if(!g.isStringLiteral(e))return null;let i=e.text,o=this.languageHostService.resolveModuleName(i,t).resolvedModule?.resolvedFileName;return!o||o.includes("node_modules")?{fileName:i,isExternal:!0}:{fileName:o,isExternal:!1}}addNamedElements(e,t){for(let i of t){let o=i.propertyName?`${i.propertyName.text} as ${i.name.text}`:i.name.text;e.push(o)}}hasExportModifier(e){return g.canHaveModifiers(e)?g.getModifiers(e)?.some(i=>i.kind===g.SyntaxKind.ExportKeyword)??!1:!1}emitDeclaration(e){let i=this.languageService.getEmitOutput(e.fileName,!0,!0).outputFiles[0]?.text;if(!i)throw new Error(`Failed to emit declaration: ${e.fileName}`);return g.createSourceFile(e.fileName.replace(/\.tsx?$/,".d.ts"),i,g.ScriptTarget.Latest,!0)}stripImportsExports(e,t){let i=[],o=[],n=[];for(let l of e.statements){if(g.isImportDeclaration(l)){this.handleImport(l,t,i,o);continue}if(g.isExportDeclaration(l)){this.handleExport(l,t);continue}this.hasExportModifier(l)&&this.extractExportName(l,t),n.push(l)}let s=g.factory.createNodeArray(n),a=this.printer.printList(g.ListFormat.MultiLine,s,e),c=Ht(Te(a));for(let[l,p]of o)c=c.replace(new RegExp(`\\b${p}\\b`,"g"),l);for(let l of i)c=c.replace(new RegExp(`\\b${l}\\.`,"g"),"");return c}handleImport(e,t,i,o){let{importClause:n,moduleSpecifier:s}=e;if(!n||!s)return;let a=this.resolveModule(s,t.fileName);if(!a)return;let{fileName:c,isExternal:l}=a;if(!l){t.internalDeps.add(c);let{namedBindings:f}=n;if(!f)return;if(g.isNamespaceImport(f))i.push(f.name.text);else if(g.isNamedImports(f))for(let d of f.elements)d.propertyName&&o.push([d.propertyName.text,d.name.text]);return}if(!n){t.externalImports.namespace[c]="";return}n.name&&(t.externalImports.default[c]=n.name.text);let{namedBindings:p}=n;p&&(g.isNamespaceImport(p)?t.externalImports.namespace[p.name.text]=c:g.isNamedImports(p)&&this.addNamedElements(t.externalImports.named[c]??=[],p.elements))}handleExport(e,t){let{moduleSpecifier:i,exportClause:o}=e;if(!i)return;let n=this.resolveModule(i,t.fileName);if(!n)return;let{fileName:s,isExternal:a}=n;if(a||t.internalDeps.add(s),!o){a?t.externalExports.star.push(s):t.internalExports.star.push(s);return}if(g.isNamespaceExport(o)){a?t.externalExports.namespace[o.name.text]=s:t.internalExports.namespace[o.name.text]=s;return}g.isNamedExports(o)&&(a?this.addNamedElements(t.externalExports.exports[s]??=[],o.elements):this.addNamedElements(t.internalExports.exports,o.elements))}extractExportName(e,t){if(g.isVariableStatement(e)){for(let i of e.declarationList.declarations)g.isIdentifier(i.name)&&t.internalExports.exports.push(i.name.text);return}(g.isEnumDeclaration(e)||g.isClassDeclaration(e)||g.isFunctionDeclaration(e)||g.isInterfaceDeclaration(e)||g.isTypeAliasDeclaration(e))&&e.name&&g.isIdentifier(e.name)&&t.internalExports.exports.push(e.name.text)}};tt=F(null),Z=A(tt,0,"GraphModel",Vt,Z),k(tt,1,Z);import G from"typescript";import{matchesGlob as Mi}from"path";import{relative as Bi}from"@remotex-labs/xmap";import{mkdir as Ci,writeFile as Ii}from"fs/promises";import{join as Ti,dirname as Oi}from"@remotex-labs/xmap";var _t=`/**
* This file was automatically generated by xBuild.
* DO NOT EDIT MANUALLY.
*/
`;var Oe=class{constructor(e,t){this.languageService=e;this.languageHostService=t}languageService;languageHostService;graphModel=u(Z);async emit(e,t){let i=this.languageService?.getProgram();if(!i)throw new Error("Language service program not available");let o=this.languageHostService.getCompilationSettings();t&&(o={...o,outDir:t}),await Promise.all(Object.entries(e).map(async([n,s])=>{let a=i.getSourceFile(s);if(!a)return;let c=Ti(o.outDir,`${n}.d.ts`);await this.bundleCollectDeclarations(a,i,c)}))}async bundleCollectDeclarations(e,t,i){let o=this.graphModel.scan(e,this.languageService,this.languageHostService),n=await this.getBundleContent(o,t);await Ci(Oi(i),{recursive:!0}),await Ii(i,n,"utf-8")}async getBundleContent(e,t){let i=new Set,o=new Set([e]),n=new Set([e]),s=[...e.internalDeps],a=new Set(e.internalExports.star),c="";for(;s.length>0;){let l=s.pop();if(i.has(l))continue;i.add(l);let p=t.getSourceFile(l);if(!p)continue;let f=this.graphModel.scan(p,this.languageService,this.languageHostService);if(n.add(f),a.has(l)){o.add(f);for(let d of f.internalExports.star)a.add(d)}for(let d of f.internalDeps)i.has(d)||s.push(d);c+=f.content}return c+=e.content,this.parseContent(c,n,o)}collectExternalImports(e){let t=new Map;for(let i of e){for(let[o,n]of Object.entries(i.externalImports.default)){t.has(o)||t.set(o,{named:new Set,namespace:new Map});let s=t.get(o);s.default||(s.default=n)}for(let[o,n]of Object.entries(i.externalImports.named)){t.has(o)||t.set(o,{named:new Set,namespace:new Map});for(let s of n)t.get(o).named.add(s)}for(let[o,n]of Object.entries(i.externalImports.namespace))t.has(n)||t.set(n,{named:new Set,namespace:new Map}),t.get(n).namespace.set(o,n)}return t}generateImportStatements(e){let t=[];for(let[i,{default:o,named:n,namespace:s}]of e){let a=[];if(o&&a.push(o),n.size>0&&a.push(`{ ${Array.from(n).sort().join(", ")} }`),s.size>0)for(let[c]of s)t.push(`import * as ${c} from '${i}';`);a.length>0&&t.push(`import ${a.join(", ")} from '${i}';`)}return t}collectNamespaceExports(e,t=new Set){if(t.has(e))return{exports:[],declarations:[]};t.add(e);let i=this.graphModel.get(e);if(!i)return{exports:[],declarations:[]};let o=[...i.internalExports.exports],n=[];for(let[s,a]of Object.entries(i.internalExports.namespace)){let c=this.collectNamespaceExports(a,t);c.exports.length>0&&(n.push(...c.declarations),n.push(`const ${s} = { ${c.exports.join(", ")} };`),o.push(s))}for(let s of i.externalExports.star){let a=this.collectNamespaceExports(s,t);o.push(...a.exports),n.push(...a.declarations)}return{exports:o,declarations:n}}collectBundleExports(e){let t=[],i=[],o=[];for(let n of e){t.push(...n.internalExports.exports);for(let[s,a]of Object.entries(n.internalExports.namespace)){let c=this.collectNamespaceExports(a);c.exports.length>0&&(i.push(...c.declarations),i.push(`const ${s} = { ${c.exports.join(", ")} };`),t.push(s))}for(let s of n.externalExports.star)i.push(`export * from '${s}';`);for(let[s,a]of Object.entries(n.externalExports.namespace))o.push(`export * as ${s} from '${a}';`);for(let[s,a]of Object.entries(n.externalExports.exports))o.push(`export { ${a.join(`,
`)} } from '${s}';`)}return{exports:t,declarations:i,externalExports:o}}parseContent(e,t,i){let o=[_t],n=this.collectExternalImports(t),s=this.generateImportStatements(n);o.push(...s),s.length>0&&o.push("");let{exports:a,declarations:c,externalExports:l}=this.collectBundleExports(i);if(c.length>0&&(o.push(...c),o.push("")),o.push(e),a.length>0){let p=Array.from(new Set(a)).sort();o.push(`export {
${p.join(`,
`)}
};`)}return l.length>0&&o.push(...l),o.join(`
`)}};import{dirname as Fi}from"@remotex-labs/xmap";import{mkdir as ki,writeFile as Ai}from"fs/promises";import{xterm as Pi}from"@remotex-labs/xansi/xterm.component";var Fe=class r{constructor(e,t){this.languageService=e;this.languageHostService=t}languageService;languageHostService;static emittedVersions=new Map;static clearCache(){this.emittedVersions.clear()}async emit(e){let t=this.languageService.getProgram();if(!t)throw new Error(`${Pi.deepOrange("[TS]")} Language service program is not available`);let i=this.languageHostService.getCompilationSettings();e&&(i={...i,outDir:e});let o=[],n=t.getSourceFiles();for(let s=0;s<n.length;s++){let a=n[s];this.shouldEmitFile(a,t,i)&&o.push(a)}o.length!==0&&await Promise.all(o.map(s=>this.emitSingleDeclaration(s,i)))}shouldEmitFile(e,t,i){if(e.isDeclarationFile||t.isSourceFileFromExternalLibrary(e))return!1;let o=et(e.fileName,i),n=r.emittedVersions.get(o),s=this.languageHostService.getScriptVersion(e.fileName);return!n||n!==s?(r.emittedVersions.set(o,s),!0):!1}async emitSingleDeclaration(e,t){let i=this.languageService.getEmitOutput(e.fileName,!0);if(i.emitSkipped)return;let o=i.outputFiles[0].text,n=et(e.fileName,t);o=Te(o),o=this.languageHostService.resolveAliases(o,e.fileName,".d.ts"),await ki(Fi(n),{recursive:!0}),await Ai(n,o,"utf8")}};import te from"typescript";import{relative as Ri,dirname as $i}from"@remotex-labs/xmap";var re=class r{constructor(e={}){this.compilerOptions=e;this.alias=r.generateAliasRegex(e),this.moduleResolutionCache=te.createModuleResolutionCache(process.cwd(),t=>t,this.compilerOptions)}compilerOptions;static sys=te.sys;alias;aliasCache=new Map;moduleResolutionCache;trackFiles=new Set;filesCache=u(v);get aliasRegex(){return this.alias}set options(e){this.compilerOptions=e,this.alias=r.generateAliasRegex(e),this.moduleResolutionCache=te.createModuleResolutionCache(process.cwd(),t=>t,this.compilerOptions)}static reload(){let e=u(v);e.getTrackedFilePaths().map(t=>{e.touchFile(t)})}touchFile(e){return this.trackFiles.add(this.filesCache.resolve(e)),this.filesCache.touchFile(e)}touchFiles(e){for(let t of e)this.touchFile(t)}getCompilationSettings(){return this.compilerOptions}fileExists(e){return r.sys.fileExists(e)}readFile(e,t){return r.sys.readFile(e,t)}readDirectory(e,t,i,o,n){return r.sys.readDirectory(e,t,i,o,n)}getDirectories(e){return r.sys.getDirectories(e)}directoryExists(e){return r.sys.directoryExists(e)}getCurrentDirectory(){return r.sys.getCurrentDirectory()}getScriptFileNames(){return[...this.trackFiles]}getDefaultLibFileName(e){return te.getDefaultLibFilePath(e)}getScriptVersion(e){let t=this.filesCache.getSnapshot(e);return this.trackFiles.add(this.filesCache.resolve(e)),t?t.version.toString():"0"}hasScriptSnapshot(e){return this.trackFiles.has(this.filesCache.resolve(e))}getScriptSnapshot(e){let t=this.filesCache.getSnapshot(e);return this.trackFiles.add(this.filesCache.resolve(e)),t?t.contentSnapshot:this.touchFile(e).contentSnapshot}resolveModuleName(e,t){return te.resolveModuleName(e,t,this.compilerOptions,te.sys,this.moduleResolutionCache)}resolveModuleFileName(e,t){if(this.aliasCache.has(e))return this.aliasCache.get(e);let o=this.resolveModuleName(e,t).resolvedModule?.resolvedFileName;return this.aliasCache.set(e,o),o}resolveAliases(e,t,i=""){return this.alias?e.replace(this.alias,(o,n)=>{let s=this.resolveModuleFileName(n,t);if(!s)return o;let a=s.replace(/\.tsx?$/,i),c=Ri($i(t),a);return o.replace(n,c.startsWith(".")?c:"./"+c)}):e}static generateAliasRegex(e){let t=e.paths;if(!t||Object.keys(t).length<1)return;let i=Object.keys(t).map(o=>o.replace("/*","").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|");return new RegExp(`(?:^|\\s)(?:import|export)\\s+(?:type\\s+)?(?:[^'"]*from\\s+)?['"]((${i})[^'"]*)['"];?`,"gm")}};var Ut,rt;Ut=[P({providers:[{useValue:"tsconfig.json"}]})];var N=class N{constructor(e="tsconfig.json"){this.configPath=e;let{config:t,host:i,service:o}=this.acquireLanguageService();this.config=t,this.languageService=o,this.languageHostService=i,this.languageHostService.touchFiles(this.config.fileNames),this.emitterService=new Fe(o,i),this.bundlerService=new Oe(o,i)}configPath;config;languageService;languageHostService;static serviceCache=new Map;emitterService;bundlerService;check(e){let t=this.languageService.getProgram();if(!t)return[];let i=e&&e.length>0?e.map(o=>t.getSourceFile(o)):this.languageService.getProgram()?.getSourceFiles();return i?i.filter(o=>this.shouldCheckFile(o)).flatMap(o=>this.collectDiagnostics(o)):[]}touchFiles(e){for(let t of e)if(this.languageHostService.hasScriptSnapshot(t)&&this.languageHostService.touchFile(t),t.includes(this.configPath)){let i=N.serviceCache.get(this.configPath);i.config=this.parseConfig(),i.host.options=i.config.options}}async emitBundle(e,t){await this.bundlerService.emit(e,t)}async emit(e){await this.emitterService.emit(e)}dispose(e){let t=N.serviceCache.get(e);t&&(t.refCount--,N.cleanupUnusedServices())}static cleanupUnusedServices(){for(let[e,t]of this.serviceCache)t.refCount<1&&(t.service.dispose(),this.serviceCache.delete(e))}shouldCheckFile(e){if(!e||e.fileName.includes("node_modules"))return!1;if(this.config.raw?.exclude){for(let t of this.config.raw.exclude)if(Mi(Bi(this.config.options.rootDir,e.fileName),t))return!1}return!e.isDeclarationFile}collectDiagnostics(e){return[...this.languageService.getSemanticDiagnostics(e.fileName),...this.languageService.getSyntacticDiagnostics(e.fileName),...this.languageService.getSuggestionDiagnostics(e.fileName)].map(t=>this.formatDiagnostic(t))}acquireLanguageService(){let e=N.serviceCache.get(this.configPath);return e?(e.refCount++,e):this.createLanguageService()}createLanguageService(){let e=this.parseConfig(),t=new re(e.options),i=G.createLanguageService(t,G.createDocumentRegistry()),o={config:e,host:t,service:i,refCount:1};return N.serviceCache.set(this.configPath,o),o}parseConfig(){let e=G.getParsedCommandLineOfConfigFile(this.configPath,{sourceMap:!1,skipLibCheck:!0,stripInternal:!0,declarationMap:!1,emitDeclarationOnly:!0},{...G.sys,onUnRecoverableConfigFileDiagnostic:()=>{}});return e||(e={options:{strict:!0,target:G.ScriptTarget.ESNext,module:G.ModuleKind.NodeNext,sourceMap:!1,skipLibCheck:!0,stripInternal:!0,declarationMap:!1,emitDeclarationOnly:!0,moduleResolution:G.ModuleResolutionKind.NodeNext},errors:[],fileNames:[],projectReferences:void 0}),e.options={...e.options,rootDir:e.options?.rootDir??process.cwd()},e}formatDiagnostic(e){let t={message:G.flattenDiagnosticMessageText(e.messageText,`
`),category:e.category};if(e.file&&e.start!==void 0){let{line:i,character:o}=e.file.getLineAndCharacterOfPosition(e.start);t.file=e.file.fileName,t.line=i+1,t.column=o+1,t.code=e.code}return t}};rt=F(null),N=A(rt,0,"TypescriptService",Ut,N),k(rt,1,N);var ie=N;import{cwd as ke}from"process";import{build as it}from"esbuild";var zt={write:!1,bundle:!0,minify:!0,outdir:`${ke()}`,format:"esm",target:"esnext",platform:"browser",sourcemap:"external",mangleQuoted:!0,sourcesContent:!0,preserveSymlinks:!0};async function Wt(r,e={}){try{return await it({absWorkingDir:ke(),...zt,...e,metafile:!0,entryPoints:r})}catch(t){if(V(t)){let i=new AggregateError([],"Failed to build entryPoints");throw de(t.errors,i.errors),i}throw t}}async function Gt(r,e,t={}){return await it({absWorkingDir:ke(),...zt,...t,stdin:{loader:"ts",contents:r,resolveDir:ke(),sourcefile:e},write:!1,metafile:!0,logLevel:"silent",sourcemap:"external"})}async function Kt(r,e={}){try{return await it({...e,outdir:"tmp",write:!1,bundle:!0,outfile:void 0,metafile:!0,packages:"external",logLevel:"silent",entryPoints:r})}catch(t){if(V(t)){let i=new AggregateError([],"Failed to analyze entryPoint");throw de(t.errors,i.errors),i}throw t}}import{relative as Hi,resolve as Vi,join as Xt,dirname as _i}from"@remotex-labs/xmap";function qt(r,e){if(Array.isArray(e)){let t={};return e.length>0&&typeof e[0]=="object"?e.forEach(i=>{t[i.out]=i.in}):typeof e[0]=="string"&&(t=Ee(r,e)),t}else{if(e&&typeof e=="object")return e;if(e===void 0)return}throw new S("Unsupported entry points format")}var Ae=class{constructor(e,t,i,o={}){this.name=e;this.lifecycle=t;this.buildConfig=i;this.argv=o;if(!this.buildConfig?.esbuild)throw new S(`Variant '${this.name}' not found configuration`);this.tsConfigPath=this.buildConfig.esbuild.tsconfig??"tsconfig.json",this.typescriptModule=new ie(this.tsConfigPath),this.buildConfig=this.initializeConfig(this.getConfig(this.buildConfig,this.configService.getValue().common)),this.lifecycle.onEnd(this.end.bind(this),`${this.name}-core`),this.lifecycle.onStart(this.start.bind(this),`${this.name}-core`),this.configUnsubscribe=this.configService.select(n=>({variantConfig:n.variants?.[this.name],commonConfig:n.common})).subscribe(this.handleConfigChange.bind(this),n=>{throw n})}name;lifecycle;buildConfig;argv;dependenciesFile;active=!0;tsConfigPath;typescriptModule;configUnsubscribe;configService=u(x);get typescript(){return this.typescriptModule}get config(){return this.buildConfig}get dependencies(){return this.dependenciesFile??{}}dispose(){this.configUnsubscribe(),this.typescriptModule.dispose(this.tsConfigPath)}touchFiles(e){this.typescriptModule.touchFiles(e)}async check(){return this.dependenciesFile||(this.dependenciesFile=await this.buildDependencyMap()),this.typescriptModule.check(Object.values(this.dependenciesFile))}async build(){if(!this.active)return;this.applyInjections();let e=Object.assign({},this.buildConfig.esbuild);if(this.dependenciesFile=await this.buildDependencyMap(),this.buildConfig.esbuild.bundle===!1&&Object.assign(e,{entryPoints:this.dependenciesFile}),this.config.define&&e.define)for(let[t,i]of Object.entries(this.config.define))typeof i=="function"&&(e.define[t]=JSON.stringify(i()));try{let t=await Di(e);return await this.packageTypeComponent(),t}catch(t){if(V(t)){if(t.errors.filter(o=>o.location).length>0)throw t;return{errors:t?.errors??[],warnings:t?.warnings??[]}}}}getConfig(e,t={}){return e?z({},t,e):null}async start(){let e={errors:[],warnings:[]};if(!this.buildConfig.types)return e;let t=this.typescriptModule.check(Object.values(this.dependenciesFile??{}));if(t.length===0)return e;if(typeof this.buildConfig.types=="object"&&!this.buildConfig.types.failOnError){let o=new M("Type checking failed",t);e.warnings?.push({detail:o,location:void 0})}else{let o=[],n=[],s=new M("Type checking failed",o),a=new M("Type checking failed",n);for(let c of t)(c.category===Ni.DiagnosticCategory.Error?o:n).push(c);o.length&&e.errors?.push({detail:s,location:void 0}),n.length&&e.warnings?.push({detail:a,location:void 0})}return e}async end(e){if(e.buildResult.errors?.length>0)return;let t={errors:[],warnings:[]};if(typeof e.buildResult.metafile?.outputs=="object"){let s=Object.keys(e.buildResult.metafile?.outputs);for(let a of s){if(!a.endsWith(".map"))continue;let c=_i(a),l=await Li(a,"utf8"),p=JSON.parse(l);p.sources=p.sources.map(f=>f.startsWith("http")?f:Xt(c,f)),await Yt(a,JSON.stringify(p),"utf8")}}if(!this.buildConfig.declaration)return;let i=this.buildConfig.declaration,o=typeof i=="object"?i.bundle!==!1:!0,n=typeof i=="object"?i.outDir:void 0;try{o?await this.typescriptModule.emitBundle(this.buildConfig.esbuild.entryPoints,n):await this.typescriptModule.emit(n)}catch(s){t.warnings?.push({detail:s,location:void 0})}return t}registerConfigHooks(e){if(!e)return;let{onStart:t,onResolve:i,onLoad:o,onEnd:n,onSuccess:s}=e;t&&this.lifecycle.onStart(t),i&&this.lifecycle.onResolve(i),o&&this.lifecycle.onLoad(o),n&&this.lifecycle.onEnd(n),s&&this.lifecycle.onSuccess(s)}async packageTypeComponent(){let e=this.buildConfig.esbuild.outdir??"dist",t=this.buildConfig.esbuild.format==="esm"?"module":"commonjs";await ji(e,{recursive:!0}),await Yt(Xt(e,"package.json"),`{"type": "${t}"}`)}initializeConfig(e){if(!e)throw new S(`Variant '${this.name}' not found configuration`);if(!e.esbuild.entryPoints&&!e.esbuild.stdin)throw new S("Entry points are required in esbuild configuration");let t=e.define,i=t?Object.fromEntries(Object.entries(t).flatMap(([o,n])=>typeof n=="function"?[]:[[o,JSON.stringify(n)]])):void 0;return this.registerConfigHooks(e.lifecycle),e.esbuild.entryPoints=qt(this.typescriptModule.config.options.rootDir??process.cwd(),e.esbuild.entryPoints),e.esbuild=Object.assign({},e.esbuild,{define:i,logLevel:"silent",plugins:[this.lifecycle.create()]}),e}async handleConfigChange({variantConfig:e,commonConfig:t}){this.active=!1;let i=this.getConfig(e,t);i&&(this.active=!0,this.buildConfig=this.initializeConfig(i),i.esbuild.outdir&&i.esbuild.outfile&&(this.buildConfig.esbuild.outdir=void 0),i.esbuild.tsconfig&&i.esbuild.tsconfig!==this.tsConfigPath&&(this.typescriptModule.dispose(this.tsConfigPath),this.tsConfigPath=i.esbuild.tsconfig,this.typescriptModule=new ie(this.tsConfigPath)))}stripExtension(e){let t=e.lastIndexOf(".");return t>0?e.substring(0,t):e}async buildDependencyMap(){let{esbuild:e}=this.buildConfig,t={...e,plugins:void 0},{metafile:i}=await Kt(e.entryPoints,t),o={};for(let n of Object.keys(i.inputs)){let s=Hi(this.typescriptModule.config.options.rootDir,Vi(n)),a=this.stripExtension(s);o[a]=n}return o}injectTextBlock(e){let t=this.buildConfig[e];if(!t)return;let i=this.buildConfig.esbuild;i[e]??={};for(let[o,n]of Object.entries(t))i[e][o]=typeof n=="function"?n(this.name,this.argv):n}applyInjections(){this.injectTextBlock("banner"),this.injectTextBlock("footer")}};import{readFile as Ui}from"fs/promises";import{resolve as zi}from"@remotex-labs/xmap";var Pe=class{constructor(e,t){this.variantName=e;this.argv=t}variantName;argv;filesModel=u(v);endHooks=new Map;loadHooks=new Map;startHooks=new Map;successHooks=new Map