amxxpack 1.5.0-beta.13 → 1.5.0-beta.14
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/lib/index.js +4 -4
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --no-deprecation
|
|
2
|
-
"use strict";var jt=Object.create;var ke=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var xt=Object.getPrototypeOf,Dt=Object.prototype.hasOwnProperty;var Pt=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports);var St=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of bt(e))!Dt.call(o,r)&&r!==t&&ke(o,r,{get:()=>e[r],enumerable:!(i=It(e,r))||i.enumerable});return o};var p=(o,e,t)=>(t=o!=null?jt(xt(o)):{},St(e||!o||!o.__esModule?ke(t,"default",{value:o,enumerable:!0}):t,o));var Ae=Pt((ni,Ft)=>{Ft.exports={name:"amxxpack",description:"AMXXPack",author:"Hedgehog Fog",version:"1.5.0-beta.13",license:"MIT",scripts:{test:"jest",build:"tsc && tsup",lint:"eslint",prepare:"npm run build"},main:"lib/index.js",bin:{amxxpack:"./lib/index.js"},files:["lib/**/*","resources/**/*"],repository:{type:"git",url:"https://github.com/Hedgefog/node-amxxpack"},bugs:{url:"https://github.com/Hedgefog/node-amxxpack/issues"},homepage:"https://github.com/Hedgefog/node-amxxpack",keywords:["amx","amxx","amxmodx","sourcemod","smx","cli","pawn","compiler","build","watch"],dependencies:{chokidar:"^4.0.3",colors:"^1.4.0",commander:"^14.0.0",decompress:"^4.2.1",globule:"^1.3.4",lodash:"^4.17.21","node-cache":"^5.1.2","node-fetch":"^2.7.0","normalize-path":"^3.0.0","string-argv":"^0.3.2"},devDependencies:{"@eslint/js":"^9.34.0","@stylistic/eslint-plugin":"^5.3.1","@types/chance":"^1.1.7","@types/decompress":"^4.2.7","@types/glob":"^8.1.0","@types/globule":"^1.1.10","@types/jest":"^28.1.8","@types/lodash":"^4.17.20","@types/node":"^24.3.1","@types/node-fetch":"^2.6.13","@types/normalize-path":"^3.0.2",chance:"^1.1.13",eslint:"^9.34.0",jest:"^28.1.3","ts-jest":"^28.0.8","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0",tsup:"^8.5.0","type-fest":"^4.41.0",typescript:"^4.9.5","typescript-eslint":"^8.41.0"}}});var yt=p(require("readline")),Ct=require("string-argv");var j=p(require("colors/safe"));var he=class{constructor(e={}){this.debugMode=e.debug||process.env.NODE_ENV==="development"}debug(...e){this.out("debug",...e)}success(...e){this.out("success",...e)}info(...e){this.out("info",...e)}warn(...e){this.out("warning",...e)}error(...e){this.out("error",...e)}out(e,...t){if(e==="debug"&&!this.debugMode)return;let i=t.map(c=>c instanceof Object?JSON.stringify(c):String(c)).join(" "),r=this.getLevelLabel(e),s=this.colorifyMessageByLevel(e,i),a=new Date().toLocaleTimeString();console.log(`[${a}]`,r,s)}colorifyMessageByLevel(e,t){switch(e){case"debug":return j.default.grey(t);case"success":return j.default.white(t);case"info":return j.default.grey(t);case"warning":return j.default.white(t);case"error":return j.default.white(t)}return t}getLevelLabel(e){switch(e){case"debug":return j.default.grey("[DEBUG]");case"success":return j.default.green("[SUCCESS]");case"info":return j.default.cyan("[INFO]");case"warning":return j.default.yellow("[WARNING]");case"error":return j.default.red("[ERROR]")}return""}},n=new he;var Me=require("commander");var g=class extends Error{constructor(e){super(e),this.name="CLIError"}};var N=p(require("path")),Le=p(require("os")),He=p(require("fs")),ve=N.default.join(Le.default.tmpdir(),".amxxpack");He.default.mkdirSync(ve,{recursive:!0});var we=process.env.RESOURCES_DIR||N.default.resolve(require.main.path,"..","resources"),l={title:"AMXXPack",command:"amxxpack",downloadDir:N.default.join(ve,"downloads"),cacheFile:N.default.join(ve,".cache.json"),resourcesDir:we,templatesDir:N.default.join(we,"templates"),projectTypesDir:N.default.resolve(we,"project-types"),version:Ae().version,project:{defaultVersion:"0.1.0",configFile:".amxxpack.json",defaultType:"amxmodx"}};function Tt(o){switch(o.code){case"commander.help":return n.info(`Use '${l.command} --help' to see all available commands`),!0;case"commander.version":return n.info(`${l.title} CLI v${o.message}`),!0}return!1}function _(o,e=!1){if(o instanceof Me.CommanderError){if(Tt(o)){e||process.exit(0);return}n.error(o.message)}else o instanceof Error?n.error(o.message):n.error("Unknown error");if(!e&&process.env.NODE_ENV==="development")throw o;e||process.exit(1)}var wt=require("commander");var pt=require("commander");function w(o){return async(...e)=>{try{await o(...e)}catch(t){_(t)}}}var Qe=require("commander");var P=p(require("path")),S=require("lodash");var h=require("lodash"),G=p(require("path")),J=p(require("fs"));var Et=(o,e)=>({type:o,input:{scripts:"./src/scripts",include:"./src/include",assets:"./assets"},output:{base:"./dist",scripts:`./addons/${e.addonName}/scripting`,plugins:`./addons/${e.addonName}/plugins`,include:`./addons/${e.addonName}/scripting/include`,assets:"./"},compiler:{dir:"./.compiler",version:e.defaultVersion,dev:!1,addons:[],executable:e.executable},thirdparty:{dir:"./.thirdparty",dependencies:[]},include:[],rules:{flatCompilation:!0,rebuildDependents:!0},cli:{templates:{context:{PLUGIN_VERSION:"1.0.0",PLUGIN_AUTHOR:l.title}}}});function $t(o){let e=G.default.resolve(l.projectTypesDir,`${o}.json`);if(!J.default.existsSync(e))throw new g(`Unsupported project type: ${o}`);return JSON.parse(J.default.readFileSync(e,"utf8"))}function ye(o,e,t){var C;t=t?G.default.resolve(t):process.cwd();let i=$t(o),r=Et(o,i),s=(0,h.defaultsDeep)({},e,r),a=((C=e.rules)==null?void 0:C.flatCompilation)??!0,c=m=>G.default.resolve(t,m),d=(m,D,M)=>{var $e,Re,Ne,Oe;let b=(0,h.isObject)(m)?m:{dir:m},V=(0,h.isObject)(D)?D:{dir:D};return(0,h.defaults)({src:c(b.dir),dest:G.default.resolve(t,s.output.base,V.dir,(($e=b.output)==null?void 0:$e.dir)||"."),prefix:[V.prefix,(Re=b.output)==null?void 0:Re.prefix].join(""),filter:b.filter?(0,h.castArray)(b.filter):[],flat:(0,h.isNil)((Ne=b.output)==null?void 0:Ne.flat)&&(0,h.isNil)(V.flat)?void 0:!!((Oe=b.output)!=null&&Oe.flat||V.flat)},M)},u=(m,D,M)=>{var b;return(0,h.isNull)((b=e.output)==null?void 0:b[m])?[]:(0,h.map)((0,h.castArray)(s.input[D]),V=>d(V,s.output[m],M))};return{type:o,path:t,defaults:{...(0,h.pick)(r,["type","input","output","thirdparty","include","cli"]),compiler:(0,h.pick)(r.compiler,["dir","version","addons","executable"])},cli:s.cli,targets:{assets:u("assets","assets",{flat:!1}),include:u("include","include",{flat:!0}),scripts:u("scripts","scripts",{flat:!0}),plugins:u("plugins","scripts",{flat:a})},include:(0,h.map)(s.include,c),compiler:{...s.compiler,dir:c(s.compiler.dir),config:i},thirdparty:{dir:c(s.thirdparty.dir),dependencies:(0,h.map)(s.thirdparty.dependencies,m=>({...m,strip:m.strip||0,filter:m.filter||[],type:m.type||null}))},rules:{flatCompilation:s.rules.flatCompilation,rebuildDependents:s.rules.rebuildDependents}}}function oe(o,e){if(!J.default.existsSync(o))throw new g(`Cannot find config file: ${o}`);try{let t=J.default.readFileSync(o,"utf8"),i=JSON.parse(t);return ye(i.type||l.project.defaultType,i,e)}catch(t){throw new g(`Failed to read config file: ${o}! ${t instanceof Error?t.message:t}`)}}var q=p(require("path")),je=p(require("fs")),Ie=p(require("normalize-path")),Ue=p(require("decompress")),be=require("lodash"),_e=p(require("os"));var Ve=p(require("path")),Ce=p(require("fs")),Be=require("stream"),ze=require("util"),We=p(require("node-fetch"));async function Rt(o,e){await Ce.default.promises.mkdir(Ve.default.dirname(e),{recursive:!0});let t=await(0,We.default)(o);if(!t.ok)throw new Error(`Download failed: ${t.status} ${t.statusText}`);let i=Ce.default.createWriteStream(e,{flags:"w"});return await(0,ze.promisify)(Be.pipeline)(t.body,i),{url:o,path:e}}var K=Rt;var X=class{constructor(e){this.projectConfig=e}async download(){let{compiler:e}=this.projectConfig,t=e.dir,i=[...e.addons],r=this.projectConfig.compiler.config.downloader.baseDist;i.includes(r)||i.unshift(r);let s=(0,be.map)(i,c=>this.resolveDist({type:this.projectConfig.type,name:c,version:e.version,dev:e.dev}));n.info("\u{1F53D} Downloading compiler...");let a=await Promise.all((0,be.map)(s,c=>this.downloadDist(c)));n.info("\u{1F4E4} Extracting compiler files...");for(let c of a)await this.extractDist(c.path,t)}async downloadDist(e){let t=await this.getDistFileName(e);if(!t)throw new g("Failed to fetch dist file meta!");let i=this.resolveDownloadDistOpts(t,e),r=await this.downloadFile(i);return{dist:e,path:r.path}}async extractDist(e,t){let{fileExtensions:i}=this.projectConfig.compiler.config;n.info(`\u{1F4E4} Extracting "${q.default.parse(e).base}"...`),await je.default.promises.mkdir(t,{recursive:!0}),await(0,Ue.default)(e,t,{map:r=>{let s={...r};return(0,Ie.default)(s.path).startsWith(this.projectConfig.compiler.config.downloader.compilerDir)&&(s.path=q.default.relative(this.projectConfig.compiler.config.downloader.compilerDir,s.path)),s},filter:r=>(0,Ie.default)(r.path).startsWith(this.projectConfig.compiler.config.downloader.compilerDir)?i.script!==q.default.extname(r.path).slice(1):!1})}async getDistFileName(e){if(e.dev)return this.resolveFileName(e);if(!this.projectConfig.compiler.config.downloader.useMetaFile)return this.resolveFileName({...e,version:this.projectConfig.compiler.version});let t=this.resolveMetaFileName(e),i=this.resolveDownloadDistOpts(t,e),r=await this.downloadFile(i);return(await je.default.promises.readFile(r.path,"utf8")).trim()}resolveDist(e){let t=this.projectConfig.compiler.config.downloader.baseDist,{type:i,name:r=t,dev:s=!1}=e,a=s?e.version:this.resolveReleaseVersion(e.version||this.projectConfig.compiler.config.defaultVersion);e.version!==a&&r===t&&n.warn(`The "${e.version}" version format is redundant. Change the compiler version to "${a}" in the project configuration to remove this warning.`);let c=this.resolvePlatform();return{type:i,name:r,version:a,platform:c,dev:s}}resolveSource(e){let t=[this.projectConfig.compiler.config.downloader.distSource],i=this.resolveReleaseVersion(e.version);return t.push(i),t.join("/")}resolveDownloadDistOpts(e,t){let i=q.default.join(l.downloadDir,e),r=this.resolveSource(t);return{url:this.resolveUrl(r,e),path:i}}resolveUrl(e,t){return`${this.projectConfig.compiler.config.downloader.downloadHost}/${e}/${t}`}resolveReleaseVersion(e){return e.split(".").slice(0,2).join(".")}resolveFileName({type:e,name:t,version:i,platform:r}){return[e,i,t,`${r}${r==="linux"?".tar.gz":".zip"}`].filter(Boolean).join("-")}resolveMetaFileName({type:e,name:t,platform:i}){return[e,"latest",t,`${i}`].filter(Boolean).join("-")}resolvePlatform(){let e=_e.default.platform();switch(e){case"win32":return"windows";case"linux":return"linux";case"darwin":return"mac"}throw new g(`Unable to resolve platform for ${e}`)}async downloadFile(e){return n.debug(`Downloading file from "${e.url}" to "${e.path}"`),await K(e.url,e.path)}};var k=p(require("path")),qe=p(require("decompress")),Xe=p(require("globule")),Ye=p(require("fs")),Ze=require("url");var E=p(require("fs"));async function Nt(o,e){await E.default.promises.access(o,E.default.constants.W_OK|E.default.constants.R_OK);try{await E.default.promises.access(e,E.default.constants.W_OK|E.default.constants.R_OK)}catch(t){if(t.code!=="ENOENT")throw t}await E.default.promises.copyFile(o,e)}var O=Nt;var Ge=p(require("chokidar"));function Ot(o){let e=Ge.default.watch(o,{persistent:!0,ignoreInitial:!0,interval:300,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10}});return process.on("SIGINT",async()=>{await e.close(),process.exit(0)}),e.on("error",t=>{console.error("Watcher failure",t),process.exit(1)}),e}var xe=Ot;var Je=p(require("fs"));async function se(o){let e=await Je.default.promises.readFile(o,"utf8"),t=/^\s*#(tryinclude|include)\s+(?:(?:"([^"]+)")|(?:<([^>]+)>))/gm,i=[],r;for(;r=t.exec(e);){let s=r[2]!=="tryinclude";r[2]?i.push({name:r[2],type:"relative",required:s}):r[3]&&i.push({name:r[3],type:"native",required:s})}return i}function kt(){let o="";return e=>(o+=(e==null?void 0:e.toString())||"",o)}var De=kt;var Ke=["zip","tar","tar.gz","tar.bz2"];var Y=class{constructor(e){this.projectConfig=e}async download(){for(let e of this.projectConfig.thirdparty.dependencies)n.info(`\u{1F53D} Downloading "${e.name}" thirdparty...`),await this.downloadDependency(e)}async downloadDependency(e){let t=k.default.join(l.downloadDir,e.name),i=new Ze.URL(e.url).pathname,{base:r}=k.default.parse(i)||{},s=r||k.default.parse(t).base;await K(e.url,t);let a=k.default.join(this.projectConfig.thirdparty.dir,e.name);if(await Ye.default.promises.mkdir(a,{recursive:!0}),e.type==="archive"||Ke.includes(k.default.extname(s).slice(1))){n.info(`\u{1F4E4} Extracting "${e.name}" thirdparty...`),await(0,qe.default)(t,a,{strip:e.strip,filter:e.filter&&(c=>Xe.default.isMatch(e.filter,c.path,{dot:!0,nocase:!0,matchBase:!0}))});return}n.info(`\u27A1\uFE0F Copying "${e.name}" thirdparty...`),await O(t,k.default.join(a,s))}};var ne=class{constructor(e){this.compilerDownloader=new X(e),this.thirdpartyDownloader=new Y(e)}async downloadCompiler(){await this.compilerDownloader.download()}async downloadThirdparty(){await this.thirdpartyDownloader.download()}};var ae=p(require("fs")),Pe=p(require("path")),x=require("lodash");var B=class{constructor(e,t,i){this.projectConfig=e;this.context=null;this.rawIncludes=null;this.context=(0,x.defaults)((0,x.merge)({},this.projectConfig.cli.templates.context,t),i)}async buildTemplate(e,t){let{templateDir:i}=this.projectConfig.compiler.config.cli,r=(0,x.get)(this.projectConfig.cli.templates.files,e,Pe.default.join(l.templatesDir,`${i}/${e}.txt`));return(await ae.default.promises.readFile(r,"utf8")).replace(/\{\{([a-zA-Z0-9_]+)\}\}/gm,(c,...d)=>{let[u]=d;return(0,x.get)(t,u,(0,x.get)(this.context,u,c))})}async createFile(e,t,i){let{dir:r}=Pe.default.parse(e);await ae.default.promises.mkdir(r,{recursive:!0});let s=(await Promise.all((0,x.map)(this.context.INCLUDES,a=>this.buildTemplate("include-directive",{FILE:a})))).join(`
|
|
3
|
-
`);await ae.default.promises.writeFile(e,await this.buildTemplate(t,{INCLUDES:s}),{flag:i?"w":"wx"}),n.info("\u{1F4C4} New file created:",e)}};var F=class{constructor(e){this.projectConfig=oe(e)}async install(e){let t=new ne(this.projectConfig);e.compiler&&await t.downloadCompiler(),e.thirdparty&&await t.downloadThirdparty()}async createScript(e,t){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.scripts),{name:a,dir:c}=P.default.parse(e);await this.createTemplateService(e,{FILE_NAME:e,PLUGIN_NAME:t.title,PLUGIN_VERSION:t.version,PLUGIN_AUTHOR:t.author,INCLUDES:(0,S.uniq)([...r,...t.include||[]])}).createFile(P.default.join(s.src,c,`${a}.${i.script}`),"script",t.overwrite||!1)}async createInclude(e,t={}){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.include),{name:a,dir:c}=P.default.parse(e);await this.createTemplateService(e,{FILE_NAME:e,INCLUDES:(0,S.uniq)([...r,...t.include||[]])}).createFile(P.default.join(s.src,c,`${a}.${i.include}`),"include",t.overwrite||!1)}async createLibrary(e,t){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.scripts),a=(0,S.first)(this.projectConfig.targets.include),{name:c,dir:d}=P.default.parse(e),u=this.createTemplateService(e,{FILE_NAME:e,PLUGIN_NAME:t.title,PLUGIN_VERSION:t.version,PLUGIN_AUTHOR:t.author,LIBRARY_NAME:t.name||c.replace(/-/g,"_"),INCLUDES:(0,S.uniq)([...r,...t.include||[]]),INCLUDE_NAME:c});await u.createFile(P.default.join(s.src,d,`${c}.${i.script}`),"library-script",t.overwrite||!1),await u.createFile(P.default.join(a.src,`${c}.${i.include}`),"library-include",t.overwrite||!1)}createTemplateService(e,t){let{name:i}=P.default.parse(e);return new B(this.projectConfig,t,{PLUGIN_NAME:i})}};var ce=new
|
|
4
|
-
`).forEach(t=>{let i=Vt(t),{type:r}=i;r==="error"||r==="fatal error"?e.error=!0:r==="echo"&&Bt(t)&&(e.error=!0,e.aborted=!0),e.messages.push(i)}),e}function Wt(o,e){return[o.path,`-o${e}`,...(0,ot.castArray)(o.includeDir).map(t=>`-i${t}`)]}function Ut(o){let e=o.dest,t=le.default.parse(e),i=le.default.parse(e).base;return rt.default.mkdirSync(t.dir,{recursive:!0}),new Promise(r=>{let s=De(),a=d=>{let u=s(),C=zt(u),m=d&&d.message;!m&&C.error&&(m="Compilation error"),r({error:m,plugin:i,success:!m,output:C})},c=it.default.spawn(o.compiler,Wt(o,e),{env:process.env,cwd:le.default.parse(o.compiler).dir});c.on("error",a),c.on("close",a),c.stdout.on("data",s),c.stderr.on("data",d=>console.error(d))})}var Se=Ut;var z=p(require("fs")),Z=p(require("path")),Te=p(require("crypto")),st=p(require("node-cache")),nt=p(require("normalize-path")),at=p(require("globule"));var Fe=(r=>(r.Hash="hash",r.Dependencies="dependencies",r.DependenciesHash="dependencies-hash",r.Dependents="dependents",r))(Fe||{});var Q=class{constructor(e,t,i,r=[]){this.projectDir=e;this.includeDirs=t;this.fileExtensions=i;this.changed=!1;this.cache=new st.default,this.ignoredIncludesSet=new Set(r),this.filePathHashMap=new Map}clear(){this.cache.data={},this.changed=!0}save(e){this.changed&&(z.default.writeFileSync(e,JSON.stringify(this.cache.data)),this.changed=!1)}load(e){if(!z.default.existsSync(e))return;let t=z.default.readFileSync(e,"utf8");this.cache.data=JSON.parse(t),this.changed=!1}async isRelevantSrc(e){let t=this.getValue(e,"hash");if(!t||await this.createFileHash(e)!==t)return!1;let r=this.getDependencies(e),s=await this.getFilesHash(r.items);return r.hash===s}async isRelevantFile(e){let t=await this.createFileHash(e);if(!t)return!1;let i=this.getValue(e,"hash");return t===i}async updateSrc(e){let t=this.getValue(e,"hash"),i=await this.updateFileHash(e),r=await this.updateDependencies(e);return t!==i||r}async updateFile(e){let t=this.getValue(e,"hash"),i=await this.updateFileHash(e);return t!==i}async deleteFile(e){let t=this.getDependencies(e);for(let i of t.items)this.removeDependent(i,e);for(let i of Object.values(Fe))this.deleteValue(e,i)}isDependenciesInitialized(e){return this.hasValue(e,"dependencies")}getDependencies(e){let t=this.getValue(e,"dependencies"),i=this.getValue(e,"dependencies-hash");return i?{items:t||[],hash:i}:{items:[],hash:null}}async updateDependencies(e){let t=this.hasValue(e,"dependencies")?this.getValue(e,"dependencies"):[],i=this.hasValue(e,"dependencies-hash")?this.getValue(e,"dependencies-hash"):null,r=new Set(await this.parseDependencies(e));for(let d of r.values()){this.isDependenciesInitialized(d)||await this.updateDependencies(d);for(let u of this.getDependencies(d).items)r.add(u)}let s=Array.from(r),a=await this.getFilesHash(s);if(i===a)return!1;this.setValue(e,"dependencies",s),this.setValue(e,"dependencies-hash",a);for(let d of t)r.has(d)||this.removeDependent(d,e);let c=this.getDependents(e);for(let d of s){this.addDependent(d,e);for(let u of c)this.addDependent(d,u)}return!0}getDependents(e){return this.hasValue(e,"dependents")?this.getValue(e,"dependents"):[]}addDependent(e,t){let i=this.hasValue(e,"dependents")?this.getValue(e,"dependents"):[],r=new Set(i);r.has(t)||(r.add(t),this.setValue(e,"dependents",Array.from(r)),n.debug(`Added dependent: ${e} <- ${t}`))}removeDependent(e,t){if(!this.hasValue(e,"dependents"))return;let i=this.getValue(e,"dependents"),r=new Set(i);r.delete(t),this.setValue(e,"dependents",Array.from(r)),n.debug(`Remove dependent: ${e} <- ${t}`)}async parseDependencies(e){let t=new Set,i=await se(e);for(let r of i)if(r.type=="native"){if(this.ignoredIncludesSet.has(r.name))continue;for(let s of this.includeDirs){let a=`${r.name}.${this.fileExtensions.include}`,[c]=at.default.find(Z.default.join(s,"**",`${a}`),{nodir:!0});if(c){t.add(c);break}}}else{let a=Z.default.extname(r.name).slice(1)?r.name:`${r.name}.${this.fileExtensions.include}`;t.add(Z.default.resolve(Z.default.dirname(e),a))}return Array.from(t)}async getFilesHash(e){let t=Te.default.createHash("sha256");for(let i of e){let r=this.hasValue(i,"hash")?this.getValue(i,"hash"):await this.updateFileHash(i);t.update(r)}return t.digest("hex")}async updateFileHash(e){let t=await this.createFileHash(e);return this.setValue(e,"hash",t),t}async createFileHash(e){if(!z.default.existsSync(e))return null;let t=await z.default.promises.readFile(e);return this.createHash(t)}hasValue(e,t){return this.cache.has(this.getFileCacheKey(e,t))}getValue(e,t){return this.cache.get(this.getFileCacheKey(e,t))}setValue(e,t,i){i!==this.getValue(e,t)&&(this.cache.set(this.getFileCacheKey(e,t),i),this.changed=!0)}deleteValue(e,t){this.cache.del(this.getFileCacheKey(e,t)),this.changed=!0}getFileCacheKey(e,t){let i=`${(0,nt.default)(e)}?${t}`;if(!this.filePathHashMap.has(i)){let r=this.createHash(i);this.filePathHashMap.set(i,r)}return this.filePathHashMap.get(i)}createHash(e){let t=Te.default.createHash("sha256");return t.update(e),t.digest("hex")}};var ee=class{constructor(e,t={}){this.projectConfig=e;this.options=t;this.cache=null;this.options.noCache||this.initCache(),this.fileTargetsMap=new Map,this.watchingTargets=new Map,this.watcher=null,this.scriptsPathPattern=`**/*.${e.compiler.config.fileExtensions.script}`,this.includePathPattern=`**/*.${e.compiler.config.fileExtensions.include}`,this.assetsPathPattern="**/*.*"}async buildInclude(){for(let e of this.projectConfig.targets.include)await this.buildDir(e,this.includePathPattern,async t=>{await this.updateInclude(t),await this.updateDependents(t)})}async buildAssets(){for(let e of this.projectConfig.targets.assets)await this.buildDir(e,this.assetsPathPattern,t=>this.updateAsset(t))}async buildScripts(e={}){let{fileExtensions:t}=this.projectConfig.compiler.config,i=!0;for(let r of this.projectConfig.targets.scripts)await this.buildDir(r,e.pattern?f.default.join("**",e.pattern):this.scriptsPathPattern,async s=>{if(t.script===f.default.extname(s).slice(1)&&(e.skipCompilation?i=await this.updateScript(s)&&i:i=await this.updateScriptAndPlugin(s)&&i,!i&&!e.ignoreErrors))throw new g("Build failed!")});return i}async watchAssets(){for(let e of this.projectConfig.targets.assets)this.addTargetToWatcher(e,t=>this.updateAsset(t))}async watchInclude(){for(let e of this.projectConfig.targets.include)this.addTargetToWatcher(e,async t=>{await this.updateInclude(t)&&await this.rebuildDependents(t)})}async watchScripts(){for(let e of this.projectConfig.targets.scripts)this.addTargetToWatcher(e,t=>this.updateScriptAndPlugin(t))}async updateScript(e){let t=!0;this.cache&&(t=await this.cache.updateSrc(e));let i=this.getFileTarget(e);if(i.dest){let r=this.resolveDestPath(e,i);if(this.cache&&!t&&await this.cache.isRelevantFile(r))return!1;await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0}),await O(e,r),this.cache&&await this.cache.updateFile(r),n.info("\u{1F4C4} Script updated:",(0,y.default)(r))}return!0}async updateAsset(e){let t=!0;this.cache&&(t=await this.cache.updateFile(e));let i=this.getFileTarget(e);if(i.dest){let r=this.resolveDestPath(e,i);if(this.cache&&!t&&await this.cache.isRelevantFile(r))return!1;await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0}),await O(e,r),this.cache&&await this.cache.updateFile(r),n.info("\u{1F9F8} Asset updated:",(0,y.default)(r))}}async updateInclude(e){if(this.cache&&!await this.cache.updateSrc(e))return!1;let t=this.getFileTarget(e);if(t.dest){let i=this.resolveDestPath(e,t);await $.default.promises.mkdir(f.default.dirname(i),{recursive:!0}),await O(e,i),n.info("\u{1F4C4} Include updated:",(0,y.default)(i))}return!0}async updatePlugin(e){try{if(!await this.compileScript(e))return!1}catch(t){if(!this.options.ignoreErrors)throw t;return!1}return!0}async updateScriptAndPlugin(e){return await this.updatePlugin(e)?(await this.updateScript(e),!0):!1}async compileScript(e){let t=this.getPluginTarget(e);if(!t)return!0;let i=f.default.relative(process.cwd(),e),r=this.resolvePluginDestPath(e,t);if(this.cache){let c=await this.cache.isRelevantSrc(e),d=await this.cache.isRelevantFile(r);if(c&&d)return n.info("\u{1F4C4} Script is already up to date:",(0,y.default)(i),"Skipped!"),!0}let s=f.default.join(this.projectConfig.compiler.dir,this.projectConfig.compiler.executable);await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0});let a=await Se({path:e,dest:r,compiler:s,includeDir:[f.default.join(this.projectConfig.compiler.dir,"include"),...this.projectConfig.include,...(0,A.map)(pe.default.find((0,A.map)(this.projectConfig.targets.include,c=>f.default.join(c.src,"**/"))),c=>f.default.resolve(c))]});return this.cache&&(a.error?await this.cache.deleteFile(r):await this.cache.updateFile(r)),a.output.messages.forEach(c=>{let{startLine:d,type:u,code:C,text:m,filename:D}=c,M=D?f.default.relative(process.cwd(),D):i;u==="error"||u==="fatal error"?n.error(`${(0,y.default)(M)}:${d}`,"-",u,C,":",m):u==="warning"?n.warn(`${(0,y.default)(M)}:${d}`,"-",u,C,":",m):u==="echo"&&n.debug(m)}),a.success?(n.success("Script compiled successfully:",(0,y.default)(i)),n.info("\u{1F9E9} Plugin updated:",(0,y.default)(r))):n.error(`Failed to compile ${(0,y.default)(i)} : "${a.error}"`),a.success}async rebuildDependents(e){if(!this.cache||!this.projectConfig.rules.rebuildDependents)return;let{fileExtensions:t}=this.projectConfig.compiler.config,i=this.cache.getDependents(e);for(let r of i)t.script===f.default.extname(r).slice(1)&&await this.updateScriptAndPlugin(r)}async buildDir(e,t,i){await pe.default.find(f.default.join(e.src,t),{nodir:!0}).reduce((s,a)=>s.then(async()=>{if(e.filter){let c=f.default.relative(e.src,a);if(!this.execPathFilter(c,e.filter))return}this.setFileTarget(a,e),await i(f.default.normalize(a)),this.cache&&this.cache.save(l.cacheFile)}),Promise.resolve())}addTargetToWatcher(e,t){this.watcher||this.setupWatcher(),this.watchingTargets.set(e,t),this.watcher.add(e.src),n.debug("New target added to the watcher:",e)}setupWatcher(){if(this.watcher)throw new g("Watcher already setup!");let e=async t=>{let i=this.getFileTarget(t);if(i){if(i.filter){let r=f.default.relative(i.src,t);if(!this.execPathFilter(r,i.filter))return}n.info("\u{1F539} File change detected. Starting incremental compilation..."),await this.watchingTargets.get(i)(f.default.normalize(t)).catch(r=>n.error(r.message)),n.info("\u{1F539} Compilation complete. Watching for file changes."),this.cache&&this.cache.save(l.cacheFile)}};this.watcher=xe([]).on("change",e).on("add",async t=>{this.setFileTarget(t,this.findFileTarget(t)),await e(t)}).on("unlink",async t=>{this.cache&&(await this.cache.deleteFile(t),this.removeFileTarget(t))})}initCache(){let e=this.getNativeIncludes();this.cache=new Q(this.projectConfig.path,(0,A.map)(this.projectConfig.targets.include,"src"),this.projectConfig.compiler.config.fileExtensions,e),this.cache.load(l.cacheFile)}getNativeIncludes(){let{fileExtensions:e}=this.projectConfig.compiler.config,t=[];for(let i of this.projectConfig.include)for(let r of $.default.readdirSync(i)){let{name:s,ext:a}=f.default.parse(r);a.slice(1)==e.include&&t.push(s)}return t}setFileTarget(e,t){this.fileTargetsMap.set((0,y.default)(e),t),n.debug("File target set:",e)}getFileTarget(e){let t=(0,y.default)(e);if(!this.fileTargetsMap.has(t)){let i=this.findFileTarget(e);i||n.debug("File target not found:",e),this.fileTargetsMap.set(t,i)}return this.fileTargetsMap.get(t)}removeFileTarget(e){n.debug("File target removed:",e),this.fileTargetsMap.delete((0,y.default)(e))}findFileTarget(e){return this.execPathFilter(e,this.scriptsPathPattern)?this.projectConfig.targets.scripts.find(t=>this.isPathMatchTarget(e,t)):this.execPathFilter(e,this.includePathPattern)?this.projectConfig.targets.include.find(t=>this.isPathMatchTarget(e,t)):this.execPathFilter(e,this.assetsPathPattern)?this.projectConfig.targets.assets.find(t=>this.isPathMatchTarget(e,t)):null}getPluginTarget(e){let t=(0,y.default)(e),i=`plugin:${t}`;if(!this.fileTargetsMap.has(i)){let r=this.getFileTarget(t);if(!r)throw new g(`Source file ${t} not found in any target`);this.fileTargetsMap.set(`plugin:${t}`,(0,A.find)(this.projectConfig.targets.plugins,{src:r.src}))}return this.fileTargetsMap.get(i)}isPathMatchTarget(e,t){return this.execPathFilter(e,f.default.join(t.src,"**"))}execPathFilter(e,t){return!t||Array.isArray(t)&&!t.length?!0:pe.default.isMatch(t,e,{dot:!0,nocase:!0,matchBase:!0})}resolveDestPath(e,t){let{dir:i,base:r}=f.default.parse(e),s=t.flat?".":f.default.relative(t.src,i);return f.default.join(t.dest,s,`${t.prefix}${r}`)}resolvePluginDestPath(e,t){let{fileExtensions:i}=this.projectConfig.compiler.config,r=this.getFileTarget(e),s=t.flat?".":f.default.relative(r.src,f.default.dirname(e)),{name:a}=f.default.parse(e);return f.default.join(t.dest,s,`${t.prefix}${a}.${i.plugin}`)}async updateDependents(e){if(!this.cache)return;let t=await Promise.all((0,A.map)(this.cache.getDependents(e),i=>({path:i,exists:$.default.promises.access(i,$.default.constants.F_OK).then(()=>!0).catch(()=>!1)})));for(let i of t)i.exists||this.cache.deleteFile(i.path)}};function ct(o,e){return new ee(o,e)}var W=class{constructor(e,t){this.projectConfig=oe(e),this.builder=ct(this.projectConfig,t)}async compile(e){await this.builder.buildScripts({pattern:e})}async build(e){let t=!0;return e.watch&&(e.assets&&await this.builder.watchAssets(),e.includes&&await this.builder.watchInclude(),e.scripts&&await this.builder.watchScripts()),e.assets&&await this.builder.buildAssets(),e.includes&&await this.builder.buildInclude(),(e.plugins||e.scripts)&&(t=await this.builder.buildScripts({skipCompilation:!e.plugins,ignoreErrors:e.ignoreErrors})),t}};var I=p(require("path")),v=p(require("fs")),lt=require("child_process"),R=require("lodash");var U=class{constructor(e){let t=e.cwd||process.cwd(),i=e.name||I.default.basename(t);this.isCurrentDir=!!e.name&&e.name===".",this.projectDir=this.isCurrentDir?t:I.default.join(t,i),this.options={...e,name:i,cwd:t},this.projectConfig=ye(e.type,{},this.projectDir)}async createProject(){if(!this.isCurrentDir&&v.default.existsSync(this.projectDir))throw new g(`Project ${this.options.name} is already exists!`);if(this.isCurrentDir&&this.isInitialized())throw new g("Cannot create a project! The directory is not empty!");await this.createConfig(),await this.createDirectories(),this.options.npm&&await this.updatePackage(),this.options.git&&!this.isGitInitialized()&&await this.initGit(),this.isGitInitialized()&&await this.updateGitignore(),this.isNpmPackageInitialized()&&await this.installDependencies(),this.options.install&&await this.execCommand(`npx ${l.command} install`)}async updatePackage(){n.info("\u{1F4E6} Initializing npm package...");let e=I.default.join(this.projectDir,"package.json"),t={name:this.options.name,version:(0,R.get)(this.options,"version","0.1.0"),author:(0,R.get)(this.options,"author",l.title),description:(0,R.get)(this.options,"description",`This project was generated by ${l.title} CLI`)};v.default.existsSync(e)&&(0,R.merge)(t,JSON.parse(await v.default.promises.readFile(e,"utf8"))),(0,R.merge)(t,{scripts:{build:`${l.command} build`,watch:`${l.command} build --watch`,postinstall:`${l.command} install`}}),await v.default.promises.writeFile(e,JSON.stringify(t,null,2))}async createConfig(){n.info("\u{1F527} Creating project configuration file..."),await v.default.promises.mkdir(this.projectDir,{recursive:!0});let e=I.default.join(this.projectDir,l.project.configFile),t=(0,R.merge)({},this.projectConfig.defaults);await v.default.promises.writeFile(e,JSON.stringify(t,null,2))}async createDirectories(){n.info("\u{1F4C1} Creating project directories...");for(let e of this.projectConfig.targets.assets)await v.default.promises.mkdir(e.src,{recursive:!0});for(let e of this.projectConfig.targets.include)await v.default.promises.mkdir(e.src,{recursive:!0});for(let e of this.projectConfig.targets.scripts)await v.default.promises.mkdir(e.src,{recursive:!0})}async installDependencies(){n.info("\u{1F504} Installing dependencies..."),await this.execCommand(`npm install ${l.command}@${l.version} --save-dev`)}async initGit(){n.info("\u{1F33F} Initializing git..."),await this.execCommand("git init")}async updateGitignore(){n.info("\u2754 Updating .gitignore file...");let e=I.default.join(this.projectDir,".gitignore"),t=[`*.${this.projectConfig.compiler.config.fileExtensions.plugin}`],i=r=>!I.default.isAbsolute(r)&&t.push(`npx ${I.default.relative(this.projectDir,r)}/`);i("node_modules"),i(this.projectConfig.compiler.dir),i(this.projectConfig.thirdparty.dir);for(let r of this.projectConfig.targets.assets)i(r.src);v.default.existsSync(e)&&t.unshift(""),t.push(""),await v.default.promises.appendFile(e,t.join(`
|
|
5
|
-
`))}isInitialized(){return v.default.existsSync(I.default.join(this.projectDir,l.project.configFile))}isGitInitialized(){return v.default.existsSync(I.default.join(this.projectDir,".git"))}isNpmPackageInitialized(){return v.default.existsSync(I.default.join(this.projectDir,"package.json"))}execCommand(e){return new Promise(t=>{let i=(0,lt.exec)(e,{cwd:this.projectDir});i.on("error",t),i.on("close",t)})}};var
|
|
2
|
+
"use strict";var jt=Object.create;var Ae=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var xt=Object.getPrototypeOf,Dt=Object.prototype.hasOwnProperty;var Pt=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports);var St=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of bt(e))!Dt.call(o,r)&&r!==t&&Ae(o,r,{get:()=>e[r],enumerable:!(i=It(e,r))||i.enumerable});return o};var p=(o,e,t)=>(t=o!=null?jt(xt(o)):{},St(e||!o||!o.__esModule?Ae(t,"default",{value:o,enumerable:!0}):t,o));var He=Pt((ni,Ft)=>{Ft.exports={name:"amxxpack",description:"AMXXPack",author:"Hedgehog Fog",version:"1.5.0-beta.14",license:"MIT",scripts:{test:"jest",build:"tsc && tsup",lint:"eslint",prepare:"npm run build"},main:"lib/index.js",bin:{amxxpack:"./lib/index.js"},files:["lib/**/*","resources/**/*"],repository:{type:"git",url:"https://github.com/Hedgefog/node-amxxpack"},bugs:{url:"https://github.com/Hedgefog/node-amxxpack/issues"},homepage:"https://github.com/Hedgefog/node-amxxpack",keywords:["amx","amxx","amxmodx","sourcemod","smx","cli","pawn","compiler","build","watch"],dependencies:{chokidar:"^4.0.3",colors:"^1.4.0",commander:"^14.0.0",decompress:"^4.2.1",globule:"^1.3.4",lodash:"^4.17.21","node-cache":"^5.1.2","node-fetch":"^2.7.0","normalize-path":"^3.0.0","string-argv":"^0.3.2"},devDependencies:{"@eslint/js":"^9.34.0","@stylistic/eslint-plugin":"^5.3.1","@types/chance":"^1.1.7","@types/decompress":"^4.2.7","@types/glob":"^8.1.0","@types/globule":"^1.1.10","@types/jest":"^28.1.8","@types/lodash":"^4.17.20","@types/node":"^24.3.1","@types/node-fetch":"^2.6.13","@types/normalize-path":"^3.0.2",chance:"^1.1.13",eslint:"^9.34.0",jest:"^28.1.3","ts-jest":"^28.0.8","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0",tsup:"^8.5.0","type-fest":"^4.41.0",typescript:"^4.9.5","typescript-eslint":"^8.41.0"}}});var yt=p(require("readline")),Ct=require("string-argv");var j=p(require("colors/safe"));var he=class{constructor(e={}){this.debugMode=e.debug||process.env.NODE_ENV==="development"}debug(...e){this.out("debug",...e)}success(...e){this.out("success",...e)}info(...e){this.out("info",...e)}warn(...e){this.out("warning",...e)}error(...e){this.out("error",...e)}out(e,...t){if(e==="debug"&&!this.debugMode)return;let i=t.map(c=>c instanceof Object?JSON.stringify(c):String(c)).join(" "),r=this.getLevelLabel(e),s=this.colorifyMessageByLevel(e,i),a=new Date().toLocaleTimeString();console.log(`[${a}]`,r,s)}colorifyMessageByLevel(e,t){switch(e){case"debug":return j.default.grey(t);case"success":return j.default.white(t);case"info":return j.default.grey(t);case"warning":return j.default.white(t);case"error":return j.default.white(t)}return t}getLevelLabel(e){switch(e){case"debug":return j.default.grey("[DEBUG]");case"success":return j.default.green("[SUCCESS]");case"info":return j.default.cyan("[INFO]");case"warning":return j.default.yellow("[WARNING]");case"error":return j.default.red("[ERROR]")}return""}},n=new he;var Ve=require("commander");var g=class extends Error{constructor(e){super(e),this.name="CLIError"}};var N=p(require("path")),Le=p(require("os")),Me=p(require("fs")),ve=N.default.join(Le.default.tmpdir(),".amxxpack");Me.default.mkdirSync(ve,{recursive:!0});var we=process.env.RESOURCES_DIR||N.default.resolve(require.main.path,"..","resources"),l={title:"AMXXPack",command:"amxxpack",downloadDir:N.default.join(ve,"downloads"),cacheFile:N.default.join(ve,".cache.json"),resourcesDir:we,templatesDir:N.default.join(we,"templates"),projectTypesDir:N.default.resolve(we,"project-types"),version:He().version,project:{defaultVersion:"0.1.0",configFile:".amxxpack.json",defaultType:"amxmodx"}};function Tt(o){switch(o.code){case"commander.help":return n.info(`Use '${l.command} --help' to see all available commands`),!0;case"commander.version":return n.info(`${l.title} CLI v${o.message}`),!0}return!1}function _(o,e=!1){if(o instanceof Ve.CommanderError){if(Tt(o)){e||process.exit(0);return}n.error(o.message)}else o instanceof Error?n.error(o.message):n.error("Unknown error");if(!e&&process.env.NODE_ENV==="development")throw o;e||process.exit(1)}var wt=require("commander");var pt=require("commander");function w(o){return async(...e)=>{try{await o(...e)}catch(t){_(t)}}}var et=require("commander");var P=p(require("path")),S=require("lodash");var h=require("lodash"),G=p(require("path")),J=p(require("fs"));var Et=(o,e)=>({type:o,input:{scripts:"./src/scripts",include:"./src/include",assets:"./assets"},output:{base:"./dist",scripts:`./addons/${e.addonName}/scripting`,plugins:`./addons/${e.addonName}/plugins`,include:`./addons/${e.addonName}/scripting/include`,assets:"./"},compiler:{dir:"./.compiler",version:e.defaultVersion,dev:!1,addons:[],executable:e.executable},thirdparty:{dir:"./.thirdparty",dependencies:[]},include:[],rules:{flatCompilation:!0,rebuildDependents:!0},cli:{templates:{context:{PLUGIN_VERSION:"1.0.0",PLUGIN_AUTHOR:l.title}}}});function $t(o){let e=G.default.resolve(l.projectTypesDir,`${o}.json`);if(!J.default.existsSync(e))throw new g(`Unsupported project type: ${o}`);return JSON.parse(J.default.readFileSync(e,"utf8"))}function ye(o,e,t){var C;t=t?G.default.resolve(t):process.cwd();let i=$t(o),r=Et(o,i),s=(0,h.defaultsDeep)({},e,r),a=((C=e.rules)==null?void 0:C.flatCompilation)??!0,c=m=>G.default.resolve(t,m),d=(m,D,M)=>{var Re,Ne,Oe,ke;let b=(0,h.isObject)(m)?m:{dir:m},V=(0,h.isObject)(D)?D:{dir:D};return(0,h.defaults)({src:c(b.dir),dest:G.default.resolve(t,s.output.base,V.dir,((Re=b.output)==null?void 0:Re.dir)||"."),prefix:[V.prefix,(Ne=b.output)==null?void 0:Ne.prefix].join(""),filter:b.filter?(0,h.castArray)(b.filter):[],flat:(0,h.isNil)((Oe=b.output)==null?void 0:Oe.flat)&&(0,h.isNil)(V.flat)?void 0:!!((ke=b.output)!=null&&ke.flat||V.flat)},M)},u=(m,D,M)=>{var b;return(0,h.isNull)((b=e.output)==null?void 0:b[m])?[]:(0,h.map)((0,h.castArray)(s.input[D]),V=>d(V,s.output[m],M))};return{type:o,path:t,defaults:{...(0,h.pick)(r,["type","input","output","thirdparty","include","cli"]),compiler:(0,h.pick)(r.compiler,["dir","version","addons","executable"])},cli:s.cli,targets:{assets:u("assets","assets",{flat:!1}),include:u("include","include",{flat:!0}),scripts:u("scripts","scripts",{flat:!0}),plugins:u("plugins","scripts",{flat:a})},include:(0,h.map)(s.include,c),compiler:{...s.compiler,dir:c(s.compiler.dir),config:i},thirdparty:{dir:c(s.thirdparty.dir),dependencies:(0,h.map)(s.thirdparty.dependencies,m=>({...m,strip:m.strip||0,filter:m.filter||[],type:m.type||null}))},rules:{flatCompilation:s.rules.flatCompilation,rebuildDependents:s.rules.rebuildDependents}}}function oe(o,e){if(!J.default.existsSync(o))throw new g(`Cannot find config file: ${o}`);try{let t=J.default.readFileSync(o,"utf8"),i=JSON.parse(t);return ye(i.type||l.project.defaultType,i,e)}catch(t){throw new g(`Failed to read config file: ${o}! ${t instanceof Error?t.message:t}`)}}var q=p(require("path")),je=p(require("fs")),Ie=p(require("normalize-path")),_e=p(require("decompress")),be=require("lodash"),Ge=p(require("os"));var Be=p(require("path")),Ce=p(require("fs")),ze=require("stream"),We=require("util"),Ue=p(require("node-fetch"));async function Rt(o,e){await Ce.default.promises.mkdir(Be.default.dirname(e),{recursive:!0});let t=await(0,Ue.default)(o);if(!t.ok)throw new Error(`Download failed: ${t.status} ${t.statusText}`);let i=Ce.default.createWriteStream(e,{flags:"w"});return await(0,We.promisify)(ze.pipeline)(t.body,i),{url:o,path:e}}var K=Rt;var X=class{constructor(e){this.projectConfig=e}async download(){let{compiler:e}=this.projectConfig,t=e.dir,i=[...e.addons],r=this.projectConfig.compiler.config.downloader.baseDist;i.includes(r)||i.unshift(r);let s=(0,be.map)(i,c=>this.resolveDist({type:this.projectConfig.type,name:c,version:e.version,dev:e.dev}));n.info("\u{1F53D} Downloading compiler...");let a=await Promise.all((0,be.map)(s,c=>this.downloadDist(c)));n.info("\u{1F4E4} Extracting compiler files...");for(let c of a)await this.extractDist(c.path,t)}async downloadDist(e){let t=await this.getDistFileName(e);if(!t)throw new g("Failed to fetch dist file meta!");let i=this.resolveDownloadDistOpts(t,e),r=await this.downloadFile(i);return{dist:e,path:r.path}}async extractDist(e,t){let{fileExtensions:i}=this.projectConfig.compiler.config;n.info(`\u{1F4E4} Extracting "${q.default.parse(e).base}"...`),await je.default.promises.mkdir(t,{recursive:!0}),await(0,_e.default)(e,t,{map:r=>{let s={...r};return(0,Ie.default)(s.path).startsWith(this.projectConfig.compiler.config.downloader.compilerDir)&&(s.path=q.default.relative(this.projectConfig.compiler.config.downloader.compilerDir,s.path)),s},filter:r=>(0,Ie.default)(r.path).startsWith(this.projectConfig.compiler.config.downloader.compilerDir)?i.script!==q.default.extname(r.path).slice(1):!1})}async getDistFileName(e){if(e.dev)return this.resolveFileName(e);if(!this.projectConfig.compiler.config.downloader.useMetaFile)return this.resolveFileName({...e,version:this.projectConfig.compiler.version});let t=this.resolveMetaFileName(e),i=this.resolveDownloadDistOpts(t,e),r=await this.downloadFile(i);return(await je.default.promises.readFile(r.path,"utf8")).trim()}resolveDist(e){let t=this.projectConfig.compiler.config.downloader.baseDist,{type:i,name:r=t,dev:s=!1}=e,a=s?e.version:this.resolveReleaseVersion(e.version||this.projectConfig.compiler.config.defaultVersion);e.version!==a&&r===t&&n.warn(`The "${e.version}" version format is redundant. Change the compiler version to "${a}" in the project configuration to remove this warning.`);let c=this.resolvePlatform();return{type:i,name:r,version:a,platform:c,dev:s}}resolveSource(e){let t=[this.projectConfig.compiler.config.downloader.distSource],i=this.resolveReleaseVersion(e.version);return t.push(i),t.join("/")}resolveDownloadDistOpts(e,t){let i=q.default.join(l.downloadDir,e),r=this.resolveSource(t);return{url:this.resolveUrl(r,e),path:i}}resolveUrl(e,t){return`${this.projectConfig.compiler.config.downloader.downloadHost}/${e}/${t}`}resolveReleaseVersion(e){return e.split(".").slice(0,2).join(".")}resolveFileName({type:e,name:t,version:i,platform:r}){return[e,i,t,`${r}${r==="linux"?".tar.gz":".zip"}`].filter(Boolean).join("-")}resolveMetaFileName({type:e,name:t,platform:i}){return[e,"latest",t,`${i}`].filter(Boolean).join("-")}resolvePlatform(){let e=Ge.default.platform();switch(e){case"win32":return"windows";case"linux":return"linux";case"darwin":return"mac"}throw new g(`Unable to resolve platform for ${e}`)}async downloadFile(e){return n.debug(`Downloading file from "${e.url}" to "${e.path}"`),await K(e.url,e.path)}};var k=p(require("path")),Xe=p(require("decompress")),Ye=p(require("globule")),Ze=p(require("fs")),Qe=require("url");var E=p(require("fs"));async function Nt(o,e){await E.default.promises.access(o,E.default.constants.W_OK|E.default.constants.R_OK);try{await E.default.promises.access(e,E.default.constants.W_OK|E.default.constants.R_OK)}catch(t){if(t.code!=="ENOENT")throw t}await E.default.promises.copyFile(o,e)}var O=Nt;var Je=p(require("chokidar"));function Ot(o){let e=Je.default.watch(o,{persistent:!0,ignoreInitial:!0,interval:300,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10}});return process.on("SIGINT",async()=>{await e.close(),process.exit(0)}),e.on("error",t=>{console.error("Watcher failure",t),process.exit(1)}),e}var xe=Ot;var Ke=p(require("fs"));async function se(o){let e=await Ke.default.promises.readFile(o,"utf8"),t=/^\s*#(tryinclude|include)\s+(?:(?:"([^"]+)")|(?:<([^>]+)>))/gm,i=[],r;for(;r=t.exec(e);){let s=r[2]!=="tryinclude";r[2]?i.push({name:r[2],type:"relative",required:s}):r[3]&&i.push({name:r[3],type:"native",required:s})}return i}function kt(){let o="";return e=>(o+=(e==null?void 0:e.toString())||"",o)}var De=kt;var qe=["zip","tar","tar.gz","tar.bz2"];var Y=class{constructor(e){this.projectConfig=e}async download(){for(let e of this.projectConfig.thirdparty.dependencies)n.info(`\u{1F53D} Downloading "${e.name}" thirdparty...`),await this.downloadDependency(e)}async downloadDependency(e){let t=k.default.join(l.downloadDir,e.name),i=new Qe.URL(e.url).pathname,{base:r}=k.default.parse(i)||{},s=r||k.default.parse(t).base;await K(e.url,t);let a=k.default.join(this.projectConfig.thirdparty.dir,e.name);if(await Ze.default.promises.mkdir(a,{recursive:!0}),e.type==="archive"||qe.includes(k.default.extname(s).slice(1))){n.info(`\u{1F4E4} Extracting "${e.name}" thirdparty...`),await(0,Xe.default)(t,a,{strip:e.strip,filter:e.filter&&(c=>Ye.default.isMatch(e.filter,c.path,{dot:!0,nocase:!0,matchBase:!0}))});return}n.info(`\u27A1\uFE0F Copying "${e.name}" thirdparty...`),await O(t,k.default.join(a,s))}};var ne=class{constructor(e){this.compilerDownloader=new X(e),this.thirdpartyDownloader=new Y(e)}async downloadCompiler(){await this.compilerDownloader.download()}async downloadThirdparty(){await this.thirdpartyDownloader.download()}};var ae=p(require("fs")),Pe=p(require("path")),x=require("lodash");var B=class{constructor(e,t,i){this.projectConfig=e;this.context=null;this.rawIncludes=null;this.context=(0,x.defaults)((0,x.merge)({},this.projectConfig.cli.templates.context,t),i)}async buildTemplate(e,t){let{templateDir:i}=this.projectConfig.compiler.config.cli,r=(0,x.get)(this.projectConfig.cli.templates.files,e,Pe.default.join(l.templatesDir,`${i}/${e}.txt`));return(await ae.default.promises.readFile(r,"utf8")).replace(/\{\{([a-zA-Z0-9_]+)\}\}/gm,(c,...d)=>{let[u]=d;return(0,x.get)(t,u,(0,x.get)(this.context,u,c))})}async createFile(e,t,i){let{dir:r}=Pe.default.parse(e);await ae.default.promises.mkdir(r,{recursive:!0});let s=(await Promise.all((0,x.map)(this.context.INCLUDES,a=>this.buildTemplate("include-directive",{FILE:a})))).join(`
|
|
3
|
+
`);await ae.default.promises.writeFile(e,await this.buildTemplate(t,{INCLUDES:s}),{flag:i?"w":"wx"}),n.info("\u{1F4C4} New file created:",e)}};var F=class{constructor(e){this.projectConfig=oe(e)}async install(e){let t=new ne(this.projectConfig);e.compiler&&await t.downloadCompiler(),e.thirdparty&&await t.downloadThirdparty()}async createScript(e,t){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.scripts),{name:a,dir:c}=P.default.parse(e);await this.createTemplateService(e,{FILE_NAME:e,PLUGIN_NAME:t.title,PLUGIN_VERSION:t.version,PLUGIN_AUTHOR:t.author,INCLUDES:(0,S.uniq)([...r,...t.include||[]])}).createFile(P.default.join(s.src,c,`${a}.${i.script}`),"script",t.overwrite||!1)}async createInclude(e,t={}){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.include),{name:a,dir:c}=P.default.parse(e);await this.createTemplateService(e,{FILE_NAME:e,INCLUDES:(0,S.uniq)([...r,...t.include||[]])}).createFile(P.default.join(s.src,c,`${a}.${i.include}`),"include",t.overwrite||!1)}async createLibrary(e,t){let{config:{fileExtensions:i,cli:{defaultIncludes:r}}}=this.projectConfig.compiler,s=(0,S.first)(this.projectConfig.targets.scripts),a=(0,S.first)(this.projectConfig.targets.include),{name:c,dir:d}=P.default.parse(e),u=this.createTemplateService(e,{FILE_NAME:e,PLUGIN_NAME:t.title,PLUGIN_VERSION:t.version,PLUGIN_AUTHOR:t.author,LIBRARY_NAME:t.name||c.replace(/-/g,"_"),INCLUDES:(0,S.uniq)([...r,...t.include||[]]),INCLUDE_NAME:c});await u.createFile(P.default.join(s.src,d,`${c}.${i.script}`),"library-script",t.overwrite||!1),await u.createFile(P.default.join(a.src,`${c}.${i.include}`),"library-include",t.overwrite||!1)}createTemplateService(e,t){let{name:i}=P.default.parse(e);return new B(this.projectConfig,t,{PLUGIN_NAME:i})}};var ce=new et.Command;ce.command("script").alias("s").arguments("<filename>").option("--title, -n <title>","Plugin title").option("--version, -v <version>","Plugin version").option("--author, -a <author>","Plugin author").option("--include, -i <include>","Add include",o=>o.split(/[\s|,]/),[]).option("--overwrite","Overwrite file if it already exists",!1).option("--config, -c <path>","Config file",l.project.configFile).action(w(async(o,e)=>{let{title:t,version:i,author:r,include:s,overwrite:a,config:c}=e;await new F(c).createScript(o,{title:t,version:i,author:r,include:s,overwrite:a})}));ce.command("include").alias("i").arguments("<filename>").option("--include, -i <include>","Add include",o=>o.split(/[\s|,]/),[]).option("--overwrite","Overwrite file if it already exists",!1).option("--config, -c <path>","Config file",l.project.configFile).action(w(async(o,e)=>{let{include:t,overwrite:i,config:r}=e;await new F(r).createInclude(o,{include:t,overwrite:i})}));ce.command("library").alias("lib").alias("l").arguments("<filename>").option("--title, -t <title>","Library title").option("--version, -v <version>","Library version").option("--author, -a <author>","Library author").option("--name, -n <name>","Library name").option("--include, -i <include>","Add include",o=>o.split(/[\s|,]/),[]).option("--overwrite","Overwrite file if it already exists",!1).option("--config, -c <path>","Config file",l.project.configFile).action(w(async(o,e)=>{let{name:t,title:i,version:r,author:s,include:a,overwrite:c,config:d}=e;await new F(d).createLibrary(o,{name:t,title:i,version:r,author:s,include:a,overwrite:c})}));var tt=ce;var f=p(require("path")),pe=p(require("globule")),y=p(require("normalize-path")),A=require("lodash"),$=p(require("fs"));var le=p(require("path")),rt=p(require("child_process")),ot=p(require("fs"));var st=require("lodash");var it={filename:/([a-zA-Z0-9.\-_/:\\\s]+)/,line:/\(([0-9]+)(?:\s--\s([0-9]+))?\)/,type:/((?:fatal\s)?error|warning)/,code:/([0-9]+)/,text:/(.*)/};function Lt(){let{filename:o,line:e,type:t,code:i,text:r}=it,s=[o,e,/\s:\s/,t,/\s/,i,/:\s/,r].map(a=>a.toString().slice(1,-1)).join("");return new RegExp(s)}var Mt=Lt();function Vt(o){let e=o.match(Mt);if(!e)return{type:"echo",text:o};let[,t,i,r,s,a,c]=e;return{filename:t,startLine:+i,endLine:r?+r:-1,type:s,code:+a,text:c}}function Bt(o){return o.startsWith("Compilation aborted.")||o.startsWith("Could not locate output file")}function zt(o){let e={messages:[],aborted:!1,error:!1};return o.split(`
|
|
4
|
+
`).forEach(t=>{let i=Vt(t),{type:r}=i;r==="error"||r==="fatal error"?e.error=!0:r==="echo"&&Bt(t)&&(e.error=!0,e.aborted=!0),e.messages.push(i)}),e}function Wt(o,e){return[o.path,`-o${e}`,...(0,st.castArray)(o.includeDir).map(t=>`-i${t}`)]}function Ut(o){let e=o.dest,t=le.default.parse(e),i=le.default.parse(e).base;return ot.default.mkdirSync(t.dir,{recursive:!0}),new Promise(r=>{let s=De(),a=d=>{let u=s(),C=zt(u),m=d&&d.message;!m&&C.error&&(m="Compilation error"),r({error:m,plugin:i,success:!m,output:C})},c=rt.default.spawn(o.compiler,Wt(o,e),{env:process.env,cwd:le.default.parse(o.compiler).dir});c.on("error",a),c.on("close",a),c.stdout.on("data",s),c.stderr.on("data",d=>console.error(d))})}var Se=Ut;var z=p(require("fs")),Z=p(require("path")),Te=p(require("crypto")),nt=p(require("node-cache")),Ee=p(require("normalize-path")),at=p(require("globule"));var Fe=(r=>(r.Hash="hash",r.Dependencies="dependencies",r.DependenciesHash="dependencies-hash",r.Dependents="dependents",r))(Fe||{});var Q=class{constructor(e,t,i,r=[],s=3600*24*30){this.projectDir=e;this.includeDirs=t;this.fileExtensions=i;this.ttl=s;this.changed=!1;this.cache=new nt.default,this.ignoredIncludesSet=new Set(r),this.filePathHashMap=new Map,this.projectHash=this.createHash((0,Ee.default)(this.projectDir))}clear(){this.cache.data={},this.changed=!0}save(e){this.changed&&(z.default.writeFileSync(e,JSON.stringify(this.cache.data)),this.changed=!1)}load(e){if(!z.default.existsSync(e))return;let t=z.default.readFileSync(e,"utf8");this.cache.data=JSON.parse(t),this.changed=!1}async isRelevantSrc(e){let t=this.getValue(e,"hash");if(!t||await this.createFileHash(e)!==t)return!1;let r=this.getDependencies(e),s=await this.getFilesHash(r.items);return r.hash===s}async isRelevantFile(e){let t=await this.createFileHash(e);if(!t)return!1;let i=this.getValue(e,"hash");return t===i}async updateSrc(e){let t=this.getValue(e,"hash"),i=await this.updateFileHash(e),r=await this.updateDependencies(e);return t!==i||r}async updateFile(e){let t=this.getValue(e,"hash"),i=await this.updateFileHash(e);return t!==i}async deleteFile(e){let t=this.getDependencies(e);for(let i of t.items)this.removeDependent(i,e);for(let i of Object.values(Fe))this.deleteValue(e,i)}isDependenciesInitialized(e){return this.hasValue(e,"dependencies")}getDependencies(e){let t=this.getValue(e,"dependencies"),i=this.getValue(e,"dependencies-hash");return i?{items:t||[],hash:i}:{items:[],hash:null}}async updateDependencies(e){let t=this.hasValue(e,"dependencies")?this.getValue(e,"dependencies"):[],i=this.hasValue(e,"dependencies-hash")?this.getValue(e,"dependencies-hash"):null,r=new Set(await this.parseDependencies(e));for(let d of r.values()){this.isDependenciesInitialized(d)||await this.updateDependencies(d);for(let u of this.getDependencies(d).items)r.add(u)}let s=Array.from(r),a=await this.getFilesHash(s);if(i===a)return!1;this.setValue(e,"dependencies",s),this.setValue(e,"dependencies-hash",a);for(let d of t)r.has(d)||this.removeDependent(d,e);let c=this.getDependents(e);for(let d of s){this.addDependent(d,e);for(let u of c)this.addDependent(d,u)}return!0}getDependents(e){return this.hasValue(e,"dependents")?this.getValue(e,"dependents"):[]}addDependent(e,t){let i=this.hasValue(e,"dependents")?this.getValue(e,"dependents"):[],r=new Set(i);r.has(t)||(r.add(t),this.setValue(e,"dependents",Array.from(r)),n.debug(`Added dependent: ${e} <- ${t}`))}removeDependent(e,t){if(!this.hasValue(e,"dependents"))return;let i=this.getValue(e,"dependents"),r=new Set(i);r.delete(t),this.setValue(e,"dependents",Array.from(r)),n.debug(`Remove dependent: ${e} <- ${t}`)}async parseDependencies(e){let t=new Set,i=await se(e);for(let r of i)if(r.type=="native"){if(this.ignoredIncludesSet.has(r.name))continue;for(let s of this.includeDirs){let a=`${r.name}.${this.fileExtensions.include}`,[c]=at.default.find(Z.default.join(s,"**",`${a}`),{nodir:!0});if(c){t.add(c);break}}}else{let a=Z.default.extname(r.name).slice(1)?r.name:`${r.name}.${this.fileExtensions.include}`;t.add(Z.default.resolve(Z.default.dirname(e),a))}return Array.from(t)}async getFilesHash(e){let t=Te.default.createHash("sha256");for(let i of e){let r=this.hasValue(i,"hash")?this.getValue(i,"hash"):await this.updateFileHash(i);t.update(r)}return t.digest("hex")}async updateFileHash(e){let t=await this.createFileHash(e);return this.setValue(e,"hash",t),t}async createFileHash(e){if(!z.default.existsSync(e))return null;let t=await z.default.promises.readFile(e);return this.createHash(t)}hasValue(e,t){return this.cache.has(this.getFileCacheKey(e,t))}getValue(e,t){return this.cache.get(this.getFileCacheKey(e,t))}setValue(e,t,i){i!==this.getValue(e,t)&&(this.cache.set(this.getFileCacheKey(e,t),i,this.ttl),this.changed=!0)}deleteValue(e,t){this.cache.del(this.getFileCacheKey(e,t)),this.changed=!0}getFileCacheKey(e,t){let i=`${this.projectHash}${(0,Ee.default)(e)}?${t}`;if(!this.filePathHashMap.has(i)){let r=this.createHash(i);this.filePathHashMap.set(i,r)}return this.filePathHashMap.get(i)}createHash(e){let t=Te.default.createHash("sha256");return t.update(e),t.digest("hex")}};var ee=class{constructor(e,t={}){this.projectConfig=e;this.options=t;this.cache=null;this.options.noCache||this.initCache(),this.fileTargetsMap=new Map,this.watchingTargets=new Map,this.watcher=null,this.scriptsPathPattern=`**/*.${e.compiler.config.fileExtensions.script}`,this.includePathPattern=`**/*.${e.compiler.config.fileExtensions.include}`,this.assetsPathPattern="**/*.*"}async buildInclude(){for(let e of this.projectConfig.targets.include)await this.buildDir(e,this.includePathPattern,async t=>{await this.updateInclude(t),await this.updateDependents(t)})}async buildAssets(){for(let e of this.projectConfig.targets.assets)await this.buildDir(e,this.assetsPathPattern,t=>this.updateAsset(t))}async buildScripts(e={}){let{fileExtensions:t}=this.projectConfig.compiler.config,i=!0;for(let r of this.projectConfig.targets.scripts)await this.buildDir(r,e.pattern?f.default.join("**",e.pattern):this.scriptsPathPattern,async s=>{if(t.script===f.default.extname(s).slice(1)&&(e.skipCompilation?i=await this.updateScript(s)&&i:i=await this.updateScriptAndPlugin(s)&&i,!i&&!e.ignoreErrors))throw new g("Build failed!")});return i}async watchAssets(){for(let e of this.projectConfig.targets.assets)this.addTargetToWatcher(e,t=>this.updateAsset(t))}async watchInclude(){for(let e of this.projectConfig.targets.include)this.addTargetToWatcher(e,async t=>{await this.updateInclude(t)&&await this.rebuildDependents(t)})}async watchScripts(){for(let e of this.projectConfig.targets.scripts)this.addTargetToWatcher(e,t=>this.updateScriptAndPlugin(t))}async updateScript(e){let t=!0;this.cache&&(t=await this.cache.updateSrc(e));let i=this.getFileTarget(e);if(i.dest){let r=this.resolveDestPath(e,i);if(this.cache&&!t&&await this.cache.isRelevantFile(r))return!1;await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0}),await O(e,r),this.cache&&await this.cache.updateFile(r),n.info("\u{1F4C4} Script updated:",(0,y.default)(r))}return!0}async updateAsset(e){let t=!0;this.cache&&(t=await this.cache.updateFile(e));let i=this.getFileTarget(e);if(i.dest){let r=this.resolveDestPath(e,i);if(this.cache&&!t&&await this.cache.isRelevantFile(r))return!1;await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0}),await O(e,r),this.cache&&await this.cache.updateFile(r),n.info("\u{1F9F8} Asset updated:",(0,y.default)(r))}}async updateInclude(e){if(this.cache&&!await this.cache.updateSrc(e))return!1;let t=this.getFileTarget(e);if(t.dest){let i=this.resolveDestPath(e,t);await $.default.promises.mkdir(f.default.dirname(i),{recursive:!0}),await O(e,i),n.info("\u{1F4C4} Include updated:",(0,y.default)(i))}return!0}async updatePlugin(e){try{if(!await this.compileScript(e))return!1}catch(t){if(!this.options.ignoreErrors)throw t;return!1}return!0}async updateScriptAndPlugin(e){return await this.updatePlugin(e)?(await this.updateScript(e),!0):!1}async compileScript(e){let t=this.getPluginTarget(e);if(!t)return!0;let i=f.default.relative(process.cwd(),e),r=this.resolvePluginDestPath(e,t);if(this.cache){let c=await this.cache.isRelevantSrc(e),d=await this.cache.isRelevantFile(r);if(c&&d)return n.info("\u{1F4C4} Script is already up to date:",(0,y.default)(i),"Skipped!"),!0}let s=f.default.join(this.projectConfig.compiler.dir,this.projectConfig.compiler.executable);await $.default.promises.mkdir(f.default.dirname(r),{recursive:!0});let a=await Se({path:e,dest:r,compiler:s,includeDir:[f.default.join(this.projectConfig.compiler.dir,"include"),...this.projectConfig.include,...(0,A.map)(pe.default.find((0,A.map)(this.projectConfig.targets.include,c=>f.default.join(c.src,"**/"))),c=>f.default.resolve(c))]});return this.cache&&(a.error?await this.cache.deleteFile(r):await this.cache.updateFile(r)),a.output.messages.forEach(c=>{let{startLine:d,type:u,code:C,text:m,filename:D}=c,M=D?f.default.relative(process.cwd(),D):i;u==="error"||u==="fatal error"?n.error(`${(0,y.default)(M)}:${d}`,"-",u,C,":",m):u==="warning"?n.warn(`${(0,y.default)(M)}:${d}`,"-",u,C,":",m):u==="echo"&&n.debug(m)}),a.success?(n.success("Script compiled successfully:",(0,y.default)(i)),n.info("\u{1F9E9} Plugin updated:",(0,y.default)(r))):n.error(`Failed to compile ${(0,y.default)(i)} : "${a.error}"`),a.success}async rebuildDependents(e){if(!this.cache||!this.projectConfig.rules.rebuildDependents)return;let{fileExtensions:t}=this.projectConfig.compiler.config,i=this.cache.getDependents(e);for(let r of i)t.script===f.default.extname(r).slice(1)&&await this.updateScriptAndPlugin(r)}async buildDir(e,t,i){await pe.default.find(f.default.join(e.src,t),{nodir:!0}).reduce((s,a)=>s.then(async()=>{if(e.filter){let c=f.default.relative(e.src,a);if(!this.execPathFilter(c,e.filter))return}this.setFileTarget(a,e),await i(f.default.normalize(a)),this.cache&&this.cache.save(l.cacheFile)}),Promise.resolve())}addTargetToWatcher(e,t){this.watcher||this.setupWatcher(),this.watchingTargets.set(e,t),this.watcher.add(e.src),n.debug("New target added to the watcher:",e)}setupWatcher(){if(this.watcher)throw new g("Watcher already setup!");let e=async t=>{let i=this.getFileTarget(t);if(i){if(i.filter){let r=f.default.relative(i.src,t);if(!this.execPathFilter(r,i.filter))return}n.info("\u{1F539} File change detected. Starting incremental compilation..."),await this.watchingTargets.get(i)(f.default.normalize(t)).catch(r=>n.error(r.message)),n.info("\u{1F539} Compilation complete. Watching for file changes."),this.cache&&this.cache.save(l.cacheFile)}};this.watcher=xe([]).on("change",e).on("add",async t=>{this.setFileTarget(t,this.findFileTarget(t)),await e(t)}).on("unlink",async t=>{this.cache&&(await this.cache.deleteFile(t),this.removeFileTarget(t))})}initCache(){let e=this.getNativeIncludes();this.cache=new Q(this.projectConfig.path,(0,A.map)(this.projectConfig.targets.include,"src"),this.projectConfig.compiler.config.fileExtensions,e),this.cache.load(l.cacheFile)}getNativeIncludes(){let{fileExtensions:e}=this.projectConfig.compiler.config,t=[];for(let i of this.projectConfig.include)for(let r of $.default.readdirSync(i)){let{name:s,ext:a}=f.default.parse(r);a.slice(1)==e.include&&t.push(s)}return t}setFileTarget(e,t){this.fileTargetsMap.set((0,y.default)(e),t),n.debug("File target set:",e)}getFileTarget(e){let t=(0,y.default)(e);if(!this.fileTargetsMap.has(t)){let i=this.findFileTarget(e);i||n.debug("File target not found:",e),this.fileTargetsMap.set(t,i)}return this.fileTargetsMap.get(t)}removeFileTarget(e){n.debug("File target removed:",e),this.fileTargetsMap.delete((0,y.default)(e))}findFileTarget(e){return this.execPathFilter(e,this.scriptsPathPattern)?this.projectConfig.targets.scripts.find(t=>this.isPathMatchTarget(e,t)):this.execPathFilter(e,this.includePathPattern)?this.projectConfig.targets.include.find(t=>this.isPathMatchTarget(e,t)):this.execPathFilter(e,this.assetsPathPattern)?this.projectConfig.targets.assets.find(t=>this.isPathMatchTarget(e,t)):null}getPluginTarget(e){let t=(0,y.default)(e),i=`plugin:${t}`;if(!this.fileTargetsMap.has(i)){let r=this.getFileTarget(t);if(!r)throw new g(`Source file ${t} not found in any target`);this.fileTargetsMap.set(`plugin:${t}`,(0,A.find)(this.projectConfig.targets.plugins,{src:r.src}))}return this.fileTargetsMap.get(i)}isPathMatchTarget(e,t){return this.execPathFilter(e,f.default.join(t.src,"**"))}execPathFilter(e,t){return!t||Array.isArray(t)&&!t.length?!0:pe.default.isMatch(t,e,{dot:!0,nocase:!0,matchBase:!0})}resolveDestPath(e,t){let{dir:i,base:r}=f.default.parse(e),s=t.flat?".":f.default.relative(t.src,i);return f.default.join(t.dest,s,`${t.prefix}${r}`)}resolvePluginDestPath(e,t){let{fileExtensions:i}=this.projectConfig.compiler.config,r=this.getFileTarget(e),s=t.flat?".":f.default.relative(r.src,f.default.dirname(e)),{name:a}=f.default.parse(e);return f.default.join(t.dest,s,`${t.prefix}${a}.${i.plugin}`)}async updateDependents(e){if(!this.cache)return;let t=await Promise.all((0,A.map)(this.cache.getDependents(e),async i=>({path:i,exists:await $.default.promises.access(i,$.default.constants.F_OK).then(()=>!0).catch(()=>!1)})));for(let i of t)i.exists||this.cache.deleteFile(i.path)}};function ct(o,e){return new ee(o,e)}var W=class{constructor(e,t){this.projectConfig=oe(e),this.builder=ct(this.projectConfig,t)}async compile(e){await this.builder.buildScripts({pattern:e})}async build(e){let t=!0;return e.watch&&(e.assets&&await this.builder.watchAssets(),e.includes&&await this.builder.watchInclude(),e.scripts&&await this.builder.watchScripts()),e.assets&&await this.builder.buildAssets(),e.includes&&await this.builder.buildInclude(),(e.plugins||e.scripts)&&(t=await this.builder.buildScripts({skipCompilation:!e.plugins,ignoreErrors:e.ignoreErrors})),t}};var I=p(require("path")),v=p(require("fs")),lt=require("child_process"),R=require("lodash");var U=class{constructor(e){let t=e.cwd||process.cwd(),i=e.name||I.default.basename(t);this.isCurrentDir=!!e.name&&e.name===".",this.projectDir=this.isCurrentDir?t:I.default.join(t,i),this.options={...e,name:i,cwd:t},this.projectConfig=ye(e.type,{},this.projectDir)}async createProject(){if(!this.isCurrentDir&&v.default.existsSync(this.projectDir))throw new g(`Project ${this.options.name} is already exists!`);if(this.isCurrentDir&&this.isInitialized())throw new g("Cannot create a project! The directory is not empty!");await this.createConfig(),await this.createDirectories(),this.options.npm&&await this.updatePackage(),this.options.git&&!this.isGitInitialized()&&await this.initGit(),this.isGitInitialized()&&await this.updateGitignore(),this.isNpmPackageInitialized()&&await this.installDependencies(),this.options.install&&await this.execCommand(`npx ${l.command} install`)}async updatePackage(){n.info("\u{1F4E6} Initializing npm package...");let e=I.default.join(this.projectDir,"package.json"),t={name:this.options.name,version:(0,R.get)(this.options,"version","0.1.0"),author:(0,R.get)(this.options,"author",l.title),description:(0,R.get)(this.options,"description",`This project was generated by ${l.title} CLI`)};v.default.existsSync(e)&&(0,R.merge)(t,JSON.parse(await v.default.promises.readFile(e,"utf8"))),(0,R.merge)(t,{scripts:{build:`${l.command} build`,watch:`${l.command} build --watch`,postinstall:`${l.command} install`}}),await v.default.promises.writeFile(e,JSON.stringify(t,null,2))}async createConfig(){n.info("\u{1F527} Creating project configuration file..."),await v.default.promises.mkdir(this.projectDir,{recursive:!0});let e=I.default.join(this.projectDir,l.project.configFile),t=(0,R.merge)({},this.projectConfig.defaults);await v.default.promises.writeFile(e,JSON.stringify(t,null,2))}async createDirectories(){n.info("\u{1F4C1} Creating project directories...");for(let e of this.projectConfig.targets.assets)await v.default.promises.mkdir(e.src,{recursive:!0});for(let e of this.projectConfig.targets.include)await v.default.promises.mkdir(e.src,{recursive:!0});for(let e of this.projectConfig.targets.scripts)await v.default.promises.mkdir(e.src,{recursive:!0})}async installDependencies(){n.info("\u{1F504} Installing dependencies..."),await this.execCommand(`npm install ${l.command}@${l.version} --save-dev`)}async initGit(){n.info("\u{1F33F} Initializing git..."),await this.execCommand("git init")}async updateGitignore(){n.info("\u2754 Updating .gitignore file...");let e=I.default.join(this.projectDir,".gitignore"),t=[`*.${this.projectConfig.compiler.config.fileExtensions.plugin}`],i=r=>!I.default.isAbsolute(r)&&t.push(`npx ${I.default.relative(this.projectDir,r)}/`);i("node_modules"),i(this.projectConfig.compiler.dir),i(this.projectConfig.thirdparty.dir);for(let r of this.projectConfig.targets.assets)i(r.src);v.default.existsSync(e)&&t.unshift(""),t.push(""),await v.default.promises.appendFile(e,t.join(`
|
|
5
|
+
`))}isInitialized(){return v.default.existsSync(I.default.join(this.projectDir,l.project.configFile))}isGitInitialized(){return v.default.existsSync(I.default.join(this.projectDir,".git"))}isNpmPackageInitialized(){return v.default.existsSync(I.default.join(this.projectDir,"package.json"))}execCommand(e){return new Promise(t=>{let i=(0,lt.exec)(e,{cwd:this.projectDir});i.on("error",t),i.on("close",t)})}};var H=new pt.Command;H.command("config").option("--type, -t <type>","Project type",l.project.defaultType).action(w(async o=>{let{type:e}=o;await new U({type:e}).createConfig()}));H.command("create").argument("<name>","Project name").option("--type, -t <type>","Project type",l.project.defaultType).option("--version, -v <version>","Project version").option("--author, -a <author>","Project author").option("--description, -d <author>","Project description").option("--no-npm","Don't initialize npm package",!0).option("--no-install","Don't install dependencies",!0).option("--git","Initialize git",!1).action(w(async(o,e)=>{let{version:t,author:i,description:r,npm:s,install:a,git:c,type:d}=e;if(!o)throw new g("Project name cannot be empty!");await new U({name:o,version:t,author:i,description:r,npm:s,install:a,git:c,type:d}).createProject(),n.success(`Your project is ready! Thanks for using ${l.title} CLI! \u{1F917}`)}));H.command("install").alias("i").option("--config, -c <path>","Config file",l.project.configFile).option("--compiler","Install compiler").option("--thirdparty","Install thirdparty dependencies").action(w(async(o,e)=>{let{config:t,compiler:i,thirdparty:r}=e.opts(),s=!i&&!r;await new F(t).install({compiler:s||!!i,thirdparty:s||!!r})}));H.command("compile").alias("c").argument("<pattern>","Script path or glob").option("--config, -c <path>","Config file",l.project.configFile).option("--no-cache","Disable caching").action(w(async(o,e)=>{let{config:t,cache:i}=e;await new W(t,{noCache:!i}).compile(o)}));H.command("build").alias("b").option("--config, -c <path>","Config file",l.project.configFile).option("--watch, -w","Watch project").option("--ignore, -i","Ignore build errors").option("--no-cache","Disable caching").option("--assets","Build assets").option("--scripts","Build scripts").option("--plugins","Build plugins").option("--includes","Build includes").action(w(async(o,e)=>{let{config:t,watch:i,ignore:r,cache:s,assets:a,scripts:c,plugins:d,includes:u}=e.opts(),C=!a&&!c&&!d&&!u,m=new W(t,{noCache:!s});n.info("\u2692\uFE0F Building..."),await m.build({watch:i,ignoreErrors:r,noCache:!s,assets:C||a,scripts:C||c,plugins:C||d,includes:C||u})?n.success("\u2705 Build completed successfully!"):n.error("\u26A0\uFE0F Build completed with errors!")}));H.addCommand(tt.name("generate").alias("new").alias("n").alias("g"));var dt=H;var ft=require("commander");var T=p(require("fs"));var ut=p(require("path")),te=class{getCacheSize(){let e=0;if(T.default.existsSync(l.cacheFile)&&(e+=T.default.statSync(l.cacheFile).size),T.default.existsSync(l.downloadDir)){let t=T.default.readdirSync(l.downloadDir);for(let i of t)e+=T.default.statSync(ut.default.join(l.downloadDir,i)).size}return e}clearCache(){T.default.existsSync(l.cacheFile)&&T.default.rmSync(l.cacheFile),T.default.rmSync(l.downloadDir,{recursive:!0,force:!0})}};var de=new ft.Command,$e;de.hook("preAction",()=>{$e=new te});de.command("clean").action(w(()=>{$e.clearCache(),n.info("\u{1F9F9} Cache cleaned!")}));de.command("size").action(w(()=>{let o=$e.getCacheSize();n.info(`\u{1F4BE} Cache size: ${o} bytes`)}));var mt=de;var gt=require("commander");var ue=p(require("fs")),fe=require("lodash");var ie=class{async getDependencies(){return(await this.readProjectConfig()).thirdparty.dependencies}async addDependency(e,t,i,r){let s=await this.readProjectConfig();if((0,fe.find)(s.thirdparty.dependencies,{name:e}))throw new g(`Dependency "${e}" already exists!`);s.thirdparty.dependencies.push({name:e,url:t,strip:i,filter:r}),await ue.default.promises.writeFile(l.project.configFile,JSON.stringify(s,null,2))}async removeDependency(e){let t=await this.readProjectConfig(),i=(0,fe.findIndex)(t.thirdparty.dependencies,{name:e});if(i===-1)throw new g(`Dependency "${e}" not found!`);t.thirdparty.dependencies.splice(i,1),await ue.default.promises.writeFile(l.project.configFile,JSON.stringify(t,null,2))}async readProjectConfig(){try{return JSON.parse(await ue.default.promises.readFile(l.project.configFile,"utf8"))}catch{throw new g(`Failed to read project config ${l.project.configFile}`)}}};var re=new gt.Command,me;re.hook("preAction",()=>{me=new ie});re.command("list").alias("l").action(w(async()=>{let o=await me.getDependencies();if(!o.length){n.info("\u{1F50D} No thirdparty dependencies found!");return}n.info("\u{1F50D} Thirdparty dependencies:");for(let e of o)n.info(`- ${e.name} "${e.url}"`)}));re.command("add").alias("a").argument("<name>","Thirdparty name").argument("<url>","Thirdparty URL").option("--strip [strip]","Strip",o=>parseInt(o,10)).option("--filter [filter]","Filter",o=>o.split(",")).action(w(async(o,e,t)=>{let{strip:i,filter:r}=t;await me.addDependency(o,e,i,r),n.success(`\u2795 Dependency "${o}" added successfully!`)}));re.command("remove").alias("r").argument("<name>","Thirdparty name").action(w(async o=>{await me.removeDependency(o),n.success(`\u{1F5D1}\uFE0F Dependency "${o}" removed successfully!`)}));var ht=re;var L=new wt.Command;L.name(`${l.title} CLI`).description(`${l.title} CLI - Building tools for pawn projects`);L.version(l.version);L.command("exit",{hidden:!0}).alias("quit").alias("q").description("Exit the CLI").action(()=>{process.exit(0)});dt.commands.forEach(o=>L.addCommand(o));L.addCommand(mt.name("cache"));L.addCommand(ht.name("dependency").alias("dep").alias("d").alias("thirdparty").alias("t"));var vt=L;async function ge(o,e=!1){try{await vt.exitOverride().parseAsync(o,{from:"user"})}catch(t){_(t,e)}}async function Gt(o){o.length>0&&await ge(o,!0),n.info("\u{1F579}\uFE0F Interactive mode: Waiting for input...");let e=yt.default.createInterface({input:process.stdin,output:process.stdout});e.on("line",async t=>{e.pause(),await ge((0,Ct.parseArgsStringToArgv)(t),!0),e.resume()}),process.on("SIGINT",()=>e.close()),process.on("uncaughtException",()=>e.close()),process.on("unhandledRejection",()=>e.close())}function Jt(o){let e=[];for(let t of o){if(t[0]!=="-")break;e.push(t)}return e}function Kt(o){let e=new Set;for(let t of o)switch(t){case"-i":case"--interactive":case"--input":case"--shell":{e.add("interactive");break}}return e}async function qt(){let o=Jt(process.argv.slice(2)),e=Kt(o);if(e.size>0){let t=process.argv.slice(2+o.length);e.has("interactive")?await Gt(t):await ge(t)}else await ge(process.argv.slice(2))}process.env.NODE_ENV!=="development"&&process.on("warning",o=>{o.name!=="DeprecationWarning"&&console.warn(o)});qt();
|