@overlayed/cli 0.0.3 → 0.0.5
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/dist/cli.js +5 -4
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{Builtins as e,Cli as t,Command as n,UsageError as r}from"clipanion";import i from"chalk";import a,{createReadStream as o}from"node:fs";import"arktype";import{createWriteStream as s,existsSync as c,mkdirSync as l,readdirSync as u,unlinkSync as d,writeFileSync as f}from"fs";import{join as p}from"path";import m from"node:path";import{glob as h}from"glob";import g,{fileURLToPath as _}from"node:url";import v from"jszip";const y={deployment:`deployment`};function b(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(e){e(n)}),(r=e.get(`*`))&&r.slice().map(function(e){e(t,n)})}}}function x(e){return Object.prototype.toString.call(e)===`[object Object]`}function S(e){return e?Array.isArray(e)?e:[e]:[]}var C=class{data=[];constructor(){}get size(){return this.data.length}add(e){this.data.push(e)}next(){return this.data.shift()}clear(){this.data.length=0}*flush(){for(;this.size>0;){let e=this.next();e&&(yield e)}}},w=class{emitter;constructor(){this.emitter=b()}on(e,t){this.emitter.on(e,t)}off(e,t){this.emitter.off(e,t)}emit(e,t){this.emitter.emit(e,t)}removeAllListeners(){this.emitter.all.clear()}};function T(e,...t){let n=class extends e{static _instance;static getInstance(){return this._instance||(this._instance=new e(...t)),this._instance}static clearInstance(){this._instance=void 0}};return n}var E=class extends w{destroy(){this.removeAllListeners()}fatal(e,t,n){this.emit(`fatal`,{code:t,message:e,data:n,timestamp:Date.now()})}error(e,t,n){this.emit(`error`,{code:t,message:e,data:n,timestamp:Date.now()})}warn(e,t,n){this.emit(`warning`,{code:t,message:e,data:n,timestamp:Date.now()})}};T(E);var D=class e extends w{stream;logPath;baseFileName;currentDate;rotationCheckInterval;isRotating=!1;constructor(e,t){super(),this.logPath=e,this.baseFileName=t.replace(`.log`,``),this.currentDate=this.getDateString(new Date),this.ensureLogDirectory(),this.ensureLogFile(),this.stream=this.createStream(),this.rotationCheckInterval=this.startRotationCheck(),this.cleanupOldLogs()}static scope(t,n){return new e(t,n)}log(...e){this.write(`log`,...e)}error(...e){this.write(`error`,...e)}warn(...e){this.write(`warn`,...e)}info(...e){this.write(`info`,...e)}debug(...e){this.write(`debug`,...e)}async close(){clearInterval(this.rotationCheckInterval),await new Promise(e=>{this.stream.end(()=>e())})}getCurrentFileName(){return this.getFileName(this.currentDate)}getFileName(e){return`${this.baseFileName}-${e}.log`}ensureLogDirectory(){try{l(this.logPath,{recursive:!0})}catch(e){throw console.error(`Failed to create log directory ${this.logPath}:`,e),e}}ensureLogFile(){let e=p(this.logPath,this.getFileName(this.currentDate));if(!c(e))try{f(e,``,`utf8`)}catch(t){throw console.error(`Failed to create log file ${e}:`,t),t}}getDateString(e){return e.toISOString().split(`T`)[0]}createStream(){let e=p(this.logPath,this.getFileName(this.currentDate));return s(e,{flags:`a`,encoding:`utf8`})}async rotateLogs(){if(this.isRotating)return;this.isRotating=!0;let e=this.getDateString(new Date);e!==this.currentDate&&await new Promise(t=>{this.stream.end(()=>{this.currentDate=e,this.stream=this.createStream(),this.cleanupOldLogs(),t()})}),this.isRotating=!1}startRotationCheck(){return setInterval(()=>this.rotateLogs(),6e4)}cleanupOldLogs(){let e=u(this.logPath),t=new Date;t.setDate(t.getDate()-3),e.filter(e=>e.startsWith(this.baseFileName)&&e.endsWith(`.log`)).filter(e=>{let n=e.replace(`${this.baseFileName}-`,``).replace(`.log`,``),r=new Date(n);return r<t}).forEach(e=>{try{d(p(this.logPath,e))}catch(t){console.error(`Failed to delete old log file ${e}:`,t)}})}write(e,...t){let n=new Date,r=n.toISOString().replace(`T`,` `).replace(/\.\d+Z$/,``)+`.${n.getMilliseconds().toString().padStart(3,`0`)}`,i=t.map(e=>typeof e==`object`?JSON.stringify(e,void 0,2):String(e)).join(` `),a=`[${r}] [${e}] ${i}\n`;this.stream.write(a,e=>{e?this.emit(`error`,e):this.emit(`write`,a)})}};const O=()=>m.join(process.env.APPDATA??``,`overlayed`),k=e=>m.join(O(),`apps`,e),A=e=>m.join(k(e),`logs`);var j=class{fileLogger;path;appId;messageQueue=new C;fileName;constructor(e){this.fileName=e}init(e){this.appId=e,this.path=A(e),this.fileLogger=new D(this.path,this.fileName),this.messageQueue.flush().forEach(e=>{this.fileLogger?.[e.type](...e.args)})}scope(e){if(!this.appId||!this.path)throw Error(`Logger not initialized`);let t=`[${e}]`;return{scope:e=>this.scope(e),error:(...e)=>this.error(t,...e),warn:(...e)=>this.warn(t,...e),info:(...e)=>this.info(t,...e),log:(...e)=>this.log(t,...e)}}error(...e){this.handle(`error`,...e)}warn(...e){this.handle(`warn`,...e)}info(...e){this.handle(`log`,...e)}debug(...e){this.handle(`debug`,...e)}log(...e){this.handle(`log`,...e)}handle(e,...t){console[e](...t),this.fileLogger?this.fileLogger[e](...t):this.messageQueue.add({type:e,args:t})}};T(j,`main.log`);const M=`**/overlayed.config.{js,ts,mts}`;async function N(){let e=F(),t=await Promise.all(e.map(async e=>{let t=await import(g.pathToFileURL(e).toString());return t.default}));return t.filter(P)}function P(e){return x(e)&&`app`in e}function F(){let e=h.globSync(M,{absolute:!0,cwd:process.cwd()});return e}var I=class{pattern;options;constructor(e,t){this.pattern=e,this.options=t}},L=class{patterns=[];addGlobPattern(e,t){let n=this.resolveOptions(t),r=S(e);this.patterns.push(new I(r,n))}async bundle(){let e=new v;for(let t of this.patterns){let n=t.options??{},r;r=n.cwd?typeof n.cwd==`string`?n.cwd:_(n.cwd):process.cwd(),m.isAbsolute(r)||(r=m.resolve(r)),n.absolute=!0,n.cwd=r;let i=await h(t.pattern,n);await Promise.all(i.map(async t=>{let n=m.relative(r,t),i=o(t,`binary`);e.file(n,i,{compression:`DEFLATE`})}))}return e}resolveOptions(e){return e}},R=class extends L{installerFolderGlob=`**/installer/**`;constructor(){super(),this.addGlobPattern(`package.json`)}async bundle(){let e=await super.bundle(),t=e.file(`package.json`);if(!t)throw Error(`package.json not found`);return e}resolveOptions(e){if(!e)return{ignore:this.installerFolderGlob};let t=typeof e.ignore==`string`?[e.ignore]:e.ignore??[];return t.push(this.installerFolderGlob),e.ignore=t,e}},z=class extends n{overlayedConfigGlob=`**/overlayed.config.{js,ts,mts}`;static paths=[[`bundle`]];static usage=n.Usage({category:y.deployment,description:`Bundle the app and site for deployment.`,details:`
|
|
2
3
|
Bundle the app and site for deployment.
|
|
3
4
|
|
|
4
5
|
[Docs](http://docs.overlayed.gg/cli/bundle)
|
|
5
|
-
`,examples:[[`Basic usage`,`$0 bundle`]]});async execute(){let e=await this.resolveConfig(),t=
|
|
6
|
-
Multiple config files found matching ${
|
|
7
|
-
`));let
|
|
6
|
+
`,examples:[[`Basic usage`,`$0 bundle`]]});async execute(){let e=await this.resolveConfig(),t=a.createWriteStream(process.cwd()+`/app.zip`),n=await e.app.bundle();if(t.write(await n.generateAsync({type:`nodebuffer`})),e.site){let t=a.createWriteStream(process.cwd()+`/site.zip`),n=await e.site?.bundle();t.write(await n?.generateAsync({type:`nodebuffer`}))}this.context.stdout.write(i.green(`Bundle created successfully.`))}async resolveConfig(){let e=await N();if(e.length===0)throw new r(`No config file found matching `+this.overlayedConfigGlob);e.length>1&&this.context.stdout.write(i.yellow(`
|
|
7
|
+
Multiple config files found matching ${M}, using the first one.
|
|
8
|
+
`));let t=e.at(0);return{app:this.getAppBundler(t.app),site:t.site?this.getSiteBundler(t.site):void 0}}getAppBundler(e){let t=new R;return t.addGlobPattern(e.include,{ignore:e.exclude}),t}getSiteBundler(e){let t=new L;return t.addGlobPattern(e.include,{ignore:e.exclude}),t}};const B=process.argv.slice(2),V=new t({binaryName:`overlayed`,binaryLabel:`Overlayed`});[z,e.HelpCommand].forEach(e=>{V.register(e)}),V.runExit(B);
|
package/package.json
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"keywords": [
|
|
10
10
|
"typescript"
|
|
11
11
|
],
|
|
12
|
-
"version": "0.0.
|
|
12
|
+
"version": "0.0.5",
|
|
13
13
|
"description": "Overlayed CLI",
|
|
14
14
|
"packageManager": "pnpm@10.6.3",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"bin": {
|
|
17
|
-
"
|
|
17
|
+
"overlayed": "./dist/cli.js"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
20
|
"dist/**/*"
|