@remotex-labs/xbuild
Version:
A versatile JavaScript and TypeScript toolchain build system
86 lines (80 loc) • 33.8 kB
JavaScript
import{cwd as me}from"process";import{readFileSync as ge}from"fs";import{fileURLToPath as he}from"url";import{dirname as W,join as ye,resolve as $}from"path";import{SourceService as ve}from"@remotex-labs/xmap";function u(o,e,t=__ACTIVE_COLOR){return t?`${o}${e}\x1B[0m`:e}import{highlightCode as Se}from"@remotex-labs/xmap/highlighter.component";import{formatErrorCode as xe}from"@remotex-labs/xmap/formatter.component";var F=me(),L=W(he(import.meta.url)),be=W(L),_=(()=>{let o;return{get service(){if(!o){let e=ge(ye(L,"index.js.map"));o=new ve(e.toString(),import.meta.url)}return o}}})();global.__ACTIVE_COLOR||(global.__ACTIVE_COLOR=!0);function Ce(o,e,t,r){return`${o.replace(`${r}\\`,e).replace(/\\/g,"/")}#L${t}`}function A(o,e,t,r,i){if(i.isPromiseAll())return`at async Promise.all (index: ${i.getPromiseIndex()})`;let n=i.isAsync()?"async":"",a=o?`${n} ${o}`:n,l=t>=0&&r>=0?u("\x1B[38;5;243m",`[${t}:${r}]`):"";return`at ${a} ${u("\x1B[38;5;238m",e)} ${l}`.replace(/\s{2,}/g," ").trim()}function we(o){let e=o.getLineNumber()||-1,t=o.getColumnNumber()||-1,r=o.getFileName()||"<anonymous>",i=o.getTypeName()||"",n=o.getFunctionName()||"",a=o.isNative()?"<native>":n;return i&&(a=`${i}.${a}`),{functionName:a,source:r,line:e,column:t}}function Ee(o,e){let t=__ACTIVE_COLOR?Se(o.code):o.code;return o.name&&e.name=="TypeError"&&(e.message=e.message.replace(/^\S+/,o.name)),xe({...o,code:t},{color:__ACTIVE_COLOR?"\x1B[38;5;197m":"",reset:__ACTIVE_COLOR?"\x1B[0m":""})}function Te(o,e){let{functionName:t,source:r,line:i,column:n}=we(o);if(o.isPromiseAll()||o.isEval()||o.isNative())return A(t,r,i,n,o);let a=null,l=r===_.service.file;if(l?a=_.service.getPositionWithCode(i,n):e.error.sourceMap&&(a=e.error.sourceMap.getPositionWithCode(i,n)),a){let c=l?L:F,{line:f,column:m,name:x}=a,N=$(c,a.source);return e.blockCode||(e.blockCode=Ee(a,e.error)),a.sourceRoot&&(N=Ce($(c,a.source),a.sourceRoot,a.line,l?be:F)),A(x||t,N,f,m,o)}return r==="evalmachine.<anonymous>"?"":A(t,r,i,n,o)}function ke(o,e){return e.map(t=>Te(t,o)).filter(Boolean)}function K(o,e){let t={error:o,blockCode:null,formattedError:global.__ACTIVE_COLOR?"\x1B[0m":""},r=ke(t,e);return t.formattedError+=`
${o.name}:
${u("\x1B[38;5;203m",o.message)}
`,t.blockCode&&(t.formattedError+=`${t.blockCode}
`),r.length>0&&(t.formattedError+=`Enhanced Stack Trace:
${r.join(`
`)}
`),t.formattedError}var j=Error.prepareStackTrace;Error.prepareStackTrace=(o,e)=>(o.callStacks=e,j?j(o,e):"");process.on("uncaughtException",o=>{console.error(o.stack),process.exit(1)});process.on("unhandledRejection",o=>{console.error(o.stack),process.exit(1)});import{existsSync as vt}from"fs";import Pe from"yargs";import{hideBin as Oe}from"yargs/helpers";function H(o){let e=Pe(Oe(o)).command("$0 [file]","A versatile JavaScript and TypeScript toolchain build system.",t=>{t.positional("entryPoints",{describe:"The file entryPoints to build",type:"string"}).option("typeCheck",{describe:"Perform type checking",alias:"tc",type:"boolean"}).option("node",{alias:"n",describe:"Build for node platform",type:"boolean"}).option("dev",{alias:"d",describe:"Array entryPoints to run as development in Node.js",type:"array"}).option("debug",{alias:"db",describe:"Array entryPoints to run in Node.js with debug state",type:"array"}).option("serve",{alias:"s",describe:"Serve the build folder over HTTP",type:"boolean"}).option("outdir",{alias:"o",describe:"Output directory",type:"string"}).option("declaration",{alias:"de",describe:"Add TypeScript declarations",type:"boolean"}).option("watch",{alias:"w",describe:"Watch for file changes",type:"boolean"}).option("config",{alias:"c",describe:"Build configuration file (js/ts)",type:"string",default:"xbuild.config.ts"}).option("tsconfig",{alias:"tsc",describe:"Set TypeScript configuration file to use",type:"string",default:"tsconfig.json"}).option("minify",{alias:"m",describe:"Minify the code",type:"boolean"}).option("bundle",{alias:"b",describe:"Bundle the code",type:"boolean"}).option("noTypeChecker",{alias:"ntc",describe:"Skip TypeScript type checking",type:"boolean"}).option("buildOnError",{alias:"boe",describe:"Continue building even if there are TypeScript type errors",type:"boolean"}).option("format",{alias:"f",describe:"Defines the format for the build output ('cjs' | 'esm' | 'iif').",type:"string"}).option("version",{alias:"v",describe:"Show version number",type:"boolean",default:!1,conflicts:"help"})}).help().alias("help","h").version(!1).middleware(t=>{t.version&&process.exit(0)});return e.showHelp(t=>{(process.argv.includes("--help")||process.argv.includes("-h"))&&(console.log(t+`
`),process.exit(0))}),e}import*as de from"node:process";import{dirname as gt,resolve as C}from"path";import{build as ht,context as yt}from"esbuild";import{spawn as De}from"child_process";function V(o,e=!1){let t=["--enable-source-maps",o];e&&t.unshift("--inspect-brk=0.0.0.0:0");let r=De("node",t);return r.stdout.on("data",i=>{console.log(i.toString())}),r.stderr.on("data",i=>{console.error(i.toString())}),r}import p from"typescript";import{promises as Be}from"fs";import{cwd as Re}from"process";import{build as U}from"esbuild";var y=class o extends Error{constructor(t,r){super(t);this.sourceMap=r;Error.captureStackTrace&&Error.captureStackTrace(this,o),this.name="xBuildBaseError"}callStacks=[];reformatStack(t){return t.callStacks?K(this,t.callStacks):t.stack??""}};var g=class o extends y{originalErrorStack;constructor(e,t){super(e),Error.captureStackTrace&&Error.captureStackTrace(this,o),t&&Object.assign(this,t),this.name="xBuildError",this.originalErrorStack=this.stack,this.stack=this.reformatStack(this)}};var Me={write:!1,bundle:!0,minify:!0,format:"cjs",target:"esnext",platform:"node",sourcemap:!0,sourcesContent:!0,preserveSymlinks:!0};function Ie(o){let e=/\/\/# sourceMappingURL=data:application\/json;base64,([^'"\s]+)/,t=o.match(e);if(!t||!t[1])throw new g("Source map URL not found in the output.");let r=t[1];return{code:o.replace(e,""),sourceMap:r}}async function J(o,e={}){let t={absWorkingDir:Re(),...Me,...e,entryPoints:[o]},i=(await U(t)).outputFiles?.pop()?.text??"";return Ie(i)}async function w(o,e="browser"){return await U({outdir:"tmp",write:!1,bundle:!0,metafile:!0,platform:e,packages:"external",logLevel:"silent",entryPoints:o,loader:{".html":"text"}})}function Ae(o,e){let t=p.createSourceFile("temp.ts",o,p.ScriptTarget.Latest,!0),r=i=>{if(p.isFunctionDeclaration(i)&&i.name&&i.name.text.startsWith("$$")){e.removeFunctions.add(i.name.text);return}if(p.isVariableStatement(i)&&i.declarationList.declarations.length>0){i.declarationList.declarations.forEach(n=>{p.isIdentifier(n.name)&&n.name.text.startsWith("$$")&&n.initializer&&(p.isArrowFunction(n.initializer)||p.isFunctionExpression(n.initializer))&&e.removeFunctions.add(n.name.text)});return}if(p.isIdentifier(i)&&p.isExpression(i)&&i.escapedText&&i.escapedText.startsWith("$$")){e.removeFunctions.add(i.escapedText);return}p.forEachChild(i,r)};r(t)}async function Le(o,e,t){let r=Object.keys(o.inputs);for(let i of r){let n=await Be.readFile(i,"utf8"),a=/\/\/\s?ifdef\s?(\w+)([\s\S]*?)\/\/\s?endif/g,l;for(;(l=a.exec(n))!==null;){let[,c,f]=l;e.define[c]||Ae(f,t)}}}function Ne(o,e){let t=[];function r(n){if(p.isCallExpression(n)){let a=n.expression.getText(),l=a.endsWith("!")?a.slice(0,-1):a;l.startsWith("$$")&&e.removeFunctions.has(l)&&t.push({start:n.getStart(),end:n.getEnd(),replacement:"undefined"});let c=n.expression;if(p.isPropertyAccessExpression(c)){let f=c.name;p.isIdentifier(f)&&f.text.startsWith("$$")&&t.push({start:n.getStart(),end:n.getEnd(),replacement:"undefined"})}}p.forEachChild(n,r)}r(o),t.sort((n,a)=>a.start-n.start);let i=o.getFullText();for(let{start:n,end:a,replacement:l}of t)i=i.substring(0,n)+l+i.substring(a);return i}async function z(o,e,t,r,i){if(!t.path.endsWith(".ts")&&!t.path.endsWith(".js"))return{loader:e,contents:o};if(!r.macros){let l={removeFunctions:new Set},c=await w([t.path]);await Le(c.metafile,i,l),r.macros=l}let n=o.toString(),a=p.createSourceFile(t.path,n,p.ScriptTarget.Latest,!0);return{loader:e??"ts",contents:Ne(a,r.macros)}}import{join as $e}from"path";import{cwd as Fe}from"process";import{existsSync as _e,readFileSync as je}from"fs";import{highlightCode as We}from"@remotex-labs/xmap/highlighter.component";import{formatErrorCode as Ke}from"@remotex-labs/xmap/formatter.component";var E=class o extends y{originalErrorStack;constructor(e){super(e.text),this.name="esBuildError",Error.captureStackTrace&&Error.captureStackTrace(this,o),e.location?this.stack=this.generateFormattedError(e):(this.originalErrorStack=this.stack,this.stack=this.reformatStack(this))}generateFormattedError(e){let{text:t,location:r,notes:i}=e,n=this.applyColor("\x1B[0m",`
${this.name}: ${this.applyColor("\x1B[38;5;243m",r?.file??"")}
`);if(n+=this.applyColor("\x1B[38;5;203m",`${t}
`),i.forEach(a=>{n+=this.applyColor("\x1B[38;5;243m",`${a.text}
`)}),r){let a=this.readCode(r.file);a&&(n+=`${this.formatCodeSnippet(a,r)}
`)}return n}readCode(e){try{return _e(e)?je($e(Fe(),e),"utf-8").split(`
`):null}catch{return null}}formatCodeSnippet(e,t){let{line:r=1,column:i=0,file:n}=t,a=Math.max(r-3,0),l=Math.min(r+3,e.length),c=We(e.slice(a,l).join(`
`));return Ke({line:r,name:null,code:c,source:n,endLine:l,startLine:a,column:i+1,sourceRoot:null,sourceIndex:-1,generatedLine:-1,generatedColumn:-1},{color:global.__ACTIVE_COLOR?"\x1B[38;5;197m":"",reset:global.__ACTIVE_COLOR?"\x1B[0m":""})}applyColor(e,t){return global.__ACTIVE_COLOR?u(e,t):t}};function d(){return u("\x1B[38;5;203m","[xBuild]")}var v=class o extends y{originalError;originalErrorStack;constructor(e,t){super(e.message,t),Error.captureStackTrace&&Error.captureStackTrace(this,o),this.originalError=e,this.originalErrorStack=e.stack,this.name="VMRuntimeError",this.stack=this.reformatStack(e)}};import*as ee from"http";import*as te from"https";var G=`<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Directory Listing</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
}
h1 {
color: #333;
text-align: center;
padding: 20px;
}
ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
li {
background: #fff;
border: 1px solid #ddd;
border-radius: 4px;
margin: 5px;
padding: 10px;
width: 200px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
display: flex;
align-items: center;
}
i {
margin-right: 10px;
font-size: 18px;
color: #666;
}
a {
text-decoration: none;
color: #007bff;
}
a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<h1>Directory Listing</h1>
<ul>\${ fileList }</ul>
</body>
</html>
`;import{extname as q,join as Y,resolve as Ve}from"path";import{existsSync as Z,readdir as Ue,readFile as Je,readFileSync as X,stat as ze}from"fs";var Q={html:{icon:"fa-file-code",color:"#d1a65f"},css:{icon:"fa-file-css",color:"#264de4"},js:{icon:"fa-file-code",color:"#f7df1e"},json:{icon:"fa-file-json",color:"#b41717"},png:{icon:"fa-file-image",color:"#53a8e4"},jpg:{icon:"fa-file-image",color:"#53a8e4"},jpeg:{icon:"fa-file-image",color:"#53a8e4"},gif:{icon:"fa-file-image",color:"#53a8e4"},txt:{icon:"fa-file-alt",color:"#8e8e8e"},folder:{icon:"fa-folder",color:"#ffb800"}},T=class{rootDir;isHttps;config;constructor(e,t){this.rootDir=Ve(t),this.config=e,this.isHttps=this.config.keyfile&&this.config.certfile?Z(this.config.keyfile)&&Z(this.config.certfile):!1}start(){if(this.config.onStart&&this.config.onStart(),this.isHttps)return this.startHttpsServer();this.startHttpServer()}startHttpServer(){ee.createServer((t,r)=>{this.handleRequest(t,r,()=>this.defaultResponse(t,r))}).listen(this.config.port,this.config.host,()=>{console.log(`${d()} HTTP/S server is running at http://${this.config.host}:${this.config.port}`)})}startHttpsServer(){let e={key:X(this.config.keyfile),cert:X(this.config.certfile)};te.createServer(e,(r,i)=>{this.handleRequest(r,i,()=>this.defaultResponse(r,i))}).listen(this.config.port,this.config.host,()=>{let r=u("\x1B[38;5;227m",`https://${this.config.host}:${this.config.port}`);console.log(`${d()} HTTPS server is running at ${r}`)})}handleRequest(e,t,r){try{this.config.onRequest?this.config.onRequest(e,t,r):r()}catch(i){this.sendError(t,i)}}getContentType(e){return{html:"text/html",css:"text/css",js:"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 r=e.url==="/"?"":e.url?.replace(/^\/+/,"")||"",i=Y(this.rootDir,r);if(!i.startsWith(this.rootDir)){t.statusCode=403,t.end();return}try{let n=await this.promisifyStat(i);n.isDirectory()?this.handleDirectory(i,r,t):n.isFile()&&this.handleFile(i,t)}catch(n){let a=n.message;a.includes("favicon")||console.log(d(),a),this.sendNotFound(t)}}promisifyStat(e){return new Promise((t,r)=>{ze(e,(i,n)=>i?r(i):t(n))})}handleDirectory(e,t,r){Ue(e,(i,n)=>{if(i)return this.sendError(r,i);let a=n.map(l=>{if(l.match(/[^A-Za-z0-9_\/\\.-]/))return;let c=Y(t,l);if(c.match(/[^A-Za-z0-9_\/\\.-]/))return;let f=q(l).slice(1)||"folder",{icon:m,color:x}=Q[f]||Q.folder;return`<li><i class="fas ${m}" style="color: ${x};"></i> <a href="/${c}">${l}</a></li>`}).join("");r.writeHead(200,{"Content-Type":"text/html"}),r.end(G.replace("${ fileList }",a))})}handleFile(e,t){let r=q(e).slice(1)||"txt",i=this.getContentType(r);Je(e,(n,a)=>{if(n)return this.sendError(t,n);t.writeHead(200,{"Content-Type":i}),t.end(a)})}sendNotFound(e){e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Not Found")}sendError(e,t){console.error(`${d()}`,t.toString()),e.writeHead(500,{"Content-Type":"text/plain"}),e.end("Internal Server Error")}};import{promises as Ge}from"fs";import{resolve as qe}from"path";var k=class{buildState={};onEndHooks=[];onSuccess=[];onLoadHooks=[];onStartHooks=[];onResolveHooks=[];registerOnStart(e){e&&this.onStartHooks.push(e)}registerOnEnd(e){e&&this.onEndHooks.push(e)}registerOnSuccess(e){e&&this.onSuccess.push(e)}registerOnResolve(e){e&&this.onResolveHooks.push(e)}registerOnLoad(e){e&&this.onLoadHooks.push(e)}setup(){return{name:"middleware-plugin",setup:e=>{e.initialOptions.metafile=!0,e.onEnd(this.handleOnEnd.bind(this)),e.onStart(this.handleOnStart.bind(this,e)),e.onLoad({filter:/.*/},this.handleOnLoad.bind(this)),e.onResolve({filter:/.*/},this.handleOnResolve.bind(this))}}}async handleOnStart(e){this.buildState={};let t={errors:[],warnings:[]};for(let r of this.onStartHooks){let i=await r(e,this.buildState);i&&(i.errors?.length&&t.errors.push(...i.errors),i.warnings?.length&&t.warnings.push(...i.warnings))}return t}async handleOnEnd(e){let t={errors:e.errors??[],warnings:e.warnings??[]};for(let r of this.onEndHooks){e.errors=t.errors,e.warnings=t.warnings;let i=await r(e,this.buildState);i&&(i.errors?.length&&t.errors.push(...i.errors),i.warnings?.length&&t.warnings.push(...i.warnings))}if(t.errors.length<1)for(let r of this.onSuccess)await r(e,this.buildState);return t}async handleOnResolve(e){let t={};for(let r of this.onResolveHooks){let i=await r(e,this.buildState);i&&(t={...t,...i,path:i.path||t.path})}return t.path?t:null}async handleOnLoad(e){let t={contents:void 0,loader:"default"},r=qe(e.path);t.contents||(t.contents=await Ge.readFile(r,"utf8"));for(let i of this.onLoadHooks){let n=await i(t.contents??"",t.loader,e,this.buildState);n&&(t={...t,...n,contents:n.contents||t.contents,loader:n.loader||t.loader})}return t.contents?t:null}};function re(o,e){return o.replace(/\/\/\s?ifdef\s?(\w+)([\s\S]*?)\/\/\s?endif/g,(t,r,i)=>e[r]?i:`
`.repeat((i.match(/\n/g)||[]).length))}import{relative as Ye}from"path";function ie(o,e,t,r){let i=/(?:import|export)\s.*?\sfrom\s+['"]([^'"]+)['"]/g;for(let n in t){let a=Ye(e,t[n]).replace(/\\/g,"/");a.startsWith("..")||(a=`./${a}`),o=o.replaceAll(n,`${a}/`),r&&(o=o.replace(i,(l,c)=>(c.startsWith("../")||c.startsWith("./"))&&!c.endsWith(".js")?l.replace(c,`${c}.js`):l))}return o}import*as s from"typescript";var P=class o extends Error{constructor(e,t){super(e),this.name="TypesError",Object.setPrototypeOf(this,o.prototype),t?.cause&&(this.cause=t.cause)}};import{dirname as Ze,join as Xe,parse as oe,relative as ne,resolve as O,normalize as se}from"path";var Qe={ClassDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=s.factory.createModifier(s.SyntaxKind.DeclareKeyword),i=e?[t,r,...e]:[t,r];return s.factory.updateClassDeclaration(o,i,o.name,o.typeParameters,o.heritageClauses,o.members)},InterfaceDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=e?[t,...e]:[t];return s.factory.updateInterfaceDeclaration(o,r,o.name,o.typeParameters,o.heritageClauses,o.members)},EnumDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=s.factory.createModifier(s.SyntaxKind.DeclareKeyword),i=e?[t,r,...e]:[t,r];return s.factory.updateEnumDeclaration(o,i,o.name,o.members)},FunctionDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=s.factory.createModifier(s.SyntaxKind.DeclareKeyword),i=e?[t,r,...e]:[t,r];return s.factory.updateFunctionDeclaration(o,i,o.asteriskToken,o.name,o.typeParameters,o.parameters,o.type,o.body)},TypeAliasDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=e?[t,...e]:[t];return s.factory.updateTypeAliasDeclaration(o,r,o.name,o.typeParameters,o.type)},VariableStatement:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=s.factory.createModifier(s.SyntaxKind.DeclareKeyword),i=e?[t,r,...e]:[t,r];return s.factory.updateVariableStatement(o,i,o.declarationList)},ModuleDeclaration:(o,e)=>{let t=s.factory.createModifier(s.SyntaxKind.ExportKeyword),r=e?[t,...e]:[t];return s.factory.updateModuleDeclaration(o,r,o.name,o.body)}},D=class{constructor(e,t,r=!0){this.tsConfig=e;this.outDir=t;this.activeColor=r;this.options={...this.tsConfig.options,outDir:this.outDir}}options;typeCheck(e=!1){let t=s.createProgram(this.tsConfig.fileNames,{...this.options,noEmit:!0,skipLibCheck:!0,emitDeclarationOnly:!0});this.handleDiagnostics(s.getPreEmitDiagnostics(t),e)}generateBundleDeclarations(e,t=!1,r=!1){let i={...this.options,rootDir:this.options.baseUrl,declaration:!0,skipLibCheck:!0,emitDeclarationOnly:!0},n=this.tsConfig.fileNames;!this.tsConfig.raw.include&&!this.tsConfig.raw.files&&(n=[]),n=n.filter(a=>a.endsWith(".d.ts")),Object.entries(e).forEach(([a,l])=>{i.outFile=Xe(this.outDir,a);let c=s.createProgram(n.concat(l),i),f={afterDeclarations:[this.cleanupDeclarations()]},m=s.getPreEmitDiagnostics(c);!t&&m.some(x=>x.category===s.DiagnosticCategory.Error)&&this.handleDiagnostics(m,r),c.emit(void 0,void 0,void 0,void 0,f)})}generateDeclarations(e,t=!1,r=!1){let i=s.createProgram([...this.tsConfig.fileNames,...Object.values(e)],{...this.options,rootDir:this.options.baseUrl,declaration:!0,skipLibCheck:!0,emitDeclarationOnly:!0}),n=s.getPreEmitDiagnostics(i);!t&&n.some(a=>a.category===s.DiagnosticCategory.Error)&&this.handleDiagnostics(n,r),i.emit(void 0,void 0,void 0,!0,{afterDeclarations:[this.createTransformerFactory()]})}isImportOrExportDeclaration(e){return s.isImportDeclaration(e)||s.isExportDeclaration(e)}hasStringLiteralModuleSpecifier(e){return e.moduleSpecifier&&s.isStringLiteral(e.moduleSpecifier)}resolveModuleFileName(e,t){let r,i=s.resolveModuleName(e,t.baseUrl,t,s.sys);if(i.resolvedModule&&t.baseUrl){if(i.resolvedModule.resolvedFileName.includes("node_modules"))return r;r=O(i.resolvedModule.resolvedFileName).replace(O(t.baseUrl),".")}return r}getRelativePathToOutDir(e,t){e=O(e).replace(O(this.options.baseUrl??""),".");let r=ne(Ze(e),t).replace(/\\/g,"/"),i=oe(r);return i.dir.startsWith("..")||(i.dir=`./${i.dir}`),`${i.dir}/${i.name}`}updateModuleSpecifier(e,t){let r=s.factory.createStringLiteral(t);return s.isImportDeclaration(e)?s.factory.updateImportDeclaration(e,e.modifiers,e.importClause,r,void 0):s.isExportDeclaration(e)?s.factory.updateExportDeclaration(e,e.modifiers,e.isTypeOnly,e.exportClause,r,void 0):e}createVisitor(e,t){let r=i=>{if(this.isImportOrExportDeclaration(i)&&this.hasStringLiteralModuleSpecifier(i)){let n=i.moduleSpecifier.text,a=this.resolveModuleFileName(n,this.options);if(a){let l=this.getRelativePathToOutDir(e.fileName,a);return this.updateModuleSpecifier(i,l)}}return s.visitEachChild(i,r,t)};return r}createTransformerFactory(){return e=>({transformSourceFile:t=>s.visitEachChild(t,this.createVisitor(t,e),e),transformBundle:t=>t})}handleDiagnostics(e,t=!1){if(e.length!==0&&(e.forEach(r=>{if(r.file&&r.start!==void 0){let{line:i,character:n}=r.file.getLineAndCharacterOfPosition(r.start),a=s.flattenDiagnosticMessageText(r.messageText,`
`),l=u("\x1B[38;5;81m",r.file.fileName,this.activeColor),c=u("\x1B[38;5;230m",`${i+1}:${n+1}`,this.activeColor),f=u("\x1B[38;5;9m","error",this.activeColor),m=u("\x1B[38;5;243m",`TS${r.code}`,this.activeColor);console.error(`${d()} ${l}:${c} - ${f} ${m}:${a}`)}else console.error(s.flattenDiagnosticMessageText(r.messageText,`
`))}),console.log(`
`),!t))throw new P("Type checking failed due to errors.")}isNodeWithModifiers(e){return s.isClassDeclaration(e)||s.isInterfaceDeclaration(e)||s.isEnumDeclaration(e)||s.isFunctionDeclaration(e)||s.isTypeAliasDeclaration(e)||s.isVariableStatement(e)||s.isModuleDeclaration(e)}removeExportModifiers(e){if(!e)return;let t=e.filter(r=>r.kind!==s.SyntaxKind.ExportKeyword&&r.kind!==s.SyntaxKind.DefaultKeyword);return t.length?t:void 0}updateNodeWithoutExports(e){let t=this.removeExportModifiers(e.modifiers);for(let[r,i]of Object.entries(Qe)){let n=s[`is${r}`];if(typeof n=="function"&&n(e))return i(e,t)}return e}visitNode(e,t){return this.isNodeWithModifiers(t)&&t.modifiers&&t.modifiers.some(i=>i.kind===s.SyntaxKind.ExportKeyword||i.kind===s.SyntaxKind.DefaultKeyword)?this.updateNodeWithoutExports(t):s.visitEachChild(t,r=>this.visitNode(e,r),e)}visitTopLevelStatement(e,t,r,i){if(s.isImportDeclaration(e)){if(e.moduleSpecifier&&s.isStringLiteral(e.moduleSpecifier)){let n=e.moduleSpecifier.text;if(r.includes(se(n)))return[];e.importClause&&(t.has(n)||t.set(n,[]),t.get(n).push(e.importClause))}return[]}return s.isImportEqualsDeclaration(e)?[]:s.isExportDeclaration(e)?[]:s.isModuleDeclaration(e)?e.modifiers?.some(n=>n.kind===s.SyntaxKind.DeclareKeyword)?e.body&&s.isModuleBlock(e.body)?e.body.statements.flatMap(n=>this.visitTopLevelStatement(n,t,r,i)):[]:[this.visitNode(i,e)]:[this.visitNode(i,e)]}visitSourceFile(e,t,r,i){let n=e.statements.flatMap(a=>this.visitTopLevelStatement(a,t,r,i));return s.factory.updateSourceFile(e,n,e.isDeclarationFile,e.referencedFiles,e.typeReferenceDirectives,e.hasNoDefaultLib,e.libReferenceDirectives)}mergeImportClauses(e,t=!0){if(e.length===0)return;if(e.length===1&&!t)return e[0];let r,i=t;t||(i=e.some(c=>c.isTypeOnly));let n=new Map,a;for(let c of e){if(c.name&&!r&&(r=c.name),c.namedBindings&&s.isNamedImports(c.namedBindings))for(let f of c.namedBindings.elements){let m=f.name.text;n.has(m)||n.set(m,f)}c.namedBindings&&s.isNamespaceImport(c.namedBindings)&&!a&&(a=c.namedBindings)}let l;return n.size>0?l=s.factory.createNamedImports(Array.from(n.values())):a&&(l=a),s.factory.createImportClause(i,r,l)}cleanupDeclarations(){return e=>t=>{if(!s.isBundle(t))throw new Error("Cannot process a single file, expected a bundle");let r=new Map,i=t.sourceFiles.map(c=>{let f=oe(ne(this.options.baseUrl??"",c.fileName));return se(`${f.dir?f.dir+"/":""}${f.name}`)}),n=t.sourceFiles.map(c=>this.visitSourceFile(c,r,i,e)),a=Array.from(r.entries()).map(([c,f])=>s.factory.createImportDeclaration(void 0,this.mergeImportClauses(f),s.factory.createStringLiteral(c))),l=s.factory.createSourceFile(a,s.factory.createToken(s.SyntaxKind.EndOfFileToken),s.NodeFlags.None);return s.factory.createBundle([l,...n])}}};import h from"typescript";import{dirname as at}from"path";import{existsSync as le,readFileSync as ct}from"fs";import{cwd as et}from"process";var R={dev:!1,watch:!1,declaration:!1,buildOnError:!1,noTypeChecker:!1,bundleDeclaration:!1,define:{},esbuild:{write:!0,bundle:!0,minify:!0,format:"cjs",outdir:"dist",platform:"browser",absWorkingDir:et(),loader:{".js":"ts"}},serve:{port:3e3,host:"localhost",active:!1}};import{createRequire as it}from"module";import{SourceService as ot}from"@remotex-labs/xmap";import{Script as tt,createContext as rt}from"vm";function ae(o,e={}){e.RegExp=RegExp,e.console=console;let t=new tt(o),r=rt(e);return t.runInContext(r,{breakOnSigint:!0})}function ce(o,e){for(let t in o)if(Object.prototype.hasOwnProperty.call(o,t)){let r=o[t];typeof r=="function"?o[t]=nt(r,e):typeof r=="object"&&r!==null&&ce(r,e)}return o}function nt(o,e){return(...t)=>{try{return o(...t)}catch(r){throw new v(r,e)}}}function st(o,e){return ce(o,e)}async function M(o){let{code:e,sourceMap:t}=await J(o,{banner:{js:"(function(module, exports) {"},footer:{js:"})(module, module.exports);"}}),r={exports:{}},i=it(import.meta.url),n=new ot(JSON.parse(atob(t)));try{await ae(e,{require:i,module:r})}catch(a){throw new v(a,n)}return st(r.exports.default,n)}var lt=JSON.stringify({compilerOptions:{strict:!0,target:"ESNext",module:"ESNext",outDir:"dist",skipLibCheck:!0,isolatedModules:!1,esModuleInterop:!1,moduleDetection:"force",moduleResolution:"node",resolveJsonModule:!0,allowSyntheticDefaultImports:!0,forceConsistentCasingInFileNames:!0}});function ft(o){let e=o.argv,t=i=>Object.fromEntries(Object.entries(i).filter(([,n])=>n!==void 0)),r=t({bundle:e.bundle,minify:e.minify,outdir:e.outdir,tsconfig:e.tsconfig,entryPoints:e.file?[e.file]:void 0,target:e.node?[`node${process.version.slice(1)}`]:void 0,platform:e.node?"node":void 0,format:e.format});return{...t({dev:e.dev,watch:e.watch,declaration:e.declaration,serve:e.serve?{active:e.serve}:{undefined:void 0}}),esbuild:r}}function fe(o){let e=o.tsconfig??"tsconfig.json",t=le(e)?ct(e,"utf8"):JSON.stringify(lt),r=h.parseConfigFileTextToJson(e,t);if(r.error)throw new g(h.formatDiagnosticsWithColorAndContext([r.error],{getCurrentDirectory:h.sys.getCurrentDirectory,getCanonicalFileName:n=>n,getNewLine:()=>h.sys.newLine}));let i=h.parseJsonConfigFileContent(r.config,h.sys,at(e));if(i.errors.length>0)throw new g(h.formatDiagnosticsWithColorAndContext(i.errors,{getCurrentDirectory:h.sys.getCurrentDirectory,getCanonicalFileName:n=>n,getNewLine:()=>h.sys.newLine}));return i}async function I(o,e={}){let t=Array.isArray(o)?o:[o],r=t[0];return t.flatMap(i=>{let n={...R,...r,...i,...e,esbuild:{...R.esbuild,...r?.esbuild,...i?.esbuild,...e.esbuild},serve:{...R.serve,...r.serve,...i.serve,...e.serve}};if(!n.esbuild.entryPoints)throw new g("entryPoints cannot be undefined.");return n})}async function ue(o,e){let t=ft(e),r=le(o)?await M(o):{};return I(r,t)}function ut(o){let e={};return o.forEach(t=>{let r=t.substring(0,t.lastIndexOf("."));e[r]=t}),e}function B(o){if(Array.isArray(o)){let e={};return o.length>0&&typeof o[0]=="object"?o.forEach(t=>{e[t.out]=t.in}):typeof o[0]=="string"&&(e=ut(o)),e}else if(o&&typeof o=="object")return o;throw new g("Unsupported entry points format")}import{join as pt}from"path";import{mkdirSync as dt,writeFileSync as mt}from"fs";function pe(o){let e=o.moduleTypeOutDir??o.esbuild.outdir??"dist",t=o.esbuild.format==="esm"?"module":"commonjs";dt(e,{recursive:!0}),mt(pt(e,"package.json"),`{"type": "${t}"}`)}var S=class{constructor(e){this.config=e;let t=fe(this.config.esbuild);this.config.esbuild.logLevel="silent",this.pluginsProvider=new k,this.typeScriptProvider=new D(t,this.config.declarationOutDir??t.options.outDir??this.config.esbuild.outdir),this.configureDevelopmentMode(),this.setupPlugins()}typeScriptProvider;activePossess=[];pluginsProvider;async run(){return await this.execute(async()=>{let e=await this.build();return(this.config.watch||this.config.dev)&&await e.watch(),e})}async runDebug(e){return await this.execute(async()=>{this.config.dev=!1,this.config.watch=!1;let t=await this.build();this.spawnDev(t.metafile,e,!0)})}async serve(){let e=new T(this.config.serve,this.config.esbuild.outdir??"");return await this.execute(async()=>{e.start(),await(await this.build()).watch()})}async execute(e){try{return await e()}catch(t){let r=t;Array.isArray(r.errors)&&(!this.config.watch||!this.config.dev||!this.config.serve.active)?this.handleErrors(r):console.error(new v(t).stack)}}configureDevelopmentMode(){this.config.dev!==!1&&(!Array.isArray(this.config.dev)||this.config.dev.length<1)&&(this.config.dev=["index"])}setupPlugins(){let e=C(this.typeScriptProvider.options.baseUrl??""),t=this.generatePathAlias(e);this.registerPluginHooks(t,e),this.pluginsProvider.registerOnLoad(async(r,i,n,a)=>await z(r,i,n,a,this.config))}registerPluginHooks(e,t){this.pluginsProvider.registerOnEnd(this.end.bind(this)),this.pluginsProvider.registerOnStart(this.start.bind(this)),this.pluginsProvider.registerOnLoad((r,i,n)=>{if(n.path.endsWith(".ts")){if(!this.config.esbuild.bundle){let a=gt(C(n.path).replace(t,"."));r=ie(r.toString(),a,e,this.config.esbuild.format==="esm")}return{loader:"ts",contents:re(r.toString(),this.config.define)}}})}generatePathAlias(e){let t=this.typeScriptProvider.options.paths,r={};for(let i in t){let n=t[i];if(n.length>0){let a=i.replace(/\*/g,"");r[a]=C(n[0].replace(/\*/g,"")).replace(e,".")}}return r}handleErrors(e){let t=e.errors??[];for(let r of t){if(!r.detail){console.error(new E(r).stack);continue}if(r.detail.name!=="TypesError"){if(r.detail.name){if(r.detail.name==="VMRuntimeError"){console.error(r.detail.stack);continue}if(r.detail instanceof Error){console.error(new v(r.detail).stack);continue}}return console.error(r.text)}}}injects(e,t,r){if(!t)return;e[r]||(e[r]={});let i=e[r];for(let n in t)if(t.hasOwnProperty(n)){let a=t[n];if(typeof a=="function"){console.log(`${d()} trigger ${r} function`),i[n]=a();continue}i[n]=a}}async build(){pe(this.config);let e=this.config.esbuild;this.config.hooks&&(this.pluginsProvider.registerOnEnd(this.config.hooks.onEnd),this.pluginsProvider.registerOnLoad(this.config.hooks.onLoad),this.pluginsProvider.registerOnEnd(this.config.hooks.onSuccess),this.pluginsProvider.registerOnStart(this.config.hooks.onStart),this.pluginsProvider.registerOnResolve(this.config.hooks.onResolve)),e.define||(e.define={});for(let t in this.config.define)e.define[t]=JSON.stringify(this.config.define[t]);return this.config.esbuild.bundle||await this.processEntryPoints(),e.plugins=[this.pluginsProvider.setup()],this.injects(this.config.esbuild,this.config.banner,"banner"),this.injects(this.config.esbuild,this.config.footer,"footer"),this.config.watch||this.config.dev||this.config.serve.active?await yt(e):await ht(e)}spawnDev(e,t,r=!1){if(Array.isArray(t))for(let i in e.outputs)i.includes("map")||!t.some(n=>i.includes(`/${n}.`))||this.activePossess.push(V(i,r))}async start(e,t){try{t.startTime=Date.now(),console.log(`${d()} StartBuild ${e.initialOptions.outdir}`),this.config.bundleDeclaration?this.typeScriptProvider.generateBundleDeclarations(B(this.config.esbuild.entryPoints),this.config.noTypeChecker,this.config.buildOnError):this.config.declaration?this.typeScriptProvider.generateDeclarations(B(this.config.esbuild.entryPoints),this.config.noTypeChecker,this.config.buildOnError):this.config.noTypeChecker||this.typeScriptProvider.typeCheck(this.config.buildOnError)}finally{for(;this.activePossess.length>0;){let r=this.activePossess.pop();r&&r.kill("SIGTERM")}}}async end(e,t){if(e.errors.length>0){this.handleErrors(e),!this.config.serve.active&&!this.config.dev&&!this.config.watch&&de.exit(1);return}let r=Date.now()-t.startTime;console.log(`
${d()} ${u("\x1B[38;5;166m",`Build completed! in ${r} ms`)}`),console.log(`${d()} ${Object.keys(e.metafile.outputs).length} Modules:`),Object.keys(e.metafile.outputs).forEach(i=>{let n=e.metafile.outputs[i].bytes;console.log(`${d()} ${u("\x1B[38;5;227m",i)}: ${u("\x1B[38;5;208m",n.toString())} bytes`)}),console.log(`
`),this.config.dev&&this.spawnDev(e.metafile,this.config.dev)}async processEntryPoints(){let e=this.config.esbuild,t=await w(e.entryPoints,e.platform),r=C(this.typeScriptProvider.options.baseUrl??""),i=B(e.entryPoints),n=Object.values(i);Array.isArray(e.entryPoints)&&typeof e.entryPoints[0]=="string"&&(i={},n=[]);for(let a in t.metafile.inputs){if(n.includes(a))continue;let l=C(a).replace(r,"."),c=l.substring(0,l.lastIndexOf("."));i[c]=a}e.entryPoints=i}};global.__ACTIVE_COLOR=!0;async function hi(o){let e=H(o),t=e.argv,i=(await ue(t.config,e)).map(async n=>{let a=new S(n);if(t.typeCheck)return a.typeScriptProvider.typeCheck(!0);if(t.serve||n.serve.active)return await a.serve();if(Array.isArray(t.debug))return t.debug.length<1&&(t.debug=["index"]),await a.runDebug(t.debug);await a.run()});await Promise.all(i)}async function yi(o){let e=vt(o)?await M(o):{},r=(await I(e)).map(async i=>await new S(i).run());return await Promise.all(r)}async function vi(o){let t=(await I(o)).map(async r=>await new S(r).run());return await Promise.all(t)}export{vi as build,hi as buildWithArgv,yi as buildWithConfigPath};
//# sourceMappingURL=index.js.map