@hantera/cli 20240403.4.0 → 20240403.5.0

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import yargs from"yargs";import{hideBin}from"yargs/helpers";import path from"path";import fs from"fs";import chalk from"chalk";import{createServer,build}from"vite";import vue from"@vitejs/plugin-vue";import mkcert from"vite-plugin-mkcert";import boxen from"boxen";import readline from"readline-sync";import fetch from"node-fetch";import{parseAllDocuments}from"yaml";import{AsciiTable3}from"ascii-table3";import os from"os";import*as url from"url";var __assign=function(){__assign=Object.assign||function __assign(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))t[p]=s[p]}return t};return __assign.apply(this,arguments)};function __awaiter(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))}function __generator(thisArg,body){var _={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},f,y,t,g;return g={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function __spreadArray(to,from,pack){if(pack||arguments.length===2)for(var i=0,l=from.length,ar;i<l;i++){if(ar||!(i in from)){if(!ar)ar=Array.prototype.slice.call(from,0,i);ar[i]=from[i]}}return to.concat(ar||Array.prototype.slice.call(from))}typeof SuppressedError==="function"?SuppressedError:function(error,suppressed,message){var e=new Error(message);return e.name="SuppressedError",e.error=error,e.suppressed=suppressed,e};function packageToImportMapKey$1(p){return"__portal_"+p.replace("@","").replace("/","_").replace("-","_")}function portalResolve$1(packages){return{name:"vite-plugin-portal-resolve",enforce:"pre",config:function(config){var _a,_b,_c,_d;config.optimizeDeps=__assign(__assign({},(_a=config.optimizeDeps)!==null&&_a!==void 0?_a:{}),{exclude:__spreadArray(__spreadArray([],(_c=(_b=config.optimizeDeps)===null||_b===void 0?void 0:_b.exclude)!==null&&_c!==void 0?_c:[],true),packages,true)});if(!config.build){config.build={}}if(!config.build.rollupOptions){config.build.rollupOptions={}}config.build.rollupOptions.external=__spreadArray(__spreadArray([],(_d=config.build.rollupOptions.external)!==null&&_d!==void 0?_d:[],true),packages.map(packageToImportMapKey$1),true)},configResolved:function(resolvedConfig){var VALID_ID_PREFIX="/@id/";var reg=new RegExp("".concat(VALID_ID_PREFIX,"(").concat(packages.map((function(r){return packageToImportMapKey$1(r)})).join("|"),")"),"g");resolvedConfig.plugins.push({name:"vite-plugin-portal-resolve-replace-idprefix",transform:function(code){var result=reg.test(code)?code.replace(reg,(function(m,s1){return s1})):code;return result}})},resolveId:function(source,importer,options){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(_a){if(packages.includes(source)){return[2,{id:packageToImportMapKey$1(source),external:true}]}return[2]}))}))}}}function packageToImportMapKey(p){return"__portal_"+p.replace("@","").replace("/","_").replace("-","_")}function portalResolve(packages){var reg=new RegExp("(import (?:.+?) from [\"'])(".concat(packages.map((function(r){return r.replace("/","\\/")})).join("|"),")([\"'];?)"),"g");return{name:"vite-plugin-portal-resolve",enforce:"pre",config:function(config){var _a,_b,_c,_d;config.optimizeDeps=__assign(__assign({},(_a=config.optimizeDeps)!==null&&_a!==void 0?_a:{}),{exclude:__spreadArray(__spreadArray([],(_c=(_b=config.optimizeDeps)===null||_b===void 0?void 0:_b.exclude)!==null&&_c!==void 0?_c:[],true),packages,true)});if(!config.build){config.build={}}if(!config.build.rollupOptions){config.build.rollupOptions={}}config.build.rollupOptions.external=__spreadArray(__spreadArray([],(_d=config.build.rollupOptions.external)!==null&&_d!==void 0?_d:[],true),packages.map(packageToImportMapKey),true)},configResolved:function(resolvedConfig){resolvedConfig.plugins.push({name:"vite-plugin-portal-resolve-replace-idprefix",transform:function(code){var result=reg.test(code)?code.replace(reg,(function(m,s1,s2,s3){return s1+packageToImportMapKey(s2)+s3})):code;return result}})}}}function developmentConfig(appDir){return{configFile:false,mode:"development",root:path.join(appDir,".hantera"),plugins:[vue(),portalResolve$1(["vue","@hantera/portal-app"]),mkcert()],logLevel:"error",server:{port:4734,https:true},build:{target:"esnext"}}}function buildConfig(appDir,entry){var result=developmentConfig(appDir);result.mode="production";delete result.server;result.logLevel="warn";result.build.lib={entry,name:"hantera-app",fileName:"index",formats:["es"]};result.plugins=[vue(),portalResolve(["vue","@hantera/portal-app"])];result.build.outDir=path.join(appDir,".hantera","dist");return result}var configFolder=path.join(process.env.APPDATA||(process.platform=="darwin"?process.env.HOME+"/Library/Preferences":process.env.HOME+"/.local/share"),"hantera-cli");if(!fs.existsSync(configFolder)){fs.mkdirSync(configFolder,484)}var configFile=path.join(configFolder,"hantera-cli.config.json");function loadConfig(){var configContent="{}";if(fs.existsSync(configFile)){configContent=fs.readFileSync(configFile,"utf8")}try{var result=JSON.parse(configContent);if(!result.environments){result.environments={}}return result}catch(_a){console.log(chalk.red("Unable to parse config file. Ignoring."));return{}}}var config=__assign(__assign({},loadConfig()),{save:function(){fs.writeFileSync(configFile,JSON.stringify(config))}});function app(appDir){if(!appDir||appDir==="."){appDir=process.cwd()}else if(!path.isAbsolute(appDir)){appDir=path.join(process.cwd(),appDir)}appDir=path.normalize(appDir);if(!fs.existsSync(path.join(appDir,"package.json"))){console.log(chalk.red("'package.json' not found in path '".concat(appDir,"'")));return}var packageJson=JSON.parse(fs.readFileSync(path.join(appDir,"package.json"),"utf8"));if(!packageJson.name){console.log(chalk.red("package.json missing 'name' property."))}var entryPath=path.normalize(path.join(appDir,packageJson.main||"index.ts"));return{packageJson,dev:function(){return __awaiter(this,void 0,void 0,(function(){var cacheDir,loader_ts,server;return __generator(this,(function(_a){switch(_a.label){case 0:cacheDir=path.join(appDir,".hantera");if(!fs.existsSync(cacheDir)){fs.mkdirSync(cacheDir,484)}fs.writeFile(path.join(cacheDir,"index.html"),'<!DOCTYPE html>\n <html lang="en">\n <head>\n </head>\n <body>\n <script type="module" src="loader.ts"><\/script>\n </body>\n </html>\n ',(function(err){if(err){console.error(err)}}));loader_ts="export const appId = ".concat(JSON.stringify(packageJson.name),";\n export { default as default } from '").concat(path.relative(cacheDir,entryPath).replace("\\","/").replace(".ts",""),"';");fs.writeFile(path.join(cacheDir,"loader.ts"),loader_ts,(function(err){if(err){console.error(err)}}));return[4,createServer(developmentConfig(appDir))];case 1:server=_a.sent();return[4,server.listen()];case 2:_a.sent();console.log(chalk.green("Local app development is running.."));console.log(boxen(chalk.black('To enable local development mode in Hantera portal:\n- Go to Developer settings (requires developer permission)\n- Click "Enable Local Development"'),{borderStyle:"none",backgroundColor:"blue",padding:1}));return[2]}}))}))},build:function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(_a){switch(_a.label){case 0:fs.rmSync(path.join(appDir,".hantera","dist"),{recursive:true,force:true});return[4,build(buildConfig(appDir,entryPath))];case 1:_a.sent();return[2]}}))}))},upload:function(env,force){var _a,_b;if(force===void 0){force=false}return __awaiter(this,void 0,void 0,(function(){function upload(type){return __awaiter(this,void 0,void 0,(function(){var file,_a,_b,_c,_d,_e,_f;return __generator(this,(function(_g){switch(_g.label){case 0:file=type===AppAssetType.js?path.join(appDir,".hantera","dist","index.js"):path.join(appDir,".hantera","dist","style.css");if(!fs.existsSync(file)){return[2]}console.log("Uploading ".concat(type===AppAssetType.js?"scripts":"stylesheets","..."));return[4,fetch("".concat(serverUrl,"/apps/upload/").concat(versionId,"?type=").concat(type),{method:"POST",headers:{"Content-Type":"text/plain",Authorization:"Bearer ".concat(token)},body:fs.readFileSync(file,"utf-8")})];case 1:response=_g.sent();if(!!response.ok)return[3,3];_b=(_a=console).log;_d=(_c=chalk).red;_f=(_e="Upload failed: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_b.apply(_a,[_d.apply(_c,[_f.apply(_e,[_g.sent()])])]);return[2];case 3:return[2]}}))}))}var token,answer,serverUrl,response,_c,_d,_e,_f,_g,_h,versionId,_j,_k,_l,_m,_o,_p;return __generator(this,(function(_q){switch(_q.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}if(!force){answer=readline.question(chalk.yellow("Installing '".concat(packageJson.name,"' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}}serverUrl=null;if(env==="localhost"){serverUrl="http://localhost:3100"}else{serverUrl="https://".concat(env,".portal.ams.hantera.cloud")}return[4,fetch("".concat(serverUrl,"/apps/install"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:packageJson.name,description:packageJson.description,version:packageJson.version,authorName:(_b=packageJson.author)===null||_b===void 0?void 0:_b.name})})];case 1:response=_q.sent();if(!!response.ok)return[3,3];_d=(_c=console).log;_f=(_e=chalk).red;_h=(_g="Unable to install: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_d.apply(_c,[_f.apply(_e,[_h.apply(_g,[_q.sent()])])]);return[2];case 3:return[4,response.json()];case 4:versionId=_q.sent();return[4,upload(AppAssetType.js)];case 5:_q.sent();return[4,upload(AppAssetType.css)];case 6:_q.sent();return[4,fetch("".concat(serverUrl,"/apps/end/").concat(versionId),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)}})];case 7:response=_q.sent();if(!!response.ok)return[3,9];_k=(_j=console).log;_m=(_l=chalk).red;_p=(_o="Unable to install: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 8:_k.apply(_j,[_m.apply(_l,[_p.apply(_o,[_q.sent()])])]);return[2];case 9:console.log(chalk.green("App '".concat(packageJson.name,"' installed to '").concat(env,"' successfully!")));return[2]}}))}))}}}var AppAssetType;(function(AppAssetType){AppAssetType["js"]="js";AppAssetType["css"]="css"})(AppAssetType||(AppAssetType={}));function getPortalServerUrl(env){if(env==="localhost"){return"http://localhost:3100"}else{return"https://".concat(env,".portal.ams.hantera.cloud")}}function getServerUrl(env){if(env==="localhost"){return"http://localhost:3300"}else{return"https://".concat(env,".core.ams.hantera.cloud")}}function remote(){function getApps(env){var _a;return __awaiter(this,void 0,void 0,(function(){var token,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")));return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/list"),{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)}})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to fetch installed apps: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 3:return[4,response.json()];case 4:return[2,_h.sent().map((function(r){return{id:r.id,currentVersion:r.currentVersion,authorName:r.authorName,description:r.description,disabledUtc:r.disabledUtc,versions:r.versions}}))]}}))}))}return{deactivateApp:function(env,appId){var _a;return __awaiter(this,void 0,void 0,(function(){var token,answer,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}answer=readline.question(chalk.yellow("Disabling '".concat(appId,"' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/disable"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:appId})})];case 1:response=_h.sent();if(!(response.status===404))return[3,2];console.log(chalk.red("App ".concat(appId,"' not found, try 'h_ list'")));return[3,5];case 2:if(!!response.ok)return[3,4];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to disable: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 3:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 4:console.log(chalk.green("App '".concat(appId,"' disabled in '").concat(env,"' successfully!")));_h.label=5;case 5:return[2]}}))}))},activateApp:function(env,appId,version){var _a;return __awaiter(this,void 0,void 0,(function(){var token,answer,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}answer=readline.question(chalk.yellow("Activating '".concat(appId,"@").concat(version?version:"installed","' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/activate"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:appId,version})})];case 1:response=_h.sent();if(!(response.status===404))return[3,2];if(version){console.log(chalk.red("App '".concat(appId,"@").concat(version,"' not found, try 'h_ list'")))}else{console.log(chalk.red("App '".concat(appId,"' not found, try 'h_ list'")))}return[3,5];case 2:if(!!response.ok)return[3,4];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to activate: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 3:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 4:console.log(chalk.green("App '".concat(appId,"' activated in '").concat(env,"' successfully!")));_h.label=5;case 5:return[2]}}))}))},getApps,listApps:function(env){return __awaiter(this,void 0,void 0,(function(){var apps,table,count,_i,apps_1,app;return __generator(this,(function(_a){switch(_a.label){case 0:return[4,getApps(env)];case 1:apps=_a.sent();table=new AsciiTable3("Apps in '".concat(env,"'"));table.setHeading("Id","Version","Author","Description","Disabled");table.setWidth(4,30).setWrapped(4);count=0;for(_i=0,apps_1=apps;_i<apps_1.length;_i++){app=apps_1[_i];count+=1;table.addRow(app.id,app.currentVersion,app.authorName,app.description,app.disabledUtc?new Date(app.disabledUtc).toDateString():"")}if(count>0){console.log(table.toString())}else{console.log("No apps installed")}return[2]}}))}))},appDetails:function(env,appId){return __awaiter(this,void 0,void 0,(function(){var apps,app,table,count,_i,_a,version;return __generator(this,(function(_b){switch(_b.label){case 0:return[4,getApps(env)];case 1:apps=_b.sent();if(!apps){console.log(chalk.red("Unable to fetch installed apps"));return[2]}app=apps.find((function(r){return r.id===appId}));if(!app){console.log(chalk.red("App '".concat(appId,"' not found in '").concat(env,"'")));return[2]}console.log(chalk.bold(app.id));console.log("By "+app.authorName);console.log();console.log(app.description);console.log();table=new AsciiTable3("Installed versions of '".concat(appId,"' in '").concat(env,"'"));table.setHeading("Version","Installed","Uploaded By");table.setWidth(4,30).setWrapped(4);count=0;for(_i=0,_a=app.versions;_i<_a.length;_i++){version=_a[_i];count+=1;table.addRow(version.isActive?chalk.blue(version.version):version.version,new Date(version.installedUtc).toDateString(),version.uploadedBy)}if(count>0){console.log(table.toString())}return[2]}}))}))},importSettings:function(env,clear,values){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g,result;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={clear:!!clear,values};console.log("Applying settings..");serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/settings/apply"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to apply settings: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 3:return[4,response.json()];case 4:result=_h.sent();result.forEach((function(r){if(r.oldValue){console.log("Setting '".concat(r.key,"' changed from ").concat(JSON.stringify(r.oldValue)," to ").concat(JSON.stringify(r.newValue)))}else{console.log("Setting '".concat(r.key,"' set to ").concat(JSON.stringify(r.newValue)))}}));console.log(chalk.green("Settings applied successfully!"));_h.label=5;case 5:return[2]}}))}))},saveComponent:function(env,componentId,source){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={componentId,data:source};console.log("Uploading component '".concat(componentId,"'.."));serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/saveComponent"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to upload component: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2,false];case 3:console.log(chalk.green("Script uploaded successfully!"));return[2,true]}}))}))},validateComponent:function(env,componentId,source){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g,result;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={componentId,data:source};console.log("Validating component '".concat(componentId,"'.."));serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/validateComponent"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to validate component: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2,false];case 3:return[4,response.json()];case 4:result=_h.sent();result.errors.forEach((function(r){var pos=r.absolutePosition;if(r.isWarning){console.log(chalk.yellow(" Warning ".concat(pos.fromLine,":").concat(pos.fromColumn," - ").concat(pos.toLine,":").concat(pos.toColumn," ").concat(r.message)))}else{console.log(chalk.red(" Error ".concat(pos.fromLine,":").concat(pos.fromColumn," - ").concat(pos.toLine,":").concat(pos.toColumn," ").concat(r.message)))}}));if(!result.successful){console.log(chalk.red("Component '"+componentId+"' is not valid. See errors above script."));return[2,false]}return[2,true]}}))}))}}}function manifest(manifestPath,envOverride){manifestPath=path.join(process.cwd(),manifestPath);if(!fs.existsSync(manifestPath)){console.log(chalk.red("'".concat(manifestPath,"' not found.")));return}var manifests=parseAllDocuments(fs.readFileSync(manifestPath,"utf8")).map((function(r){return r.toJS()}));if(!manifests){throw"'".concat(manifestPath,"' is empty or invalid.")}manifests.forEach((function(manifest){var _a;if(!envOverride&&!manifest.env){throw"No 'env' manifest property specified and no override passed to command"}(_a=manifest.apps)===null||_a===void 0?void 0:_a.add.forEach((function(r){if(!r.path){throw"App lacks 'path', only local apps are supported for now"}}))}));var remote$1=remote();return{apply:function(){return __awaiter(this,void 0,void 0,(function(){var _i,manifests_1,manifest_1,_a,manifests_2,manifest_2;return __generator(this,(function(_b){switch(_b.label){case 0:_i=0,manifests_1=manifests;_b.label=1;case 1:if(!(_i<manifests_1.length))return[3,4];manifest_1=manifests_1[_i];return[4,validateComponents(manifest_1)];case 2:if(!_b.sent()){return[2]}_b.label=3;case 3:_i++;return[3,1];case 4:_a=0,manifests_2=manifests;_b.label=5;case 5:if(!(_a<manifests_2.length))return[3,9];manifest_2=manifests_2[_a];return[4,applyComponents(manifest_2)];case 6:if(!_b.sent()){return[2]}return[4,applySettings(manifest_2)];case 7:_b.sent();_b.label=8;case 8:_a++;return[3,5];case 9:return[2]}}))}))}};function applySettings(manifest){return __awaiter(this,void 0,void 0,(function(){function collect(obj,path){if(Array.isArray(obj)){obj.forEach((function(r){Object.keys(r).forEach((function(key){values.push({container:path.join("/"),key,value:r[key]})}))}))}else if(typeof obj==="object"){for(var key in obj){collect(obj[key],__spreadArray(__spreadArray([],path,true),[key],false))}}}var env,values;return __generator(this,(function(_a){switch(_a.label){case 0:if(!manifest.settings)return[2];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;values=[];collect(manifest.settings,[]);return[4,remote$1.importSettings(env,manifest.clearSettings,values)];case 1:_a.sent();return[2]}}))}))}function applyComponents(manifest){return __awaiter(this,void 0,void 0,(function(){var env,baseDir,_i,_a,component,source;return __generator(this,(function(_b){switch(_b.label){case 0:if(!manifest.components)return[2,true];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;baseDir=path.dirname(manifestPath);_i=0,_a=manifest.components;_b.label=1;case 1:if(!(_i<_a.length))return[3,4];component=_a[_i];source=fs.readFileSync(path.join(baseDir,component.file),"utf8");return[4,remote$1.saveComponent(env,component.id,source)];case 2:if(!_b.sent()){return[2,false]}_b.label=3;case 3:_i++;return[3,1];case 4:return[2,true]}}))}))}function validateComponents(manifest){return __awaiter(this,void 0,void 0,(function(){var env,baseDir,_i,_a,component,source;return __generator(this,(function(_b){switch(_b.label){case 0:if(!manifest.components)return[2,true];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;baseDir=path.dirname(manifestPath);_i=0,_a=manifest.components;_b.label=1;case 1:if(!(_i<_a.length))return[3,4];component=_a[_i];source=fs.readFileSync(path.join(baseDir,component.file),"utf8");return[4,remote$1.validateComponent(env,component.id,source)];case 2:if(!_b.sent()){return[2,false]}_b.label=3;case 3:_i++;return[3,1];case 4:return[2,true]}}))}))}}var __dirname=url.fileURLToPath(new URL(".",import.meta.url));var json=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),"utf-8"));var version=json.version;function create(){return __awaiter(this,void 0,void 0,(function(){var id,input,description,componentsDir;return __generator(this,(function(_a){switch(_a.label){case 0:if(fs.existsSync(path.join(process.cwd(),"package.json"))){console.log(chalk.red("'package.json' already exists. Run 'create' in an empty folder."));return[2]}id=path.parse(process.cwd()).base;return[4,readline.question("App id [".concat(id,"]:"))];case 1:input=_a.sent();if(input){id=input}return[4,readline.question("Description []:")];case 2:description=_a.sent();fs.writeFileSync(path.join(process.cwd(),"package.json"),'{\n "name": "'.concat(id,'",\n "description": "').concat(description,'",\n "author": {\n "name": "').concat(os.userInfo().username,'"\n },\n "version": "1.0.0",\n "main": "index.ts",\n "type": "module",\n "dependencies": {\n "@hantera/portal-app": "').concat(version,'",\n "vue": "^3.3.4"\n }\n}\n'));fs.writeFileSync(path.join(process.cwd(),"tsconfig.json"),'{\n "compilerOptions": {\n "target": "ESNext",\n "useDefineForClassFields": true,\n "module": "ESNext",\n "moduleResolution": "Node",\n "strict": true,\n "jsx": "preserve",\n "sourceMap": true,\n "resolveJsonModule": true,\n "isolatedModules": true,\n "esModuleInterop": true,\n "lib": ["ESNext", "DOM"],\n "skipLibCheck": true\n },\n "include": ["./**/*.ts", "./**/*.d.ts", "./**/*.tsx", "./**/*.vue"]\n}\n');fs.writeFileSync(path.join(process.cwd(),"index.ts"),"import { Portal, StandardSlots } from '@hantera/portal-app';\nimport MyComponent from './components/MyComponent.vue';\n\nexport default function(portal: Portal) {\n portal.registerComponent(StandardSlots.order.delivery.footer, MyComponent);\n}\n");componentsDir=path.join(process.cwd(),"components");if(!fs.existsSync(componentsDir)){fs.mkdirSync(componentsDir,484)}fs.writeFileSync(path.join(componentsDir,"MyComponent.vue"),"<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { deliveryKey, models } from '@hantera/portal-app';\n\nconst delivery = inject<models.Delivery>(deliveryKey);\n<\/script>\n\n<template>\n Current delivery number: {{ delivery?.deliveryNumber }}\n</template>\n");fs.writeFileSync(path.join(process.cwd(),".gitignore"),".hantera/\nnode_modules/\n");console.log(chalk.green("App created. Now run 'h_ dev' to test it."));return[2]}}))}))}function login(env,email,password){return __awaiter(this,void 0,void 0,(function(){var serverUrl,response,payload;return __generator(this,(function(_a){switch(_a.label){case 0:env=env.replace(/[^A-Za-z0-9-]/,"");console.log("Logging in to '".concat(env,"'..."));if(!!email)return[3,2];return[4,readline.question("E-mail:")];case 1:email=_a.sent();_a.label=2;case 2:if(!!password)return[3,4];return[4,readline.question("Password:",{hideEchoBack:true})];case 3:password=_a.sent();_a.label=4;case 4:serverUrl=null;if(env==="localhost"){serverUrl="http://localhost:3100"}else{serverUrl="https://".concat(env,".portal.ams.hantera.cloud")}return[4,fetch("".concat(serverUrl,"/token"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email,password})})];case 5:response=_a.sent();if(!response.ok)return[3,7];return[4,response.json()];case 6:payload=_a.sent();config.environments[env]={token:payload.token,displayName:payload.instanceName};config.save();console.log(chalk.green("Logged in successfully"));return[3,8];case 7:console.log(chalk.red("Environment, e-mail and/or password incorrect"));_a.label=8;case 8:return[2]}}))}))}function logout(env){console.log("Logging out from '".concat(env,"'..."));delete config.environments[env];config.save();console.log(chalk.green("Logged out successfully"))}function listEnvironments(){var table=new AsciiTable3;table.setHeading("id","name","E-mail","Expires");for(var env in config.environments){var _a=config.environments[env].token.split(".");_a[0];var payloadRaw=_a[1];_a[2];var buff=Buffer.from(payloadRaw,"base64");var payload=JSON.parse(buff.toString("ascii"));table.addRow(env,config.environments[env].displayName,payload.email,timeConverter(payload.exp))}console.log(table.toString())}function timeConverter(UNIX_timestamp){var a=new Date(UNIX_timestamp*1e3);var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var year=a.getFullYear();var month=months[a.getMonth()];var date=a.getDate();var hour=a.getHours();var min=a.getMinutes();var sec=a.getSeconds();var time=date+" "+month+" "+year+" "+hour+":"+min+":"+sec;return time}yargs(hideBin(process.argv)).scriptName("h_").showHelpOnFail(true).demandCommand().command("create","Create a new app in the current folder",(function(yargs){return yargs}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){return __generator(this,(function(_a){switch(_a.label){case 0:return[4,create()];case 1:_a.sent();return[2]}}))}))})).command("install [-e env] [path]","Build and install the app",(function(yargs){return configurePath(yargs).option("environment",{alias:"e",type:"string",description:"The environment to install to, if not specified current environment will be used",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var a,env;return __generator(this,(function(_a){switch(_a.label){case 0:a=app(args["path"]);if(!a){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,a.build()];case 1:_a.sent();return[4,a.upload(env)];case 2:_a.sent();return[2]}}))}))})).command("deactivate [-e env] <id>","Deactivates the specified app",(function(yargs){return configurePath(yargs).option("environment",{alias:"e",type:"string",description:"The environment to deactivate in, if not specified current environment will be used",demandOption:false}).positional("id",{type:"string",description:"The ID of the app to deactivate",demandOption:true})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,r.deactivateApp(env,args.id)];case 1:_a.sent();return[2]}}))}))})).command("activate [-e env] [-v version] <id>","Activates an installed app. Could be a previous version or a deactivated app.",(function(yargs){return yargs.version(false).option("environment",{alias:"e",type:"string",description:"The environment to install to, if not specified current environment will be used",demandOption:false}).option("version",{alias:"v",type:"string",description:"Optionally specify the version to activate. If not set, the latest installed version will be activated.",demandOption:false}).positional("id",{type:"string",description:"The ID of the app to activate",demandOption:true})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,r.activateApp(env,args.id,args.version)];case 1:_a.sent();return[2]}}))}))})).command("list [id]","Lists installed apps",(function(yargs){return yargs.option("env",{alias:"e",type:"string",default:config.currentEnvironment,description:"The environment to install to, if not specified current environment will be used",demandOption:false}).positional("id",{type:"string",description:"If specified, will fetch all detailed information about the app including all installed versions",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args["env"];if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"));return[2]}if(!args.id)return[3,2];return[4,r.appDetails(env,args.id)];case 1:_a.sent();return[3,4];case 2:return[4,r.listApps(env)];case 3:_a.sent();_a.label=4;case 4:return[2]}}))}))})).command("dev [path]","Run in local development mode",(function(yargs){return configurePath(yargs)}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var a;return __generator(this,(function(_a){switch(_a.label){case 0:a=app(args["path"]);if(!a){return[2]}return[4,a.dev()];case 1:_a.sent();return[2]}}))}))})).command("use [environment]","Gets or sets the default environment",(function(yargs){return yargs.positional("environment",{alias:"e",type:"string",description:"The environment to use",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){return __generator(this,(function(_a){if(!args["environment"]){console.log("Current environment: ".concat(chalk.bold(config.currentEnvironment)));return[2]}config.currentEnvironment=args.environment;config.save();console.log("Current environment set to '".concat(args.environment,"'"));return[2]}))}))})).command("login [-e env] [-u email] [-p password]","Log in to the current or specified environment",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"The environment to login to, if not specified current environment will be used",demandOption:false}).option("email",{alias:"u",type:"string",demandOption:false}).option("password",{alias:"p",type:"string",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var env;return __generator(this,(function(_a){switch(_a.label){case 0:env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,login(env,args.email,args.password)];case 1:_a.sent();return[2]}}))}))})).command("logout [-e env]","Log out from the current or specified environment",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"The environment to logout of, if not specified current environment will be used",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var env;return __generator(this,(function(_a){switch(_a.label){case 0:env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,logout(env)];case 1:_a.sent();return[2]}}))}))})).command(["apply [-e env] <file>"],"Applies a manifest file",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"Overrides the 'env' specified in the manifest file",demandOption:false}).positional("file",{type:"string",description:"The manifest file to apply",demandOption:true})}),(function(args){try{var m=manifest(args.file,args.environment);m.apply()}catch(e){console.log(chalk.red(e))}})).command(["environments","envs"],"Lists all logged in environments",(function(yargs){return yargs}),(function(args){listEnvironments()})).strict().parse();function configurePath(yargs){yargs.positional("path",{default:".",describe:"Local path to the app",type:"string"});return yargs}
2
+ import yargs from"yargs";import{hideBin}from"yargs/helpers";import path from"path";import fs from"fs";import chalk from"chalk";import{createServer,build}from"vite";import vue from"@vitejs/plugin-vue";import mkcert from"vite-plugin-mkcert";import boxen from"boxen";import readline from"readline-sync";import fetch from"node-fetch";import{parseAllDocuments}from"yaml";import{AsciiTable3}from"ascii-table3";import os from"os";import*as url from"url";var __assign=function(){__assign=Object.assign||function __assign(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))t[p]=s[p]}return t};return __assign.apply(this,arguments)};function __awaiter(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))}function __generator(thisArg,body){var _={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},f,y,t,g;return g={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function __spreadArray(to,from,pack){if(pack||arguments.length===2)for(var i=0,l=from.length,ar;i<l;i++){if(ar||!(i in from)){if(!ar)ar=Array.prototype.slice.call(from,0,i);ar[i]=from[i]}}return to.concat(ar||Array.prototype.slice.call(from))}typeof SuppressedError==="function"?SuppressedError:function(error,suppressed,message){var e=new Error(message);return e.name="SuppressedError",e.error=error,e.suppressed=suppressed,e};function packageToImportMapKey$1(p){return"__portal_"+p.replace("@","").replace("/","_").replace("-","_")}function portalResolve$1(packages){return{name:"vite-plugin-portal-resolve",enforce:"pre",config:function(config){var _a,_b,_c,_d;config.optimizeDeps=__assign(__assign({},(_a=config.optimizeDeps)!==null&&_a!==void 0?_a:{}),{exclude:__spreadArray(__spreadArray([],(_c=(_b=config.optimizeDeps)===null||_b===void 0?void 0:_b.exclude)!==null&&_c!==void 0?_c:[],true),packages,true)});if(!config.build){config.build={}}if(!config.build.rollupOptions){config.build.rollupOptions={}}config.build.rollupOptions.external=__spreadArray(__spreadArray([],(_d=config.build.rollupOptions.external)!==null&&_d!==void 0?_d:[],true),packages.map(packageToImportMapKey$1),true)},configResolved:function(resolvedConfig){var VALID_ID_PREFIX="/@id/";var reg=new RegExp("".concat(VALID_ID_PREFIX,"(").concat(packages.map((function(r){return packageToImportMapKey$1(r)})).join("|"),")"),"g");resolvedConfig.plugins.push({name:"vite-plugin-portal-resolve-replace-idprefix",transform:function(code){var result=reg.test(code)?code.replace(reg,(function(m,s1){return s1})):code;return result}})},resolveId:function(source,importer,options){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(_a){if(packages.includes(source)){return[2,{id:packageToImportMapKey$1(source),external:true}]}return[2]}))}))}}}function packageToImportMapKey(p){return"__portal_"+p.replace("@","").replace("/","_").replace("-","_")}function portalResolve(packages){var reg=new RegExp("(import (?:.+?) from [\"'])(".concat(packages.map((function(r){return r.replace("/","\\/")})).join("|"),")([\"'];?)"),"g");return{name:"vite-plugin-portal-resolve",enforce:"pre",config:function(config){var _a,_b,_c,_d;config.optimizeDeps=__assign(__assign({},(_a=config.optimizeDeps)!==null&&_a!==void 0?_a:{}),{exclude:__spreadArray(__spreadArray([],(_c=(_b=config.optimizeDeps)===null||_b===void 0?void 0:_b.exclude)!==null&&_c!==void 0?_c:[],true),packages,true)});if(!config.build){config.build={}}if(!config.build.rollupOptions){config.build.rollupOptions={}}config.build.rollupOptions.external=__spreadArray(__spreadArray([],(_d=config.build.rollupOptions.external)!==null&&_d!==void 0?_d:[],true),packages.map(packageToImportMapKey),true)},configResolved:function(resolvedConfig){resolvedConfig.plugins.push({name:"vite-plugin-portal-resolve-replace-idprefix",transform:function(code){var result=reg.test(code)?code.replace(reg,(function(m,s1,s2,s3){return s1+packageToImportMapKey(s2)+s3})):code;return result}})}}}function developmentConfig(appDir){return{configFile:false,mode:"development",root:path.join(appDir,".hantera"),plugins:[vue(),portalResolve$1(["vue","@hantera/portal-app"]),mkcert()],logLevel:"error",server:{port:4734,https:true},build:{target:"esnext"}}}function buildConfig(appDir,entry){var result=developmentConfig(appDir);result.mode="production";delete result.server;result.logLevel="warn";result.build.lib={entry,name:"hantera-app",fileName:"index",formats:["es"]};result.plugins=[vue(),portalResolve(["vue","@hantera/portal-app"])];result.build.outDir=path.join(appDir,".hantera","dist");return result}var configFolder=path.join(process.env.APPDATA||(process.platform=="darwin"?process.env.HOME+"/Library/Preferences":process.env.HOME+"/.local/share"),"hantera-cli");if(!fs.existsSync(configFolder)){fs.mkdirSync(configFolder,484)}var configFile=path.join(configFolder,"hantera-cli.config.json");function loadConfig(){var configContent="{}";if(fs.existsSync(configFile)){configContent=fs.readFileSync(configFile,"utf8")}try{var result=JSON.parse(configContent);if(!result.environments){result.environments={}}return result}catch(_a){console.log(chalk.red("Unable to parse config file. Ignoring."));return{}}}var config=__assign(__assign({},loadConfig()),{save:function(){fs.writeFileSync(configFile,JSON.stringify(config))}});function app(appDir){if(!appDir||appDir==="."){appDir=process.cwd()}else if(!path.isAbsolute(appDir)){appDir=path.join(process.cwd(),appDir)}appDir=path.normalize(appDir);if(!fs.existsSync(path.join(appDir,"package.json"))){console.log(chalk.red("'package.json' not found in path '".concat(appDir,"'")));return}var packageJson=JSON.parse(fs.readFileSync(path.join(appDir,"package.json"),"utf8"));if(!packageJson.name){console.log(chalk.red("package.json missing 'name' property."))}var entryPath=path.normalize(path.join(appDir,packageJson.main||"index.ts"));return{packageJson,dev:function(){return __awaiter(this,void 0,void 0,(function(){var cacheDir,loader_ts,server;return __generator(this,(function(_a){switch(_a.label){case 0:cacheDir=path.join(appDir,".hantera");if(!fs.existsSync(cacheDir)){fs.mkdirSync(cacheDir,484)}fs.writeFile(path.join(cacheDir,"index.html"),'<!DOCTYPE html>\n <html lang="en">\n <head>\n </head>\n <body>\n <script type="module" src="loader.ts"><\/script>\n </body>\n </html>\n ',(function(err){if(err){console.error(err)}}));loader_ts="export const appId = ".concat(JSON.stringify(packageJson.name),";\n export { default as default } from '").concat(path.relative(cacheDir,entryPath).replace("\\","/").replace(".ts",""),"';");fs.writeFile(path.join(cacheDir,"loader.ts"),loader_ts,(function(err){if(err){console.error(err)}}));return[4,createServer(developmentConfig(appDir))];case 1:server=_a.sent();return[4,server.listen()];case 2:_a.sent();console.log(chalk.green("Local app development is running.."));console.log(boxen(chalk.black('To enable local development mode in Hantera portal:\n- Go to Developer settings (requires developer permission)\n- Click "Enable Local Development"'),{borderStyle:"none",backgroundColor:"blue",padding:1}));return[2]}}))}))},build:function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(_a){switch(_a.label){case 0:fs.rmSync(path.join(appDir,".hantera","dist"),{recursive:true,force:true});return[4,build(buildConfig(appDir,entryPath))];case 1:_a.sent();return[2]}}))}))},upload:function(env,force){var _a,_b;if(force===void 0){force=false}return __awaiter(this,void 0,void 0,(function(){function upload(type){return __awaiter(this,void 0,void 0,(function(){var file,_a,_b,_c,_d,_e,_f;return __generator(this,(function(_g){switch(_g.label){case 0:file=type===AppAssetType.js?path.join(appDir,".hantera","dist","index.js"):path.join(appDir,".hantera","dist","style.css");if(!fs.existsSync(file)){return[2]}console.log("Uploading ".concat(type===AppAssetType.js?"scripts":"stylesheets","..."));return[4,fetch("".concat(serverUrl,"/apps/upload/").concat(versionId,"?type=").concat(type),{method:"POST",headers:{"Content-Type":"text/plain",Authorization:"Bearer ".concat(token)},body:fs.readFileSync(file,"utf-8")})];case 1:response=_g.sent();if(!!response.ok)return[3,3];_b=(_a=console).log;_d=(_c=chalk).red;_f=(_e="Upload failed: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_b.apply(_a,[_d.apply(_c,[_f.apply(_e,[_g.sent()])])]);return[2];case 3:return[2]}}))}))}var token,answer,serverUrl,response,_c,_d,_e,_f,_g,_h,versionId,_j,_k,_l,_m,_o,_p;return __generator(this,(function(_q){switch(_q.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}if(!force){answer=readline.question(chalk.yellow("Installing '".concat(packageJson.name,"' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}}serverUrl=null;if(env==="localhost"){serverUrl="http://localhost:3100"}else{serverUrl="https://".concat(env,".portal.ams.hantera.cloud")}return[4,fetch("".concat(serverUrl,"/apps/install"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:packageJson.name,description:packageJson.description,version:packageJson.version,authorName:(_b=packageJson.author)===null||_b===void 0?void 0:_b.name})})];case 1:response=_q.sent();if(!!response.ok)return[3,3];_d=(_c=console).log;_f=(_e=chalk).red;_h=(_g="Unable to install: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_d.apply(_c,[_f.apply(_e,[_h.apply(_g,[_q.sent()])])]);return[2];case 3:return[4,response.json()];case 4:versionId=_q.sent();return[4,upload(AppAssetType.js)];case 5:_q.sent();return[4,upload(AppAssetType.css)];case 6:_q.sent();return[4,fetch("".concat(serverUrl,"/apps/end/").concat(versionId),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)}})];case 7:response=_q.sent();if(!!response.ok)return[3,9];_k=(_j=console).log;_m=(_l=chalk).red;_p=(_o="Unable to install: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 8:_k.apply(_j,[_m.apply(_l,[_p.apply(_o,[_q.sent()])])]);return[2];case 9:console.log(chalk.green("App '".concat(packageJson.name,"' installed to '").concat(env,"' successfully!")));return[2]}}))}))}}}var AppAssetType;(function(AppAssetType){AppAssetType["js"]="js";AppAssetType["css"]="css"})(AppAssetType||(AppAssetType={}));function getPortalServerUrl(env){if(env==="localhost"){return"http://localhost:3100"}else{return"https://".concat(env,".portal.ams.hantera.cloud")}}function getServerUrl(env){if(env==="localhost"){return"http://localhost:3300"}else{return"https://".concat(env,".core.ams.hantera.cloud")}}function remote(){function getApps(env){var _a;return __awaiter(this,void 0,void 0,(function(){var token,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")));return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/list"),{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)}})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to fetch installed apps: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 3:return[4,response.json()];case 4:return[2,_h.sent().map((function(r){return{id:r.id,currentVersion:r.currentVersion,authorName:r.authorName,description:r.description,disabledUtc:r.disabledUtc,versions:r.versions}}))]}}))}))}return{deactivateApp:function(env,appId){var _a;return __awaiter(this,void 0,void 0,(function(){var token,answer,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}answer=readline.question(chalk.yellow("Disabling '".concat(appId,"' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/disable"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:appId})})];case 1:response=_h.sent();if(!(response.status===404))return[3,2];console.log(chalk.red("App ".concat(appId,"' not found, try 'h_ list'")));return[3,5];case 2:if(!!response.ok)return[3,4];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to disable: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 3:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 4:console.log(chalk.green("App '".concat(appId,"' disabled in '").concat(env,"' successfully!")));_h.label=5;case 5:return[2]}}))}))},activateApp:function(env,appId,version){var _a;return __awaiter(this,void 0,void 0,(function(){var token,answer,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}answer=readline.question(chalk.yellow("Activating '".concat(appId,"@").concat(version?version:"installed","' in '").concat(env,"', proceed? [Y/n]")));if(!(!answer||answer==="Y"||answer==="y")){console.log("Aborting");return[2]}serverUrl=getPortalServerUrl(env);return[4,fetch("".concat(serverUrl,"/apps/activate"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify({id:appId,version})})];case 1:response=_h.sent();if(!(response.status===404))return[3,2];if(version){console.log(chalk.red("App '".concat(appId,"@").concat(version,"' not found, try 'h_ list'")))}else{console.log(chalk.red("App '".concat(appId,"' not found, try 'h_ list'")))}return[3,5];case 2:if(!!response.ok)return[3,4];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to activate: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 3:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 4:console.log(chalk.green("App '".concat(appId,"' activated in '").concat(env,"' successfully!")));_h.label=5;case 5:return[2]}}))}))},getApps,listApps:function(env){return __awaiter(this,void 0,void 0,(function(){var apps,table,count,_i,apps_1,app;return __generator(this,(function(_a){switch(_a.label){case 0:return[4,getApps(env)];case 1:apps=_a.sent();table=new AsciiTable3("Apps in '".concat(env,"'"));table.setHeading("Id","Version","Author","Description","Disabled");table.setWidth(4,30).setWrapped(4);count=0;for(_i=0,apps_1=apps;_i<apps_1.length;_i++){app=apps_1[_i];count+=1;table.addRow(app.id,app.currentVersion,app.authorName,app.description,app.disabledUtc?new Date(app.disabledUtc).toDateString():"")}if(count>0){console.log(table.toString())}else{console.log("No apps installed")}return[2]}}))}))},appDetails:function(env,appId){return __awaiter(this,void 0,void 0,(function(){var apps,app,table,count,_i,_a,version;return __generator(this,(function(_b){switch(_b.label){case 0:return[4,getApps(env)];case 1:apps=_b.sent();if(!apps){console.log(chalk.red("Unable to fetch installed apps"));return[2]}app=apps.find((function(r){return r.id===appId}));if(!app){console.log(chalk.red("App '".concat(appId,"' not found in '").concat(env,"'")));return[2]}console.log(chalk.bold(app.id));console.log("By "+app.authorName);console.log();console.log(app.description);console.log();table=new AsciiTable3("Installed versions of '".concat(appId,"' in '").concat(env,"'"));table.setHeading("Version","Installed","Uploaded By");table.setWidth(4,30).setWrapped(4);count=0;for(_i=0,_a=app.versions;_i<_a.length;_i++){version=_a[_i];count+=1;table.addRow(version.isActive?chalk.blue(version.version):version.version,new Date(version.installedUtc).toDateString(),version.uploadedBy)}if(count>0){console.log(table.toString())}return[2]}}))}))},importSettings:function(env,clear,values){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g,result;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={clear:!!clear,values};console.log("Applying settings..");serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/settings/apply"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to apply settings: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2];case 3:return[4,response.json()];case 4:result=_h.sent();result.forEach((function(r){if(r.oldValue){console.log("Setting '".concat(r.key,"' changed from ").concat(JSON.stringify(r.oldValue)," to ").concat(JSON.stringify(r.newValue)))}else{console.log("Setting '".concat(r.key,"' set to ").concat(JSON.stringify(r.newValue)))}}));console.log(chalk.green("Settings applied successfully!"));_h.label=5;case 5:return[2]}}))}))},saveComponent:function(env,componentId,source){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={componentId,data:source};console.log("Uploading component '".concat(componentId,"'.."));serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/saveComponent"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to upload component: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2,false];case 3:console.log(chalk.green("Script uploaded successfully!"));return[2,true]}}))}))},validateComponent:function(env,componentId,source){var _a;return __awaiter(this,void 0,void 0,(function(){var token,payload,serverUrl,response,_b,_c,_d,_e,_f,_g,result;return __generator(this,(function(_h){switch(_h.label){case 0:token=(_a=config.environments[env])===null||_a===void 0?void 0:_a.token;if(!token){console.log(chalk.red("No login found for '".concat(env,"'")))}payload={componentId,data:source};console.log("Validating component '".concat(componentId,"'.."));serverUrl=getServerUrl(env);return[4,fetch("".concat(serverUrl,"/api/system/validateComponent"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(token)},body:JSON.stringify(payload)})];case 1:response=_h.sent();if(!!response.ok)return[3,3];_c=(_b=console).log;_e=(_d=chalk).red;_g=(_f="Unable to validate component: (".concat(response.status," ").concat(response.statusText,") ")).concat;return[4,response.text()];case 2:_c.apply(_b,[_e.apply(_d,[_g.apply(_f,[_h.sent()])])]);return[2,false];case 3:return[4,response.json()];case 4:result=_h.sent();result.errors.forEach((function(r){var pos=r.absolutePosition;if(r.isWarning){console.log(chalk.yellow(" Warning ".concat(pos.fromLine,":").concat(pos.fromColumn," - ").concat(pos.toLine,":").concat(pos.toColumn," ").concat(r.message)))}else{console.log(chalk.red(" Error ".concat(pos.fromLine,":").concat(pos.fromColumn," - ").concat(pos.toLine,":").concat(pos.toColumn," ").concat(r.message)))}}));if(!result.successful){console.log(chalk.red("Component '"+componentId+"' is not valid. See errors above script."));return[2,false]}return[2,true]}}))}))}}}function manifest(manifestPath,envOverride){manifestPath=path.join(process.cwd(),manifestPath);if(!fs.existsSync(manifestPath)){console.log(chalk.red("'".concat(manifestPath,"' not found.")));return}var manifests=parseAllDocuments(fs.readFileSync(manifestPath,"utf8")).map((function(r){return r.toJS()}));if(!manifests){throw"'".concat(manifestPath,"' is empty or invalid.")}manifests.forEach((function(manifest){var _a;if(!envOverride&&!manifest.env){throw"No 'env' manifest property specified and no override passed to command"}(_a=manifest.apps)===null||_a===void 0?void 0:_a.add.forEach((function(r){if(!r.path){throw"App lacks 'path', only local apps are supported for now"}}))}));var remote$1=remote();return{apply:function(){return __awaiter(this,void 0,void 0,(function(){var _i,manifests_1,manifest_1,_a,manifests_2,manifest_2;return __generator(this,(function(_b){switch(_b.label){case 0:_i=0,manifests_1=manifests;_b.label=1;case 1:if(!(_i<manifests_1.length))return[3,4];manifest_1=manifests_1[_i];return[4,validateComponents(manifest_1)];case 2:if(!_b.sent()){return[2]}_b.label=3;case 3:_i++;return[3,1];case 4:_a=0,manifests_2=manifests;_b.label=5;case 5:if(!(_a<manifests_2.length))return[3,10];manifest_2=manifests_2[_a];return[4,applyApps(manifest_2)];case 6:_b.sent();return[4,applyComponents(manifest_2)];case 7:if(!_b.sent()){return[2]}return[4,applySettings(manifest_2)];case 8:_b.sent();_b.label=9;case 9:_a++;return[3,5];case 10:return[2]}}))}))}};function applyApps(manifest){var _a,_b;return __awaiter(this,void 0,void 0,(function(){var env,installed,apps,_loop_1,_i,apps_1,app_1;return __generator(this,(function(_c){switch(_c.label){case 0:if(!manifest.apps)return[2];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;return[4,remote$1.getApps(env)];case 1:installed=_c.sent();if(!installed){console.log(chalk.red("Unable to fetch installed apps"));return[2]}apps=(_b=(_a=manifest.apps)===null||_a===void 0?void 0:_a.add)===null||_b===void 0?void 0:_b.map((function(r){return{manifest:r,control:app(r.path)}}));_loop_1=function(app_1){return __generator(this,(function(_d){switch(_d.label){case 0:if(app_1.manifest.skipIfDeactivated&&installed.find((function(r){return r.id===app_1.control.packageJson.name&&r.disabledUtc}))){console.log("Skipping disabled app ".concat(app_1.control.packageJson.name));return[2,"continue"]}return[4,app_1.control.build()];case 1:_d.sent();return[4,app_1.control.upload(env,true)];case 2:_d.sent();return[2]}}))};_i=0,apps_1=apps;_c.label=2;case 2:if(!(_i<apps_1.length))return[3,5];app_1=apps_1[_i];return[5,_loop_1(app_1)];case 3:_c.sent();_c.label=4;case 4:_i++;return[3,2];case 5:return[2]}}))}))}function applySettings(manifest){return __awaiter(this,void 0,void 0,(function(){function collect(obj,path){if(Array.isArray(obj)){obj.forEach((function(r){Object.keys(r).forEach((function(key){values.push({container:path.join("/"),key,value:r[key]})}))}))}else if(typeof obj==="object"){for(var key in obj){collect(obj[key],__spreadArray(__spreadArray([],path,true),[key],false))}}}var env,values;return __generator(this,(function(_a){switch(_a.label){case 0:if(!manifest.settings)return[2];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;values=[];collect(manifest.settings,[]);return[4,remote$1.importSettings(env,manifest.clearSettings,values)];case 1:_a.sent();return[2]}}))}))}function applyComponents(manifest){return __awaiter(this,void 0,void 0,(function(){var env,baseDir,_i,_a,component,source;return __generator(this,(function(_b){switch(_b.label){case 0:if(!manifest.components)return[2,true];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;baseDir=path.dirname(manifestPath);_i=0,_a=manifest.components;_b.label=1;case 1:if(!(_i<_a.length))return[3,4];component=_a[_i];source=fs.readFileSync(path.join(baseDir,component.file),"utf8");return[4,remote$1.saveComponent(env,component.id,source)];case 2:if(!_b.sent()){return[2,false]}_b.label=3;case 3:_i++;return[3,1];case 4:return[2,true]}}))}))}function validateComponents(manifest){return __awaiter(this,void 0,void 0,(function(){var env,baseDir,_i,_a,component,source;return __generator(this,(function(_b){switch(_b.label){case 0:if(!manifest.components)return[2,true];env=envOverride!==null&&envOverride!==void 0?envOverride:manifest.env;baseDir=path.dirname(manifestPath);_i=0,_a=manifest.components;_b.label=1;case 1:if(!(_i<_a.length))return[3,4];component=_a[_i];source=fs.readFileSync(path.join(baseDir,component.file),"utf8");return[4,remote$1.validateComponent(env,component.id,source)];case 2:if(!_b.sent()){return[2,false]}_b.label=3;case 3:_i++;return[3,1];case 4:return[2,true]}}))}))}}var __dirname=url.fileURLToPath(new URL(".",import.meta.url));var json=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),"utf-8"));var version=json.version;function create(){return __awaiter(this,void 0,void 0,(function(){var id,input,description,componentsDir;return __generator(this,(function(_a){switch(_a.label){case 0:if(fs.existsSync(path.join(process.cwd(),"package.json"))){console.log(chalk.red("'package.json' already exists. Run 'create' in an empty folder."));return[2]}id=path.parse(process.cwd()).base;return[4,readline.question("App id [".concat(id,"]:"))];case 1:input=_a.sent();if(input){id=input}return[4,readline.question("Description []:")];case 2:description=_a.sent();fs.writeFileSync(path.join(process.cwd(),"package.json"),'{\n "name": "'.concat(id,'",\n "description": "').concat(description,'",\n "author": {\n "name": "').concat(os.userInfo().username,'"\n },\n "version": "1.0.0",\n "main": "index.ts",\n "type": "module",\n "dependencies": {\n "@hantera/portal-app": "').concat(version,'",\n "vue": "^3.3.4"\n }\n}\n'));fs.writeFileSync(path.join(process.cwd(),"tsconfig.json"),'{\n "compilerOptions": {\n "target": "ESNext",\n "useDefineForClassFields": true,\n "module": "ESNext",\n "moduleResolution": "Node",\n "strict": true,\n "jsx": "preserve",\n "sourceMap": true,\n "resolveJsonModule": true,\n "isolatedModules": true,\n "esModuleInterop": true,\n "lib": ["ESNext", "DOM"],\n "skipLibCheck": true\n },\n "include": ["./**/*.ts", "./**/*.d.ts", "./**/*.tsx", "./**/*.vue"]\n}\n');fs.writeFileSync(path.join(process.cwd(),"index.ts"),"import { Portal, StandardSlots } from '@hantera/portal-app';\nimport MyComponent from './components/MyComponent.vue';\n\nexport default function(portal: Portal) {\n portal.registerComponent(StandardSlots.order.delivery.footer, MyComponent);\n}\n");componentsDir=path.join(process.cwd(),"components");if(!fs.existsSync(componentsDir)){fs.mkdirSync(componentsDir,484)}fs.writeFileSync(path.join(componentsDir,"MyComponent.vue"),"<script setup lang=\"ts\">\nimport { inject } from 'vue';\nimport { deliveryKey, models } from '@hantera/portal-app';\n\nconst delivery = inject<models.Delivery>(deliveryKey);\n<\/script>\n\n<template>\n Current delivery number: {{ delivery?.deliveryNumber }}\n</template>\n");fs.writeFileSync(path.join(process.cwd(),".gitignore"),".hantera/\nnode_modules/\n");console.log(chalk.green("App created. Now run 'h_ dev' to test it."));return[2]}}))}))}function login(env,email,password){return __awaiter(this,void 0,void 0,(function(){var serverUrl,response,payload;return __generator(this,(function(_a){switch(_a.label){case 0:env=env.replace(/[^A-Za-z0-9-]/,"");console.log("Logging in to '".concat(env,"'..."));if(!!email)return[3,2];return[4,readline.question("E-mail:")];case 1:email=_a.sent();_a.label=2;case 2:if(!!password)return[3,4];return[4,readline.question("Password:",{hideEchoBack:true})];case 3:password=_a.sent();_a.label=4;case 4:serverUrl=null;if(env==="localhost"){serverUrl="http://localhost:3100"}else{serverUrl="https://".concat(env,".portal.ams.hantera.cloud")}return[4,fetch("".concat(serverUrl,"/token"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email,password})})];case 5:response=_a.sent();if(!response.ok)return[3,7];return[4,response.json()];case 6:payload=_a.sent();config.environments[env]={token:payload.token,displayName:payload.instanceName};config.save();console.log(chalk.green("Logged in successfully"));return[3,8];case 7:console.log(chalk.red("Environment, e-mail and/or password incorrect"));_a.label=8;case 8:return[2]}}))}))}function logout(env){console.log("Logging out from '".concat(env,"'..."));delete config.environments[env];config.save();console.log(chalk.green("Logged out successfully"))}function listEnvironments(){var table=new AsciiTable3;table.setHeading("id","name","E-mail","Expires");for(var env in config.environments){var _a=config.environments[env].token.split(".");_a[0];var payloadRaw=_a[1];_a[2];var buff=Buffer.from(payloadRaw,"base64");var payload=JSON.parse(buff.toString("ascii"));table.addRow(env,config.environments[env].displayName,payload.email,timeConverter(payload.exp))}console.log(table.toString())}function timeConverter(UNIX_timestamp){var a=new Date(UNIX_timestamp*1e3);var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var year=a.getFullYear();var month=months[a.getMonth()];var date=a.getDate();var hour=a.getHours();var min=a.getMinutes();var sec=a.getSeconds();var time=date+" "+month+" "+year+" "+hour+":"+min+":"+sec;return time}yargs(hideBin(process.argv)).scriptName("h_").showHelpOnFail(true).demandCommand().command("create","Create a new app in the current folder",(function(yargs){return yargs}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){return __generator(this,(function(_a){switch(_a.label){case 0:return[4,create()];case 1:_a.sent();return[2]}}))}))})).command("install [-e env] [path]","Build and install the app",(function(yargs){return configurePath(yargs).option("environment",{alias:"e",type:"string",description:"The environment to install to, if not specified current environment will be used",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var a,env;return __generator(this,(function(_a){switch(_a.label){case 0:a=app(args["path"]);if(!a){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,a.build()];case 1:_a.sent();return[4,a.upload(env)];case 2:_a.sent();return[2]}}))}))})).command("deactivate [-e env] <id>","Deactivates the specified app",(function(yargs){return configurePath(yargs).option("environment",{alias:"e",type:"string",description:"The environment to deactivate in, if not specified current environment will be used",demandOption:false}).positional("id",{type:"string",description:"The ID of the app to deactivate",demandOption:true})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,r.deactivateApp(env,args.id)];case 1:_a.sent();return[2]}}))}))})).command("activate [-e env] [-v version] <id>","Activates an installed app. Could be a previous version or a deactivated app.",(function(yargs){return yargs.version(false).option("environment",{alias:"e",type:"string",description:"The environment to install to, if not specified current environment will be used",demandOption:false}).option("version",{alias:"v",type:"string",description:"Optionally specify the version to activate. If not set, the latest installed version will be activated.",demandOption:false}).positional("id",{type:"string",description:"The ID of the app to activate",demandOption:true})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,r.activateApp(env,args.id,args.version)];case 1:_a.sent();return[2]}}))}))})).command("list [id]","Lists installed apps",(function(yargs){return yargs.option("env",{alias:"e",type:"string",default:config.currentEnvironment,description:"The environment to install to, if not specified current environment will be used",demandOption:false}).positional("id",{type:"string",description:"If specified, will fetch all detailed information about the app including all installed versions",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var r,env;return __generator(this,(function(_a){switch(_a.label){case 0:r=remote();if(!r){return[2]}env=args["env"];if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"));return[2]}if(!args.id)return[3,2];return[4,r.appDetails(env,args.id)];case 1:_a.sent();return[3,4];case 2:return[4,r.listApps(env)];case 3:_a.sent();_a.label=4;case 4:return[2]}}))}))})).command("dev [path]","Run in local development mode",(function(yargs){return configurePath(yargs)}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var a;return __generator(this,(function(_a){switch(_a.label){case 0:a=app(args["path"]);if(!a){return[2]}return[4,a.dev()];case 1:_a.sent();return[2]}}))}))})).command("use [environment]","Gets or sets the default environment",(function(yargs){return yargs.positional("environment",{alias:"e",type:"string",description:"The environment to use",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){return __generator(this,(function(_a){if(!args["environment"]){console.log("Current environment: ".concat(chalk.bold(config.currentEnvironment)));return[2]}config.currentEnvironment=args.environment;config.save();console.log("Current environment set to '".concat(args.environment,"'"));return[2]}))}))})).command("login [-e env] [-u email] [-p password]","Log in to the current or specified environment",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"The environment to login to, if not specified current environment will be used",demandOption:false}).option("email",{alias:"u",type:"string",demandOption:false}).option("password",{alias:"p",type:"string",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var env;return __generator(this,(function(_a){switch(_a.label){case 0:env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,login(env,args.email,args.password)];case 1:_a.sent();return[2]}}))}))})).command("logout [-e env]","Log out from the current or specified environment",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"The environment to logout of, if not specified current environment will be used",demandOption:false})}),(function(args){return __awaiter(void 0,void 0,void 0,(function(){var env;return __generator(this,(function(_a){switch(_a.label){case 0:env=args.environment;if(!env){env=config.currentEnvironment}if(!env){console.log(chalk.red("No environment specified. Either pass '-e' option or use 'h_ use'"))}return[4,logout(env)];case 1:_a.sent();return[2]}}))}))})).command(["apply [-e env] <file>"],"Applies a manifest file",(function(yargs){return yargs.option("environment",{alias:"e",type:"string",description:"Overrides the 'env' specified in the manifest file",demandOption:false}).positional("file",{type:"string",description:"The manifest file to apply",demandOption:true})}),(function(args){try{var m=manifest(args.file,args.environment);m.apply()}catch(e){console.log(chalk.red(e))}})).command(["environments","envs"],"Lists all logged in environments",(function(yargs){return yargs}),(function(args){listEnvironments()})).strict().parse();function configurePath(yargs){yargs.positional("path",{default:".",describe:"Local path to the app",type:"string"});return yargs}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hantera/cli",
3
- "version": "20240403.4.0",
3
+ "version": "20240403.5.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {