@getjusto/team-cli 0.0.6 → 0.0.8

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/bin/cli.js +104 -73
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- function L(e){let t=[],o={},r={};for(let a=0;a<e.length;a++)if(e[a].startsWith("--")&&e[a+1]&&!e[a+1].startsWith("--")){let i=e[a].slice(2);if(o[i]=e[a+1],!r[i])r[i]=[];r[i].push(e[a+1]),a++}else if(e[a].startsWith("--"))o[e[a].slice(2)]="true";else t.push(e[a]);return{positional:t,flags:o,arrayFlags:r}}function G(e,t){let o=e[t];if(!o)throw Error(`--${t} es requerido.`);return o}var Oo={comma:",",tab:"\t",pipe:"|"},H=Oo.comma;function We(e){return e.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function To(e){return e==="true"||e==="false"||e==="null"}function E(e){if(e===null)return null;if(typeof e==="object"&&e!==null&&"toJSON"in e&&typeof e.toJSON==="function"){let t=e.toJSON();if(t!==e)return E(t)}if(typeof e==="string"||typeof e==="boolean")return e;if(typeof e==="number"){if(Object.is(e,-0))return 0;if(!Number.isFinite(e))return null;return e}if(typeof e==="bigint"){if(e>=Number.MIN_SAFE_INTEGER&&e<=Number.MAX_SAFE_INTEGER)return Number(e);return e.toString()}if(e instanceof Date)return e.toISOString();if(Array.isArray(e))return e.map(E);if(e instanceof Set)return Array.from(e).map(E);if(e instanceof Map)return Object.fromEntries(Array.from(e,([t,o])=>[String(t),E(o)]));if(Uo(e)){let t={};for(let o in e)if(Object.prototype.hasOwnProperty.call(e,o))t[o]=E(e[o]);return t}return null}function U(e){return e===null||typeof e==="string"||typeof e==="number"||typeof e==="boolean"}function O(e){return Array.isArray(e)}function q(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function P(e){return Object.keys(e).length===0}function Uo(e){if(e===null||typeof e!=="object")return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function F(e){return e.length===0||e.every((t)=>U(t))}function Qo(e){return e.length===0||e.every((t)=>O(t))}function Me(e){return e.length===0||e.every((t)=>q(t))}function Jo(e){return/^[A-Z_][\w.]*$/i.test(e)}function Wo(e){return/^[A-Z_]\w*$/i.test(e)}function Mo(e,t=H){if(!e)return!1;if(e!==e.trim())return!1;if(To(e)||_o(e))return!1;if(e.includes(":"))return!1;if(e.includes('"')||e.includes("\\"))return!1;if(/[[\]{}]/.test(e))return!1;if(/[\n\r\t]/.test(e))return!1;if(e.includes(t))return!1;if(e.startsWith("-"))return!1;return!0}function _o(e){return/^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(e)||/^0\d+$/.test(e)}var Aa=Symbol("quotedKey");function Bo(e,t,o,r,a,i,n){if(r.keyFolding!=="safe")return;if(!q(t))return;let{segments:s,tail:c,leafValue:u}=Go(e,t,n??r.flattenDepth);if(s.length<2)return;if(!s.every((p)=>Wo(p)))return;let l=Po(s),g=i?`${i}.${l}`:l;if(o.includes(l))return;if(a&&a.has(g))return;return{foldedKey:l,remainder:c,leafValue:u,segmentCount:s.length}}function Go(e,t,o){let r=[e],a=t;while(r.length<o){if(!q(a))break;let i=Object.keys(a);if(i.length!==1)break;let n=i[0],s=a[n];r.push(n),a=s}if(!q(a)||P(a))return{segments:r,tail:void 0,leafValue:a};return{segments:r,tail:a,leafValue:a}}function Po(e){return e.join(".")}function W(e,t){if(e===null)return"null";if(typeof e==="boolean")return String(e);if(typeof e==="number")return String(e);return Fo(e,t)}function Fo(e,t=H){if(Mo(e,t))return e;return`"${We(e)}"`}function X(e){if(Jo(e))return e;return`"${We(e)}"`}function _e(e,t=H){return e.map((o)=>W(o,t)).join(t)}function j(e,t){let o=t?.key,r=t?.fields,a=t?.delimiter??",",i="";if(o)i+=X(o);if(i+=`[${e}${a!==H?a:""}]`,r){let n=r.map((s)=>X(s));i+=`{${n.join(a)}}`}return i+=":",i}function*Xo(e,t,o){if(U(e)){let r=W(e,t.delimiter);if(r!=="")yield r;return}if(O(e))yield*fe(void 0,e,o,t);else if(q(e))yield*J(e,o,t)}function*J(e,t,o,r,a,i){let n=Object.keys(e);if(t===0&&!r)r=new Set(n.filter((c)=>c.includes(".")));let s=i??o.flattenDepth;for(let[c,u]of Object.entries(e))yield*Ho(c,u,t,o,n,r,a,s)}function*Ho(e,t,o,r,a,i,n,s){let c=n?`${n}.${e}`:e,u=s??r.flattenDepth;if(r.keyFolding==="safe"&&a){let g=Bo(e,t,a,r,i,n,u);if(g){let{foldedKey:p,remainder:C,leafValue:w,segmentCount:V}=g,Q=X(p);if(C===void 0){if(U(w)){yield b(o,`${Q}: ${W(w,r.delimiter)}`,r.indent);return}else if(O(w)){yield*fe(p,w,o,r);return}else if(q(w)&&P(w)){yield b(o,`${Q}:`,r.indent);return}}if(q(C)){yield b(o,`${Q}:`,r.indent);let v=u-V,B=n?`${n}.${p}`:p;yield*J(C,o+1,r,i,B,v);return}}}let l=X(e);if(U(t))yield b(o,`${l}: ${W(t,r.delimiter)}`,r.indent);else if(O(t))yield*fe(e,t,o,r);else if(q(t)){if(yield b(o,`${l}:`,r.indent),!P(t))yield*J(t,o+1,r,i,c,u)}}function*fe(e,t,o,r){if(t.length===0){yield b(o,j(0,{key:e,delimiter:r.delimiter}),r.indent);return}if(F(t)){yield b(o,te(t,r.delimiter,e),r.indent);return}if(Qo(t)){if(t.every((a)=>F(a))){yield*Yo(e,t,o,r);return}}if(Me(t)){let a=Be(t);if(a)yield*Zo(e,t,a,o,r);else yield*Je(e,t,o,r);return}yield*Je(e,t,o,r)}function*Yo(e,t,o,r){yield b(o,j(t.length,{key:e,delimiter:r.delimiter}),r.indent);for(let a of t)if(F(a)){let i=te(a,r.delimiter);yield h(o+1,i,r.indent)}}function te(e,t,o){let r=j(e.length,{key:o,delimiter:t}),a=_e(e,t);if(e.length===0)return r;return`${r} ${a}`}function*Zo(e,t,o,r,a){yield b(r,j(t.length,{key:e,fields:o,delimiter:a.delimiter}),a.indent),yield*Ge(t,o,r+1,a)}function Be(e){if(e.length===0)return;let t=e[0],o=Object.keys(t);if(o.length===0)return;if(Do(e,o))return o}function Do(e,t){for(let o of e){if(Object.keys(o).length!==t.length)return!1;for(let r of t){if(!(r in o))return!1;if(!U(o[r]))return!1}}return!0}function*Ge(e,t,o,r){for(let a of e)yield b(o,_e(t.map((i)=>a[i]),r.delimiter),r.indent)}function*Je(e,t,o,r){yield b(o,j(t.length,{key:e,delimiter:r.delimiter}),r.indent);for(let a of t)yield*we(a,o+1,r)}function*zo(e,t,o){if(P(e)){yield b(t,"-",o.indent);return}let r=Object.entries(e),[a,i]=r[0],n=r.slice(1);if(O(i)&&Me(i)){let c=Be(i);if(c){if(yield h(t,j(i.length,{key:a,fields:c,delimiter:o.delimiter}),o.indent),yield*Ge(i,c,t+2,o),n.length>0)yield*J(Object.fromEntries(n),t+1,o);return}}let s=X(a);if(U(i))yield h(t,`${s}: ${W(i,o.delimiter)}`,o.indent);else if(O(i))if(i.length===0)yield h(t,`${s}${j(0,{delimiter:o.delimiter})}`,o.indent);else if(F(i))yield h(t,`${s}${te(i,o.delimiter)}`,o.indent);else{yield h(t,`${s}${j(i.length,{delimiter:o.delimiter})}`,o.indent);for(let c of i)yield*we(c,t+2,o)}else if(q(i)){if(yield h(t,`${s}:`,o.indent),!P(i))yield*J(i,t+2,o)}if(n.length>0)yield*J(Object.fromEntries(n),t+1,o)}function*we(e,t,o){if(U(e))yield h(t,W(e,o.delimiter),o.indent);else if(O(e))if(F(e))yield h(t,te(e,o.delimiter),o.indent);else{yield h(t,j(e.length,{delimiter:o.delimiter}),o.indent);for(let r of e)yield*we(r,t+1,o)}else if(q(e))yield*zo(e,t,o)}function b(e,t,o){return" ".repeat(o*e)+t}function h(e,t,o){return b(e,"- "+t,o)}function ko(e,t){let o=t("",e,[]);if(o===void 0)return ee(e,t,[]);return ee(E(o),t,[])}function ee(e,t,o){if(q(e))return Ko(e,t,o);if(O(e))return Vo(e,t,o);return e}function Ko(e,t,o){let r={};for(let[a,i]of Object.entries(e)){let n=[...o,a],s=t(a,i,n);if(s===void 0)continue;r[a]=ee(E(s),t,n)}return r}function Vo(e,t,o){let r=[];for(let a=0;a<e.length;a++){let i=e[a],n=[...o,a],s=t(String(a),i,n);if(s===void 0)continue;let c=E(s);r.push(ee(c,t,n))}return r}function be(e,t){return Array.from(Lo(e,t)).join(`
3
- `)}function Lo(e,t){let o=E(e),r=er(t);return Xo(r.replacer?ko(o,r.replacer):o,r,0)}function er(e){return{indent:e?.indent??2,delimiter:e?.delimiter??H,keyFolding:e?.keyFolding??"off",flattenDepth:e?.flattenDepth??Number.POSITIVE_INFINITY,replacer:e?.replacer}}function tr(e){let t=e.format??"toon";if(t!=="toon"&&t!=="json")throw Error("--format debe ser toon o json.");return t}function Pe(e,t){if(tr(t)==="json"){console.log(JSON.stringify(e,null,2));return}console.log(be(e))}function Fe(e){process.stdout.write(`${e}
4
- `)}function Xe(e,t){let r={ok:!1,error:e instanceof Error?e.message:String(e)};if((t.format==="json"?"json":"toon")==="json"){console.error(JSON.stringify(r,null,2));return}console.error(be(r))}function y(e){process.stderr.write(e)}import{existsSync as ae,mkdirSync as ar,readFileSync as Ye,writeFileSync as ir,unlinkSync as nr}from"node:fs";import{join as Ze}from"node:path";import{homedir as sr}from"node:os";import{AsyncLocalStorage as or}from"node:async_hooks";var rr=new or;function I(){return rr.getStore()}var oe={main:{local:"http://localhost:3000",develop:"https://api.bejusto.com",prod:"https://api.getjusto.com"},auth:{local:"http://localhost:4112",develop:"https://auth.service.bejusto.com",prod:"https://auth.service.getjusto.com"},webdata:{local:"http://localhost:4125",develop:"https://webdata.service.bejusto.com",prod:"https://webdatacdn.getjusto.com"},preferences:{local:"http://localhost:4120",develop:"https://preferences.service.bejusto.com",prod:"https://preferences.service.getjusto.com"},buckets:{local:"http://localhost:4106",develop:"https://buckets.service.bejusto.com",prod:"https://buckets.service.getjusto.com"},reservations:{local:"http://localhost:4113",develop:"https://reservations.service.bejusto.com",prod:"https://reservations.service.getjusto.com"},data:{local:"http://localhost:4107",develop:"https://data.service.bejusto.com",prod:"https://data.service.getjusto.com"},finances:{local:"http://localhost:4105",develop:"https://finances.service.bejusto.com",prod:"https://finances.service.getjusto.com"},"url-shortener":{local:"http://localhost:4102",develop:"https://url-shortener.service.bejusto.com",prod:"https://url-shortener.service.getjusto.com"},files:{local:"http://localhost:4108",develop:"https://files.service.bejusto.com",prod:"https://files.service.getjusto.com"},tabs:{local:"http://localhost:4115",develop:"https://tabs.service.bejusto.com",prod:"https://tabs.service.getjusto.com"},commander:{local:"http://localhost:4109",develop:"https://commander.service.bejusto.com",prod:"https://commander.service.getjusto.com"},experiments:{local:"http://localhost:4114",develop:"https://experiments.service.bejusto.com",prod:"https://experiments.service.getjusto.com"},sales:{local:"http://localhost:4117",develop:"https://sales.service.bejusto.com",prod:"https://sales.service.getjusto.com"},delivery:{local:"http://localhost:3410",develop:"https://api-delivery.bejusto.com",prod:"https://api-delivery-2.getjusto.com"},payments:{local:"http://localhost:4118",develop:"https://payments.service.bejusto.com",prod:"https://payments.service.getjusto.com"},addresses:{local:"http://localhost:4051",develop:"https://addresses.service.bejusto.com",prod:"https://addresses.service.getjusto.com"},royalty:{local:"http://localhost:4121",develop:"https://royalty.service.bejusto.com",prod:"https://royalty.service.getjusto.com"},marketing:{local:"http://localhost:4005",develop:"https://marketing.service.bejusto.com",prod:"https://marketing.service.getjusto.com"},api:{local:"http://localhost:4119",develop:"https://api.service.bejusto.com",prod:"https://api.service.getjusto.com"},messenger:{local:"http://localhost:4122",develop:"https://messenger.service.bejusto.com",prod:"https://messenger.service.getjusto.com"},invoice:{local:"http://localhost:4123",develop:"https://invoice.service.bejusto.com",prod:"https://invoice.service.getjusto.com"},"drivers-server":{local:"http://localhost:3410",develop:"https://api-delivery.bejusto.com",prod:"https://api-delivery-2.getjusto.com"}},ye="prod";function He(e){ye=e}function re(){let e=process.env.JUSTO_TEAM_CLI_ENV;if(e)return e;let t=I()?.environment;if(t)return t;return ye}function $(e){return oe[e][ye]}var Ce=Ze(sr(),".justo-team");function De(e){let t=e==="prod"?"credentials.json":`credentials.${e}.json`;return Ze(Ce,t)}function qe(){return De(re())}function cr(){if(!ae(Ce))ar(Ce,{recursive:!0})}function ie(e){let t=I();if(t&&t.canPersistCredentials===!1)throw Error("Este entorno no permite guardar credenciales.");cr(),ir(qe(),JSON.stringify(e,null,2))}function d(){let e=process.env.JUSTO_TEAM_CLI_TOKEN,t=process.env.JUSTO_TEAM_CLI_EMAIL,o=process.env.JUSTO_TEAM_CLI_REFRESH_TOKEN;if(e&&t)return{email:t,token:e,refreshToken:o||""};let r=I()?.credentials;if(r!==void 0)return r?{email:r.email,token:r.token,refreshToken:r.refreshToken||""}:null;let a=qe();if(!ae(a))return null;try{let i=Ye(a,"utf-8");return JSON.parse(i)}catch{return null}}function ze(e){let t=De(e);if(!ae(t))return null;try{let o=Ye(t,"utf-8");return JSON.parse(o)}catch{return null}}function Ie(){let e=I();if(e&&e.canPersistCredentials===!1)throw Error("Este entorno no permite borrar credenciales.");let t=qe();if(ae(t))nr(t)}import{existsSync as ke,readFileSync as mr,writeFileSync as ur,mkdirSync as lr}from"node:fs";import{join as Ke}from"node:path";import{homedir as dr}from"node:os";function pr(){let e=process.env.JUSTO_TEAM_CLI_DEVICE_ID;if(e)return e;let t=I()?.deviceId;if(t)return t;let o=Ke(dr(),".justo-team"),r=Ke(o,"device-id");if(ke(r))return mr(r,"utf-8").trim();let a=crypto.randomUUID();if(!ke(o))lr(o,{recursive:!0});return ur(r,a),a}var Le={required:({label:e})=>`${e} no es opcional`,notAString:({label:e})=>`${e} no es un texto`,notANumber:({label:e})=>`${e} no es un número`,notAnInteger:({label:e})=>`${e} no es un número entero`,notABoolean:({label:e})=>`${e} no es un valor verdadero o falso`,notAnEmail:({label:e})=>`${e} no es un email`,notAnId:({label:e})=>`${e} no es un ID válido`,notADate:({label:e})=>`${e} no es una fecha válida`,notAnArray:({label:e})=>`${e} no es un arreglo`,notAnObject:({label:e})=>`${e} no es un objeto`,stringTooShort:({label:e})=>`${e} no tiene el largo suficiente`,stringTooLong:"El largo es mayor al permitido",numberTooSmall:({label:e})=>`${e} es un número muy pequeño`,numberTooBig:({label:e})=>`${e} es un número muy grande`,notInSchema:({label:e})=>`${e} no esta permitido`,notUnique:({label:e})=>`${e} no es único`,notFound:({label:e})=>`${e} no se encontró`,invalid:"No es válido",rateLimitExceeded:"Has excedido el límite de intentos. Intenta de nuevo más tarde.",incorrectLoginCode:"El código es incorrecto",loginCodeExpired:"El código expiró. Solicita un nuevo",loginCodeLocked:"El código se bloqueó. Genera un nuevo código para continuar",userNotFound:"No existe una cuenta con este email"};function gr(e,t){let o=Le[e];if(!o)return`${t}: ${e}`;if(typeof o==="function")return o({label:t});return o}function Ve(e){return Object.entries(e).map(([t,o])=>gr(o,t)).join(", ")}function fr(e){if(e.error==="validationError"&&e.validationErrors)return Ve(e.validationErrors);if(e.extensions?.code==="PermissionsError"){let a=e.extensions.info?.type;if(a?.includes("User doesn't have permissions for "))return`Tu usuario no tiene permisos para [${a.split("User doesn't have permissions for ")[1]}]`;return e.message}if(e.validationErrors)return`${e.message} (${Ve(e.validationErrors)})`;let t=e.message||"Error desconocido",o=Le[t];if(o)return typeof o==="function"?o({label:""}).trim():o;let r=e.error||e.code||e.type;return r?`${t} [${r}]`:t}function wr(e){try{return JSON.parse(Buffer.from(e.split(".")[1],"base64").toString()).exp*1000<Date.now()}catch{return!0}}async function br(){let e=d();if(!e?.refreshToken)return null;let t=`${$("auth")}/refresh-token`,r=await(await fetch(t,{method:"POST",headers:{"X-ORION-REFRESH":e.refreshToken}})).json();if(!r.token)return null;if(I()?.canPersistCredentials!==!1)ie({...e,token:r.token});return r.token}async function $e(){let e=d();if(!e?.token)return;if(!wr(e.token))return e.token;return await br()??void 0}async function xe(e="application/json"){let t=await $e(),o={"Content-Type":e,"X-ORION-DEVICEID":pr(),"X-ORION-PLATFORM":"web"};if(t)o["x-orion-jwt"]=t;return o}async function m(e){let t=`${$(e.service)}/graphql`,o=await xe(),r;try{r=await fetch(t,{method:"POST",headers:o,body:JSON.stringify({query:e.query,variables:e.variables}),signal:AbortSignal.timeout(15000)})}catch{throw Error("La solicitud tardó demasiado. Intenta de nuevo.")}let a=await r.json();if(a.errors?.length)throw Error(fr(a.errors[0]));if(!a.data)throw Error("No data returned from server");return a.data}function yr(e){return e.replace(/^https?:\/\//,"").replace(/^www\./,"").replace(/\/.*$/,"")}function Cr(e){return e.includes(".")||e.startsWith("http://")||e.startsWith("https://")}async function M(e){if(Cr(e)){let t=yr(e),o=await fetch(`${$("main")}/website-id/${t}`,{signal:AbortSignal.timeout(1e4)});if(!o.ok)throw Error(`No se encontro el sitio "${t}"`);let r=await o.json();if(!r.websiteId)throw Error(`No se pudo resolver el websiteId para "${t}"`);return{input:e,websiteId:r.websiteId,targetType:"domain"}}return{input:e,websiteId:e,targetType:"websiteId"}}async function et(e){let t=await m({service:"main",query:`query ($websiteId: ID) {
2
+ function oe(e){let t=[],r={},o={};for(let a=0;a<e.length;a++)if(e[a].startsWith("--")&&e[a+1]&&!e[a+1].startsWith("--")){let n=e[a].slice(2);if(r[n]=e[a+1],!o[n])o[n]=[];o[n].push(e[a+1]),a++}else if(e[a].startsWith("--"))r[e[a].slice(2)]="true";else t.push(e[a]);return{positional:t,flags:r,arrayFlags:o}}function F(e,t){let r=e[t];if(!r)throw Error(`--${t} es requerido.`);return r}var Br={comma:",",tab:"\t",pipe:"|"},Y=Br.comma;function Xe(e){return e.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function Mr(e){return e==="true"||e==="false"||e==="null"}function E(e){if(e===null)return null;if(typeof e==="object"&&e!==null&&"toJSON"in e&&typeof e.toJSON==="function"){let t=e.toJSON();if(t!==e)return E(t)}if(typeof e==="string"||typeof e==="boolean")return e;if(typeof e==="number"){if(Object.is(e,-0))return 0;if(!Number.isFinite(e))return null;return e}if(typeof e==="bigint"){if(e>=Number.MIN_SAFE_INTEGER&&e<=Number.MAX_SAFE_INTEGER)return Number(e);return e.toString()}if(e instanceof Date)return e.toISOString();if(Array.isArray(e))return e.map(E);if(e instanceof Set)return Array.from(e).map(E);if(e instanceof Map)return Object.fromEntries(Array.from(e,([t,r])=>[String(t),E(r)]));if(Pr(e)){let t={};for(let r in e)if(Object.prototype.hasOwnProperty.call(e,r))t[r]=E(e[r]);return t}return null}function U(e){return e===null||typeof e==="string"||typeof e==="number"||typeof e==="boolean"}function T(e){return Array.isArray(e)}function q(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function X(e){return Object.keys(e).length===0}function Pr(e){if(e===null||typeof e!=="object")return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function H(e){return e.length===0||e.every((t)=>U(t))}function Gr(e){return e.length===0||e.every((t)=>T(t))}function He(e){return e.length===0||e.every((t)=>q(t))}function Fr(e){return/^[A-Z_][\w.]*$/i.test(e)}function Xr(e){return/^[A-Z_]\w*$/i.test(e)}function Hr(e,t=Y){if(!e)return!1;if(e!==e.trim())return!1;if(Mr(e)||Zr(e))return!1;if(e.includes(":"))return!1;if(e.includes('"')||e.includes("\\"))return!1;if(/[[\]{}]/.test(e))return!1;if(/[\n\r\t]/.test(e))return!1;if(e.includes(t))return!1;if(e.startsWith("-"))return!1;return!0}function Zr(e){return/^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(e)||/^0\d+$/.test(e)}var Ha=Symbol("quotedKey");function Yr(e,t,r,o,a,n,i){if(o.keyFolding!=="safe")return;if(!q(t))return;let{segments:s,tail:c,leafValue:m}=Dr(e,t,i??o.flattenDepth);if(s.length<2)return;if(!s.every((p)=>Xr(p)))return;let l=zr(s),g=n?`${n}.${l}`:l;if(r.includes(l))return;if(a&&a.has(g))return;return{foldedKey:l,remainder:c,leafValue:m,segmentCount:s.length}}function Dr(e,t,r){let o=[e],a=t;while(o.length<r){if(!q(a))break;let n=Object.keys(a);if(n.length!==1)break;let i=n[0],s=a[i];o.push(i),a=s}if(!q(a)||X(a))return{segments:o,tail:void 0,leafValue:a};return{segments:o,tail:a,leafValue:a}}function zr(e){return e.join(".")}function B(e,t){if(e===null)return"null";if(typeof e==="boolean")return String(e);if(typeof e==="number")return String(e);return kr(e,t)}function kr(e,t=Y){if(Hr(e,t))return e;return`"${Xe(e)}"`}function Z(e){if(Fr(e))return e;return`"${Xe(e)}"`}function Ze(e,t=Y){return e.map((r)=>B(r,t)).join(t)}function j(e,t){let r=t?.key,o=t?.fields,a=t?.delimiter??",",n="";if(r)n+=Z(r);if(n+=`[${e}${a!==Y?a:""}]`,o){let i=o.map((s)=>Z(s));n+=`{${i.join(a)}}`}return n+=":",n}function*Kr(e,t,r){if(U(e)){let o=B(e,t.delimiter);if(o!=="")yield o;return}if(T(e))yield*he(void 0,e,r,t);else if(q(e))yield*_(e,r,t)}function*_(e,t,r,o,a,n){let i=Object.keys(e);if(t===0&&!o)o=new Set(i.filter((c)=>c.includes(".")));let s=n??r.flattenDepth;for(let[c,m]of Object.entries(e))yield*Vr(c,m,t,r,i,o,a,s)}function*Vr(e,t,r,o,a,n,i,s){let c=i?`${i}.${e}`:e,m=s??o.flattenDepth;if(o.keyFolding==="safe"&&a){let g=Yr(e,t,a,o,n,i,m);if(g){let{foldedKey:p,remainder:C,leafValue:w,segmentCount:re}=g,W=Z(p);if(C===void 0){if(U(w)){yield b(r,`${W}: ${B(w,o.delimiter)}`,o.indent);return}else if(T(w)){yield*he(p,w,r,o);return}else if(q(w)&&X(w)){yield b(r,`${W}:`,o.indent);return}}if(q(C)){yield b(r,`${W}:`,o.indent);let R=m-re,G=i?`${i}.${p}`:p;yield*_(C,r+1,o,n,G,R);return}}}let l=Z(e);if(U(t))yield b(r,`${l}: ${B(t,o.delimiter)}`,o.indent);else if(T(t))yield*he(e,t,r,o);else if(q(t)){if(yield b(r,`${l}:`,o.indent),!X(t))yield*_(t,r+1,o,n,c,m)}}function*he(e,t,r,o){if(t.length===0){yield b(r,j(0,{key:e,delimiter:o.delimiter}),o.indent);return}if(H(t)){yield b(r,ne(t,o.delimiter,e),o.indent);return}if(Gr(t)){if(t.every((a)=>H(a))){yield*Lr(e,t,r,o);return}}if(He(t)){let a=Ye(t);if(a)yield*eo(e,t,a,r,o);else yield*Fe(e,t,r,o);return}yield*Fe(e,t,r,o)}function*Lr(e,t,r,o){yield b(r,j(t.length,{key:e,delimiter:o.delimiter}),o.indent);for(let a of t)if(H(a)){let n=ne(a,o.delimiter);yield x(r+1,n,o.indent)}}function ne(e,t,r){let o=j(e.length,{key:r,delimiter:t}),a=Ze(e,t);if(e.length===0)return o;return`${o} ${a}`}function*eo(e,t,r,o,a){yield b(o,j(t.length,{key:e,fields:r,delimiter:a.delimiter}),a.indent),yield*De(t,r,o+1,a)}function Ye(e){if(e.length===0)return;let t=e[0],r=Object.keys(t);if(r.length===0)return;if(to(e,r))return r}function to(e,t){for(let r of e){if(Object.keys(r).length!==t.length)return!1;for(let o of t){if(!(o in r))return!1;if(!U(r[o]))return!1}}return!0}function*De(e,t,r,o){for(let a of e)yield b(r,Ze(t.map((n)=>a[n]),o.delimiter),o.indent)}function*Fe(e,t,r,o){yield b(r,j(t.length,{key:e,delimiter:o.delimiter}),o.indent);for(let a of t)yield*$e(a,r+1,o)}function*ro(e,t,r){if(X(e)){yield b(t,"-",r.indent);return}let o=Object.entries(e),[a,n]=o[0],i=o.slice(1);if(T(n)&&He(n)){let c=Ye(n);if(c){if(yield x(t,j(n.length,{key:a,fields:c,delimiter:r.delimiter}),r.indent),yield*De(n,c,t+2,r),i.length>0)yield*_(Object.fromEntries(i),t+1,r);return}}let s=Z(a);if(U(n))yield x(t,`${s}: ${B(n,r.delimiter)}`,r.indent);else if(T(n))if(n.length===0)yield x(t,`${s}${j(0,{delimiter:r.delimiter})}`,r.indent);else if(H(n))yield x(t,`${s}${ne(n,r.delimiter)}`,r.indent);else{yield x(t,`${s}${j(n.length,{delimiter:r.delimiter})}`,r.indent);for(let c of n)yield*$e(c,t+2,r)}else if(q(n)){if(yield x(t,`${s}:`,r.indent),!X(n))yield*_(n,t+2,r)}if(i.length>0)yield*_(Object.fromEntries(i),t+1,r)}function*$e(e,t,r){if(U(e))yield x(t,B(e,r.delimiter),r.indent);else if(T(e))if(H(e))yield x(t,ne(e,r.delimiter),r.indent);else{yield x(t,j(e.length,{delimiter:r.delimiter}),r.indent);for(let o of e)yield*$e(o,t+1,r)}else if(q(e))yield*ro(e,t,r)}function b(e,t,r){return" ".repeat(r*e)+t}function x(e,t,r){return b(e,"- "+t,r)}function oo(e,t){let r=t("",e,[]);if(r===void 0)return ae(e,t,[]);return ae(E(r),t,[])}function ae(e,t,r){if(q(e))return ao(e,t,r);if(T(e))return no(e,t,r);return e}function ao(e,t,r){let o={};for(let[a,n]of Object.entries(e)){let i=[...r,a],s=t(a,n,i);if(s===void 0)continue;o[a]=ae(E(s),t,i)}return o}function no(e,t,r){let o=[];for(let a=0;a<e.length;a++){let n=e[a],i=[...r,a],s=t(String(a),n,i);if(s===void 0)continue;let c=E(s);o.push(ae(c,t,i))}return o}function xe(e,t){return Array.from(io(e,t)).join(`
3
+ `)}function io(e,t){let r=E(e),o=so(t);return Kr(o.replacer?oo(r,o.replacer):r,o,0)}function so(e){return{indent:e?.indent??2,delimiter:e?.delimiter??Y,keyFolding:e?.keyFolding??"off",flattenDepth:e?.flattenDepth??Number.POSITIVE_INFINITY,replacer:e?.replacer}}function co(e){let t=e.format??"toon";if(t!=="toon"&&t!=="json")throw Error("--format debe ser toon o json.");return t}function ze(e,t){if(co(t)==="json"){console.log(JSON.stringify(e,null,2));return}console.log(xe(e))}function ke(e){process.stdout.write(`${e}
4
+ `)}function Ke(e,t){let o={ok:!1,error:e instanceof Error?e.message:String(e)};if((t.format==="json"?"json":"toon")==="json"){console.error(JSON.stringify(o,null,2));return}console.error(xe(o))}function y(e){process.stderr.write(e)}import{existsSync as ce,mkdirSync as lo,readFileSync as Le,writeFileSync as po,unlinkSync as go}from"node:fs";import{join as et}from"node:path";import{homedir as fo}from"node:os";import{AsyncLocalStorage as uo}from"node:async_hooks";var mo=new uo;function I(){return mo.getStore()}var ie={main:{local:"http://localhost:3000",develop:"https://api.bejusto.com",prod:"https://api.getjusto.com"},auth:{local:"http://localhost:4112",develop:"https://auth.service.bejusto.com",prod:"https://auth.service.getjusto.com"},webdata:{local:"http://localhost:4125",develop:"https://webdata.service.bejusto.com",prod:"https://webdatacdn.getjusto.com"},preferences:{local:"http://localhost:4120",develop:"https://preferences.service.bejusto.com",prod:"https://preferences.service.getjusto.com"},buckets:{local:"http://localhost:4106",develop:"https://buckets.service.bejusto.com",prod:"https://buckets.service.getjusto.com"},reservations:{local:"http://localhost:4113",develop:"https://reservations.service.bejusto.com",prod:"https://reservations.service.getjusto.com"},data:{local:"http://localhost:4107",develop:"https://data.service.bejusto.com",prod:"https://data.service.getjusto.com"},finances:{local:"http://localhost:4105",develop:"https://finances.service.bejusto.com",prod:"https://finances.service.getjusto.com"},"url-shortener":{local:"http://localhost:4102",develop:"https://url-shortener.service.bejusto.com",prod:"https://url-shortener.service.getjusto.com"},files:{local:"http://localhost:4108",develop:"https://files.service.bejusto.com",prod:"https://files.service.getjusto.com"},tabs:{local:"http://localhost:4115",develop:"https://tabs.service.bejusto.com",prod:"https://tabs.service.getjusto.com"},commander:{local:"http://localhost:4109",develop:"https://commander.service.bejusto.com",prod:"https://commander.service.getjusto.com"},experiments:{local:"http://localhost:4114",develop:"https://experiments.service.bejusto.com",prod:"https://experiments.service.getjusto.com"},sales:{local:"http://localhost:4117",develop:"https://sales.service.bejusto.com",prod:"https://sales.service.getjusto.com"},delivery:{local:"http://localhost:3410",develop:"https://api-delivery.bejusto.com",prod:"https://api-delivery-2.getjusto.com"},payments:{local:"http://localhost:4118",develop:"https://payments.service.bejusto.com",prod:"https://payments.service.getjusto.com"},addresses:{local:"http://localhost:4051",develop:"https://addresses.service.bejusto.com",prod:"https://addresses.service.getjusto.com"},royalty:{local:"http://localhost:4121",develop:"https://royalty.service.bejusto.com",prod:"https://royalty.service.getjusto.com"},marketing:{local:"http://localhost:4005",develop:"https://marketing.service.bejusto.com",prod:"https://marketing.service.getjusto.com"},api:{local:"http://localhost:4119",develop:"https://api.service.bejusto.com",prod:"https://api.service.getjusto.com"},messenger:{local:"http://localhost:4122",develop:"https://messenger.service.bejusto.com",prod:"https://messenger.service.getjusto.com"},invoice:{local:"http://localhost:4123",develop:"https://invoice.service.bejusto.com",prod:"https://invoice.service.getjusto.com"},"drivers-server":{local:"http://localhost:3410",develop:"https://api-delivery.bejusto.com",prod:"https://api-delivery-2.getjusto.com"}},Se="prod";function Ve(e){Se=e}function se(){let e=process.env.JUSTO_TEAM_CLI_ENV;if(e)return e;let t=I()?.environment;if(t)return t;return Se}function h(e){return ie[e][Se]}var Ee=et(fo(),".justo-team");function tt(e){let t=e==="prod"?"credentials.json":`credentials.${e}.json`;return et(Ee,t)}function je(){return tt(se())}function wo(){if(!ce(Ee))lo(Ee,{recursive:!0})}function ue(e){let t=I();if(t&&t.canPersistCredentials===!1)throw Error("Este entorno no permite guardar credenciales.");wo(),po(je(),JSON.stringify(e,null,2))}function d(){let e=process.env.JUSTO_TEAM_CLI_TOKEN,t=process.env.JUSTO_TEAM_CLI_EMAIL,r=process.env.JUSTO_TEAM_CLI_REFRESH_TOKEN;if(e&&t)return{email:t,token:e,refreshToken:r||""};let o=I()?.credentials;if(o!==void 0)return o?{email:o.email,token:o.token,refreshToken:o.refreshToken||""}:null;let a=je();if(!ce(a))return null;try{let n=Le(a,"utf-8");return JSON.parse(n)}catch{return null}}function rt(e){let t=tt(e);if(!ce(t))return null;try{let r=Le(t,"utf-8");return JSON.parse(r)}catch{return null}}function Ae(){let e=I();if(e&&e.canPersistCredentials===!1)throw Error("Este entorno no permite borrar credenciales.");let t=je();if(ce(t))go(t)}import{existsSync as ot,readFileSync as bo,writeFileSync as yo,mkdirSync as Co}from"node:fs";import{join as at}from"node:path";import{homedir as qo}from"node:os";function Io(){let e=process.env.JUSTO_TEAM_CLI_DEVICE_ID;if(e)return e;let t=I()?.deviceId;if(t)return t;let r=at(qo(),".justo-team"),o=at(r,"device-id");if(ot(o))return bo(o,"utf-8").trim();let a=crypto.randomUUID();if(!ot(r))Co(r,{recursive:!0});return yo(o,a),a}var it={required:({label:e})=>`${e} no es opcional`,notAString:({label:e})=>`${e} no es un texto`,notANumber:({label:e})=>`${e} no es un número`,notAnInteger:({label:e})=>`${e} no es un número entero`,notABoolean:({label:e})=>`${e} no es un valor verdadero o falso`,notAnEmail:({label:e})=>`${e} no es un email`,notAnId:({label:e})=>`${e} no es un ID válido`,notADate:({label:e})=>`${e} no es una fecha válida`,notAnArray:({label:e})=>`${e} no es un arreglo`,notAnObject:({label:e})=>`${e} no es un objeto`,stringTooShort:({label:e})=>`${e} no tiene el largo suficiente`,stringTooLong:"El largo es mayor al permitido",numberTooSmall:({label:e})=>`${e} es un número muy pequeño`,numberTooBig:({label:e})=>`${e} es un número muy grande`,notInSchema:({label:e})=>`${e} no esta permitido`,notUnique:({label:e})=>`${e} no es único`,notFound:({label:e})=>`${e} no se encontró`,invalid:"No es válido",rateLimitExceeded:"Has excedido el límite de intentos. Intenta de nuevo más tarde.",incorrectLoginCode:"El código es incorrecto",loginCodeExpired:"El código expiró. Solicita un nuevo",loginCodeLocked:"El código se bloqueó. Genera un nuevo código para continuar",userNotFound:"No existe una cuenta con este email"};function ho(e,t){let r=it[e];if(!r)return`${t}: ${e}`;if(typeof r==="function")return r({label:t});return r}function nt(e){return Object.entries(e).map(([t,r])=>ho(r,t)).join(", ")}function $o(e){if(e.error==="validationError"&&e.validationErrors)return nt(e.validationErrors);if(e.extensions?.code==="PermissionsError"){let a=e.extensions.info?.type;if(a?.includes("User doesn't have permissions for "))return`Tu usuario no tiene permisos para [${a.split("User doesn't have permissions for ")[1]}]`;return e.message}if(e.validationErrors)return`${e.message} (${nt(e.validationErrors)})`;let t=e.message||"Error desconocido",r=it[t];if(r)return typeof r==="function"?r({label:""}).trim():r;let o=e.error||e.code||e.type;return o?`${t} [${o}]`:t}function xo(e){try{return JSON.parse(Buffer.from(e.split(".")[1],"base64").toString()).exp*1000<Date.now()}catch{return!0}}async function So(){let e=d();if(!e?.refreshToken)return null;let t=`${h("auth")}/refresh-token`,o=await(await fetch(t,{method:"POST",headers:{"X-ORION-REFRESH":e.refreshToken}})).json();if(!o.token)return null;if(I()?.canPersistCredentials!==!1)ue({...e,token:o.token});return o.token}async function Ne(){let e=d();if(!e?.token)return;if(!xo(e.token))return e.token;return await So()??void 0}async function ve(e="application/json"){let t=await Ne(),r={"Content-Type":e,"X-ORION-DEVICEID":Io(),"X-ORION-PLATFORM":"web"};if(t)r["x-orion-jwt"]=t;return r}async function u(e){let t=`${h(e.service)}/graphql`,r=await ve(),o;try{o=await fetch(t,{method:"POST",headers:r,body:JSON.stringify({query:e.query,variables:e.variables}),signal:AbortSignal.timeout(15000)})}catch{throw Error("La solicitud tardó demasiado. Intenta de nuevo.")}let a=await o.json();if(a.errors?.length)throw Error($o(a.errors[0]));if(!a.data)throw Error("No data returned from server");return a.data}function Eo(e){return e.replace(/^https?:\/\//,"").replace(/^www\./,"").replace(/\/.*$/,"")}function jo(e){return e.includes(".")||e.startsWith("http://")||e.startsWith("https://")}async function M(e){if(jo(e)){let t=Eo(e),r=await fetch(`${h("main")}/website-id/${t}`,{signal:AbortSignal.timeout(1e4)});if(!r.ok)throw Error(`No se encontro el sitio "${t}"`);let o=await r.json();if(!o.websiteId)throw Error(`No se pudo resolver el websiteId para "${t}"`);return{input:e,websiteId:o.websiteId,targetType:"domain"}}return{input:e,websiteId:e,targetType:"websiteId"}}async function st(e){let t=await u({service:"main",query:`query ($websiteId: ID) {
5
5
  website(websiteId: $websiteId) {
6
6
  _id
7
7
  name
@@ -13,7 +13,7 @@ function L(e){let t=[],o={},r={};for(let a=0;a<e.length;a++)if(e[a].startsWith("
13
13
  timezone
14
14
  defaultMenuId
15
15
  }
16
- }`,variables:{websiteId:e}});if(!t.website)throw Error(`No se encontro el website "${e}"`);return t.website}function qr(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}async function tt(e){if(qr(),!e)throw Error("Uso: team-cli admin <websiteId|domain> show");let t=await M(e),o=await et(t.websiteId);return{context:t,website:o}}function ne(){return`team-cli admin
16
+ }`,variables:{websiteId:e}});if(!t.website)throw Error(`No se encontro el website "${e}"`);return t.website}function Ao(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}async function ct(e){if(Ao(),!e)throw Error("Uso: team-cli admin <websiteId|domain> show");let t=await M(e),r=await st(t.websiteId);return{context:t,website:r}}function me(){return`team-cli admin
17
17
 
18
18
  Comandos administrativos con contexto de website.
19
19
 
@@ -35,7 +35,7 @@ Modulos:
35
35
 
36
36
  coupons
37
37
  Administrar cupones y sus códigos.
38
- Uso: team-cli admin <websiteId|domain> coupons <accion> [opciones]`}var ot=`
38
+ Uso: team-cli admin <websiteId|domain> coupons <accion> [opciones]`}var ut=`
39
39
  availableAtPeriods
40
40
  closedDays
41
41
  closedUntilDate
@@ -51,7 +51,7 @@ Modulos:
51
51
  fromMinute
52
52
  toMinute
53
53
  }
54
- `,se=`
54
+ `,le=`
55
55
  _id
56
56
  websiteId
57
57
  name
@@ -86,13 +86,13 @@ Modulos:
86
86
  requiredBINs
87
87
  extraRequirementsForPaymentTypes
88
88
  schedule {
89
- ${ot}
89
+ ${ut}
90
90
  }
91
91
  scheduleAtUse {
92
- ${ot}
92
+ ${ut}
93
93
  }
94
94
  codesCode
95
- `,rt=`
95
+ `,mt=`
96
96
  _id
97
97
  code
98
98
  couponId
@@ -101,28 +101,28 @@ Modulos:
101
101
  sentToEmail
102
102
  totalRedemptions
103
103
  createdAt
104
- `;function he(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function _(e,t){let o=e[t];if(!o)throw Error(`--${t} es requerido.`);try{return JSON.parse(o)}catch{throw Error(`--${t} debe ser un JSON válido.`)}}function S(e,t){let o=e[t];if(!o)return;let r=Number.parseInt(o,10);if(Number.isNaN(r))throw Error(`--${t} debe ser un número entero.`);return r}function at(e,t){let o=e[t];if(!o)return;if(o==="true")return!0;if(o==="false")return!1;throw Error(`--${t} debe ser true o false.`)}async function x(e){if(he(),!e)throw Error("Debes indicar <websiteId|domain>.");return M(e)}async function N(e,t){let o=await m({service:"main",query:`query ($couponId: ID) {
104
+ `;function Re(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function P(e,t){let r=e[t];if(!r)throw Error(`--${t} es requerido.`);try{return JSON.parse(r)}catch{throw Error(`--${t} debe ser un JSON válido.`)}}function S(e,t){let r=e[t];if(!r)return;let o=Number.parseInt(r,10);if(Number.isNaN(o))throw Error(`--${t} debe ser un número entero.`);return o}function lt(e,t){let r=e[t];if(!r)return;if(r==="true")return!0;if(r==="false")return!1;throw Error(`--${t} debe ser true o false.`)}async function $(e){if(Re(),!e)throw Error("Debes indicar <websiteId|domain>.");return M(e)}async function A(e,t){let r=await u({service:"main",query:`query ($couponId: ID) {
105
105
  coupon(couponId: $couponId) {
106
106
  _id
107
107
  websiteId
108
108
  }
109
- }`,variables:{couponId:e}});if(!o.coupon)throw Error(`No se encontró el cupón "${e}"`);if(o.coupon.websiteId!==t)throw Error(`El cupón "${e}" no pertenece al website seleccionado.`);return o.coupon}function Ir(e){if(!Array.isArray(e))throw Error("--input debe ser un arreglo JSON.");return e.map((t)=>{if(!t||typeof t!=="object"||typeof t.code!=="string")throw Error('Cada item de --input debe tener al menos { "code": "..." }.');if(t.userEmail!=null&&typeof t.userEmail!=="string")throw Error("userEmail debe ser string cuando viene informado.");return{code:t.code,userEmail:t.userEmail}})}function $r(e){if(!Array.isArray(e)||e.some((t)=>typeof t!=="string"))throw Error("--ids debe ser un arreglo JSON de strings.");return e}async function it(e,t,o){let r=await x(e);await N(t,r.websiteId);let a=S(o,"limit"),i=S(o,"page"),n=o.filter,s=await m({service:"main",query:`query ($couponId: ID, $filter: String, $limit: BigInt, $page: BigInt) {
109
+ }`,variables:{couponId:e}});if(!r.coupon)throw Error(`No se encontró el cupón "${e}"`);if(r.coupon.websiteId!==t)throw Error(`El cupón "${e}" no pertenece al website seleccionado.`);return r.coupon}function No(e){if(!Array.isArray(e))throw Error("--input debe ser un arreglo JSON.");return e.map((t)=>{if(!t||typeof t!=="object"||typeof t.code!=="string")throw Error('Cada item de --input debe tener al menos { "code": "..." }.');if(t.userEmail!=null&&typeof t.userEmail!=="string")throw Error("userEmail debe ser string cuando viene informado.");return{code:t.code,userEmail:t.userEmail}})}function vo(e){if(!Array.isArray(e)||e.some((t)=>typeof t!=="string"))throw Error("--ids debe ser un arreglo JSON de strings.");return e}async function dt(e,t,r){let o=await $(e);await A(t,o.websiteId);let a=S(r,"limit"),n=S(r,"page"),i=r.filter,s=await u({service:"main",query:`query ($couponId: ID, $filter: String, $limit: BigInt, $page: BigInt) {
110
110
  couponCodes(couponId: $couponId, filter: $filter, limit: $limit, page: $page) {
111
111
  items {
112
- ${rt}
112
+ ${mt}
113
113
  }
114
114
  totalCount
115
115
  totalPages
116
116
  hasNextPage
117
117
  hasPreviousPage
118
118
  }
119
- }`,variables:{couponId:t,filter:n,limit:a,page:i}});return{context:r,couponId:t,codes:s.couponCodes.items??[],pagination:{totalCount:s.couponCodes.totalCount??0,totalPages:s.couponCodes.totalPages??0,hasNextPage:Boolean(s.couponCodes.hasNextPage),hasPreviousPage:Boolean(s.couponCodes.hasPreviousPage),page:i??1,limit:a??null}}}async function nt(e,t,o){let r=await x(e);await N(t,r.websiteId);let a=Ir(_(o,"input")),i=a.some((s)=>s.userEmail),n=await m({service:"main",query:`mutation ($couponId: ID, $codesWithEmail: [CodeWithEmailInput], $useCodeWithEmail: Boolean) {
119
+ }`,variables:{couponId:t,filter:i,limit:a,page:n}});return{context:o,couponId:t,codes:s.couponCodes.items??[],pagination:{totalCount:s.couponCodes.totalCount??0,totalPages:s.couponCodes.totalPages??0,hasNextPage:Boolean(s.couponCodes.hasNextPage),hasPreviousPage:Boolean(s.couponCodes.hasPreviousPage),page:n??1,limit:a??null}}}async function pt(e,t,r){let o=await $(e);await A(t,o.websiteId);let a=No(P(r,"input")),n=a.some((s)=>s.userEmail),i=await u({service:"main",query:`mutation ($couponId: ID, $codesWithEmail: [CodeWithEmailInput], $useCodeWithEmail: Boolean) {
120
120
  createCouponCodes(couponId: $couponId, codesWithEmail: $codesWithEmail, useCodeWithEmail: $useCodeWithEmail)
121
- }`,variables:{couponId:t,codesWithEmail:a,useCodeWithEmail:i}});return{context:r,couponId:t,requestedCount:a.length,result:n.createCouponCodes}}async function st(e,t,o){let r=await x(e);await N(t,r.websiteId);let a=S(o,"quantity");if(!a)throw Error("--quantity es requerido.");let i=await m({service:"main",query:`mutation ($couponId: ID, $couponQuantity: Float, $couponCodePrefix: String) {
121
+ }`,variables:{couponId:t,codesWithEmail:a,useCodeWithEmail:n}});return{context:o,couponId:t,requestedCount:a.length,result:i.createCouponCodes}}async function gt(e,t,r){let o=await $(e);await A(t,o.websiteId);let a=S(r,"quantity");if(!a)throw Error("--quantity es requerido.");let n=await u({service:"main",query:`mutation ($couponId: ID, $couponQuantity: Float, $couponCodePrefix: String) {
122
122
  createRandomCouponCodes(couponId: $couponId, couponQuantity: $couponQuantity, couponCodePrefix: $couponCodePrefix)
123
- }`,variables:{couponId:t,couponQuantity:a,couponCodePrefix:o.prefix}});return{context:r,couponId:t,quantity:a,prefix:o.prefix??null,result:i.createRandomCouponCodes}}async function ct(e,t,o){let r=await x(e);await N(t,r.websiteId);let a=$r(_(o,"ids")),i=await m({service:"main",query:`mutation ($couponId: ID, $couponCodesIds: [ID]) {
123
+ }`,variables:{couponId:t,couponQuantity:a,couponCodePrefix:r.prefix}});return{context:o,couponId:t,quantity:a,prefix:r.prefix??null,result:n.createRandomCouponCodes}}async function ft(e,t,r){let o=await $(e);await A(t,o.websiteId);let a=vo(P(r,"ids")),n=await u({service:"main",query:`mutation ($couponId: ID, $couponCodesIds: [ID]) {
124
124
  deleteCouponCodes(couponId: $couponId, couponCodesIds: $couponCodesIds, globalCoupon: false)
125
- }`,variables:{couponId:t,couponCodesIds:a}});return{context:r,couponId:t,deleted:i.deleteCouponCodes,couponCodesIds:a}}function mt(){return`team-cli admin coupons codes create
125
+ }`,variables:{couponId:t,couponCodesIds:a}});return{context:o,couponId:t,deleted:n.deleteCouponCodes,couponCodesIds:a}}function wt(){return`team-cli admin coupons codes create
126
126
 
127
127
  Crea códigos explícitos para un cupón.
128
128
 
@@ -145,11 +145,11 @@ Ejemplo:
145
145
 
146
146
  Notas:
147
147
  Si algún item trae userEmail, team-cli activa useCodeWithEmail automáticamente.
148
- couponId se valida contra el website seleccionado antes de ejecutar la mutation.`}var ut={active:"Boolean",allowedEmails:"[String]",applyDeliveryDiscount:"Boolean",code:"ID",deliveryDiscountPercentage:"Float",deliveryDiscountType:"String",deliveryDiscountValue:"Float",description:"String",discountAmount:"Float",dontApplyToProductsIds:"[ID]",endDate:"Date",externalId:"String",extraRequirementsForPaymentTypes:"JSON",fixedAmount:"Float",fromDate:"Date",isBirthdayCoupon:"Boolean",isHidden:"Boolean",maxPercentageOffDiscount:"Float",maxProductsPerOrder:"Float",maxRedemptions:"Float",maxRedemptionsPerUser:"Float",maxRedemptionsPerUserPerDay:"Boolean",maximumOrderPrice:"Float",minimumOrderPrice:"Float",name:"String",onlyForNewUsers:"Boolean",onlyForProductsWithoutDiscount:"Boolean",onlyRedeemOnBirthday:"Boolean",percentageOff:"Float",requireChannels:"[ID]",requirePhoneVerification:"Boolean",requiredBINs:"[String]",requiresCategoriesIds:"[ID]",requiresMenusIds:"[ID]",requiresPaymentTypes:"[ID]",requiresProductsIds:"[ID]",requiresStoresIds:"[ID]",schedule:"ScheduleInput",scheduleAtUse:"ScheduleInput",type:"ID",websiteId:"ID"};function xr(e){let t=Object.entries(e).filter(([,i])=>i!==void 0),o=t.map(([i])=>i).filter((i)=>!ut[i]);if(o.length)throw Error(`Campos no soportados para create: ${o.join(", ")}`);let r=t.map(([i])=>`$${i}: ${ut[i]}`).join(", "),a=t.map(([i])=>`${i}: $${i}`).join(", ");return`mutation (${r}) {
148
+ couponId se valida contra el website seleccionado antes de ejecutar la mutation.`}var bt={active:"Boolean",allowedEmails:"[String]",applyDeliveryDiscount:"Boolean",code:"ID",deliveryDiscountPercentage:"Float",deliveryDiscountType:"String",deliveryDiscountValue:"Float",description:"String",discountAmount:"Float",dontApplyToProductsIds:"[ID]",endDate:"Date",externalId:"String",extraRequirementsForPaymentTypes:"JSON",fixedAmount:"Float",fromDate:"Date",isBirthdayCoupon:"Boolean",isHidden:"Boolean",maxPercentageOffDiscount:"Float",maxProductsPerOrder:"Float",maxRedemptions:"Float",maxRedemptionsPerUser:"Float",maxRedemptionsPerUserPerDay:"Boolean",maximumOrderPrice:"Float",minimumOrderPrice:"Float",name:"String",onlyForNewUsers:"Boolean",onlyForProductsWithoutDiscount:"Boolean",onlyRedeemOnBirthday:"Boolean",percentageOff:"Float",requireChannels:"[ID]",requirePhoneVerification:"Boolean",requiredBINs:"[String]",requiresCategoriesIds:"[ID]",requiresMenusIds:"[ID]",requiresPaymentTypes:"[ID]",requiresProductsIds:"[ID]",requiresStoresIds:"[ID]",schedule:"ScheduleInput",scheduleAtUse:"ScheduleInput",type:"ID",websiteId:"ID"};function Ro(e){let t=Object.entries(e).filter(([,n])=>n!==void 0),r=t.map(([n])=>n).filter((n)=>!bt[n]);if(r.length)throw Error(`Campos no soportados para create: ${r.join(", ")}`);let o=t.map(([n])=>`$${n}: ${bt[n]}`).join(", "),a=t.map(([n])=>`${n}: $${n}`).join(", ");return`mutation (${o}) {
149
149
  createCoupon(${a}) {
150
- ${se}
150
+ ${le}
151
151
  }
152
- }`}async function lt(e,t){let o=await x(e),r=S(t,"limit"),a=S(t,"page"),i=t.filter,n=await m({service:"main",query:`query ($websiteId: ID, $filter: String, $limit: BigInt, $page: BigInt) {
152
+ }`}async function yt(e,t){let r=await $(e),o=S(t,"limit"),a=S(t,"page"),n=t.filter,i=await u({service:"main",query:`query ($websiteId: ID, $filter: String, $limit: BigInt, $page: BigInt) {
153
153
  coupons(websiteId: $websiteId, filter: $filter, limit: $limit, page: $page) {
154
154
  items {
155
155
  _id
@@ -169,17 +169,17 @@ Notas:
169
169
  hasNextPage
170
170
  hasPreviousPage
171
171
  }
172
- }`,variables:{websiteId:o.websiteId,filter:i,limit:r,page:a}});return{context:o,coupons:n.coupons.items??[],pagination:{totalCount:n.coupons.totalCount??0,totalPages:n.coupons.totalPages??0,hasNextPage:Boolean(n.coupons.hasNextPage),hasPreviousPage:Boolean(n.coupons.hasPreviousPage),page:a??1,limit:r??null}}}async function dt(e,t){let o=await x(e);await N(t,o.websiteId);let r=await m({service:"main",query:`query ($couponId: ID) {
172
+ }`,variables:{websiteId:r.websiteId,filter:n,limit:o,page:a}});return{context:r,coupons:i.coupons.items??[],pagination:{totalCount:i.coupons.totalCount??0,totalPages:i.coupons.totalPages??0,hasNextPage:Boolean(i.coupons.hasNextPage),hasPreviousPage:Boolean(i.coupons.hasPreviousPage),page:a??1,limit:o??null}}}async function Ct(e,t){let r=await $(e);await A(t,r.websiteId);let o=await u({service:"main",query:`query ($couponId: ID) {
173
173
  coupon(couponId: $couponId) {
174
- ${se}
174
+ ${le}
175
175
  }
176
- }`,variables:{couponId:t}});return{context:o,coupon:r.coupon}}async function pt(e,t){let o=await x(e),r=_(t,"input");if(r.websiteId&&r.websiteId!==o.websiteId)throw Error("El websiteId del input no coincide con el website seleccionado.");let a={...r,websiteId:o.websiteId},i=xr(a),n=await m({service:"main",query:i,variables:a});return{context:o,coupon:n.createCoupon}}async function gt(e,t,o){let r=await x(e);await N(t,r.websiteId);let a=_(o,"input"),i=await m({service:"main",query:`mutation ($couponId: ID, $coupon: UpdateCouponInput) {
176
+ }`,variables:{couponId:t}});return{context:r,coupon:o.coupon}}async function qt(e,t){let r=await $(e),o=P(t,"input");if(o.websiteId&&o.websiteId!==r.websiteId)throw Error("El websiteId del input no coincide con el website seleccionado.");let a={...o,websiteId:r.websiteId},n=Ro(a),i=await u({service:"main",query:n,variables:a});return{context:r,coupon:i.createCoupon}}async function It(e,t,r){let o=await $(e);await A(t,o.websiteId);let a=P(r,"input"),n=await u({service:"main",query:`mutation ($couponId: ID, $coupon: UpdateCouponInput) {
177
177
  updateCoupon(couponId: $couponId, coupon: $coupon) {
178
- ${se}
178
+ ${le}
179
179
  }
180
- }`,variables:{couponId:t,coupon:a}});return{context:r,coupon:i.updateCoupon}}async function ft(e,t){let o=await x(e);await N(t,o.websiteId);let r=await m({service:"main",query:`mutation ($couponsIds: [ID]) {
180
+ }`,variables:{couponId:t,coupon:a}});return{context:o,coupon:n.updateCoupon}}async function ht(e,t){let r=await $(e);await A(t,r.websiteId);let o=await u({service:"main",query:`mutation ($couponsIds: [ID]) {
181
181
  deleteCoupons(couponsIds: $couponsIds, globalCoupon: false)
182
- }`,variables:{couponsIds:[t]}});return{context:o,couponId:t,deleted:r.deleteCoupons}}function Y(){return`team-cli admin coupons
182
+ }`,variables:{couponsIds:[t]}});return{context:r,couponId:t,deleted:o.deleteCoupons}}function D(){return`team-cli admin coupons
183
183
 
184
184
  Administracion de cupones para el website seleccionado.
185
185
 
@@ -227,7 +227,7 @@ Acciones:
227
227
  Uso: team-cli admin <web> coupons codes delete <couponId> --ids '["id1","id2"]'
228
228
 
229
229
  Nota:
230
- El schema actual no expone update para coupon codes.`}function wt(){return`team-cli admin coupons create
230
+ El schema actual no expone update para coupon codes.`}function $t(){return`team-cli admin coupons create
231
231
 
232
232
  Crea un cupón para el website seleccionado.
233
233
 
@@ -276,7 +276,7 @@ Ejemplo con schedule:
276
276
  Tips:
277
277
  Usa comillas simples afuera del JSON en shell.
278
278
  Usa arrays JSON reales para ids o listas.
279
- Si necesitas el shape exacto de un cupón existente, parte con: team-cli admin <web> coupons show <couponId>`}function bt(){return`team-cli admin coupons update
279
+ Si necesitas el shape exacto de un cupón existente, parte con: team-cli admin <web> coupons show <couponId>`}function xt(){return`team-cli admin coupons update
280
280
 
281
281
  Actualiza un cupón existente.
282
282
 
@@ -318,7 +318,7 @@ Ejemplo reemplazando restricciones:
318
318
  team-cli admin <web> coupons update <couponId> --input '{"requiresStoresIds":["store1"],"requiresPaymentTypes":["card"]}'
319
319
 
320
320
  Tip:
321
- Primero mira el cupón actual con: team-cli admin <web> coupons show <couponId>`}async function yt(e,t){he();let o=e[2]??t.filter;if(!o)throw Error("Debes indicar un término de búsqueda. Uso: team-cli admin search <texto>");let r=S(t,"limit"),a=S(t,"page"),i=at(t,"only-active"),n=await m({service:"main",query:`query ($filter: String, $limit: BigInt, $page: BigInt, $onlyActiveWebsites: Boolean) {
321
+ Primero mira el cupón actual con: team-cli admin <web> coupons show <couponId>`}async function St(e,t){Re();let r=e[2]??t.filter;if(!r)throw Error("Debes indicar un término de búsqueda. Uso: team-cli admin search <texto>");let o=S(t,"limit"),a=S(t,"page"),n=lt(t,"only-active"),i=await u({service:"main",query:`query ($filter: String, $limit: BigInt, $page: BigInt, $onlyActiveWebsites: Boolean) {
322
322
  websites(filter: $filter, limit: $limit, page: $page, onlyActiveWebsites: $onlyActiveWebsites) {
323
323
  items {
324
324
  _id
@@ -334,7 +334,7 @@ Tip:
334
334
  hasNextPage
335
335
  hasPreviousPage
336
336
  }
337
- }`,variables:{filter:o,limit:r,page:a,onlyActiveWebsites:i}});return{searchTerm:o,websites:n.websites.items??[],pagination:{totalCount:n.websites.totalCount??0,totalPages:n.websites.totalPages??0,hasNextPage:Boolean(n.websites.hasNextPage),hasPreviousPage:Boolean(n.websites.hasPreviousPage),page:a??1,limit:r??null}}}function Ct(){return`team-cli admin search
337
+ }`,variables:{filter:r,limit:o,page:a,onlyActiveWebsites:n}});return{searchTerm:r,websites:i.websites.items??[],pagination:{totalCount:i.websites.totalCount??0,totalPages:i.websites.totalPages??0,hasNextPage:Boolean(i.websites.hasNextPage),hasPreviousPage:Boolean(i.websites.hasPreviousPage),page:a??1,limit:o??null}}}function Et(){return`team-cli admin search
338
338
 
339
339
  Buscar websites en admin.
340
340
 
@@ -354,7 +354,7 @@ Opciones:
354
354
  Ejemplos:
355
355
  team-cli admin search milas
356
356
  team-cli admin search buffalo --limit 5
357
- team-cli admin search pizza --only-active true`}function hr(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function Sr(e){let t=[e.address?.streetAddress,e.address?.extendedAddress,e.address?.locality].filter(Boolean);if(!t.length)return null;return t.join(", ")}async function qt(e){if(hr(),!e)throw Error("Uso: team-cli admin <websiteId|domain> stores list");let t=await M(e),r=((await m({service:"main",query:`query ($websiteId: ID) {
357
+ team-cli admin search pizza --only-active true`}function To(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function Oo(e){let t=[e.address?.streetAddress,e.address?.extendedAddress,e.address?.locality].filter(Boolean);if(!t.length)return null;return t.join(", ")}async function jt(e){if(To(),!e)throw Error("Uso: team-cli admin <websiteId|domain> stores list");let t=await M(e),o=((await u({service:"main",query:`query ($websiteId: ID) {
358
358
  stores(websiteId: $websiteId) {
359
359
  items {
360
360
  _id
@@ -366,17 +366,17 @@ Ejemplos:
366
366
  }
367
367
  }
368
368
  }
369
- }`,variables:{websiteId:t.websiteId}})).stores.items??[]).map((a)=>({_id:a._id,name:a.name,address:Sr(a)})).sort((a,i)=>a.name.localeCompare(i.name,"es",{sensitivity:"base"}));return{context:t,stores:r,totalCount:r.length}}import{createInterface as Er}from"node:readline";function Z(e){if(process.env.JUSTO_TEAM_CLI_INTERACTIVE==="false")throw Error("Este entorno no soporta prompts interactivos.");if(I()?.interactive===!1)throw Error("Este entorno no soporta prompts interactivos.");let t=Er({input:process.stdin,output:process.stderr});return new Promise((o)=>{t.question(e,(r)=>{t.close(),o(r.trim())})})}async function It(e){return(await m({service:"auth",query:`mutation ($email: String!) {
369
+ }`,variables:{websiteId:t.websiteId}})).stores.items??[]).map((a)=>({_id:a._id,name:a.name,address:Oo(a)})).sort((a,n)=>a.name.localeCompare(n.name,"es",{sensitivity:"base"}));return{context:t,stores:o,totalCount:o.length}}import{createInterface as Uo}from"node:readline";function z(e){if(process.env.JUSTO_TEAM_CLI_INTERACTIVE==="false")throw Error("Este entorno no soporta prompts interactivos.");if(I()?.interactive===!1)throw Error("Este entorno no soporta prompts interactivos.");let t=Uo({input:process.stdin,output:process.stderr});return new Promise((r)=>{t.question(e,(o)=>{t.close(),r(o.trim())})})}async function At(e){return(await u({service:"auth",query:`mutation ($email: String!) {
370
370
  requestLoginCode(email: $email)
371
- }`,variables:{email:e}})).requestLoginCode}async function $t(e,t,o){let r=await m({service:"auth",query:`mutation ($email: String!, $token: String!, $code: String!) {
371
+ }`,variables:{email:e}})).requestLoginCode}async function Nt(e,t,r){let o=await u({service:"auth",query:`mutation ($email: String!, $token: String!, $code: String!) {
372
372
  loginWithCode(email: $email, token: $token, code: $code) {
373
373
  token
374
374
  refreshToken
375
375
  }
376
- }`,variables:{email:e,token:t,code:o.toUpperCase()}});ie({email:e,token:r.loginWithCode.token,refreshToken:r.loginWithCode.refreshToken}),await jr()}async function jr(){if(!(await m({service:"main",query:"query { me { roles } }"})).me?.roles?.length)throw Ie(),Error("Solo miembros del equipo Justo pueden usar esta herramienta.")}async function xt(){let e=await Z("Email: ");y(`Enviando codigo de verificacion...
377
- `);let t=await It(e);y(`Codigo enviado a tu email.
378
- `);let o=await Z("Codigo: ");return await $t(e,t,o),{ok:!0,authenticated:!0,email:e}}async function ht(e){let t=G(e,"email"),o=G(e,"token"),r=G(e,"code");return await $t(t,o,r),{ok:!0,authenticated:!0,email:t}}async function St(e){let t=G(e,"email");y(`Enviando codigo de verificacion...
379
- `);let o=await It(t);return{ok:!0,email:t,token:o,nextCommand:`npx @getjusto/team-cli auth login-with-token --email ${t} --token ${o} --code <CODIGO>`}}async function Et(){return Ie(),{ok:!0,authenticated:!1}}async function jt(){let e=d();if(!e)return{authenticated:!1,loginCommand:"npx @getjusto/team-cli auth request-code --email <email>",nextCommand:"npx @getjusto/team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>"};return{authenticated:!0,email:e.email}}function Se(){return`team-cli auth
376
+ }`,variables:{email:e,token:t,code:r.toUpperCase()}});ue({email:e,token:o.loginWithCode.token,refreshToken:o.loginWithCode.refreshToken}),await Qo()}async function Qo(){if(!(await u({service:"main",query:"query { me { roles } }"})).me?.roles?.length)throw Ae(),Error("Solo miembros del equipo Justo pueden usar esta herramienta.")}async function vt(){let e=await z("Email: ");y(`Enviando codigo de verificacion...
377
+ `);let t=await At(e);y(`Codigo enviado a tu email.
378
+ `);let r=await z("Codigo: ");return await Nt(e,t,r),{ok:!0,authenticated:!0,email:e}}async function Rt(e){let t=F(e,"email"),r=F(e,"token"),o=F(e,"code");return await Nt(t,r,o),{ok:!0,authenticated:!0,email:t}}async function Tt(e){let t=F(e,"email");y(`Enviando codigo de verificacion...
379
+ `);let r=await At(t);return{ok:!0,email:t,token:r,nextCommand:`npx @getjusto/team-cli auth login-with-token --email ${t} --token ${r} --code <CODIGO>`}}async function Ot(){return Ae(),{ok:!0,authenticated:!1}}async function Ut(){let e=d();if(!e)return{authenticated:!1,loginCommand:"npx @getjusto/team-cli auth request-code --email <email>",nextCommand:"npx @getjusto/team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>"};return{authenticated:!0,email:e.email}}function Te(){return`team-cli auth
380
380
 
381
381
  Gestion de sesion.
382
382
 
@@ -402,7 +402,7 @@ Subcomandos:
402
402
 
403
403
  login-with-token
404
404
  Iniciar sesion sin prompts. Recomendado para agentes.
405
- Uso: team-cli auth login-with-token --email <email> --token <token> --code <codigo>`}import{spawn as de}from"node:child_process";import{createServer as Ht}from"node:http";import{existsSync as Mr,mkdirSync as _r,openSync as Br,readFileSync as Gr,rmSync as Pr,writeFileSync as Fr}from"node:fs";import{dirname as Xr,join as pe,resolve as Yt}from"node:path";import{request as Hr}from"node:http";import{request as Yr}from"node:https";import{execFileSync as Nr}from"node:child_process";import{existsSync as me,mkdirSync as Ar,readFileSync as ue,readdirSync as Rr,rmSync as Ee,writeFileSync as A}from"node:fs";import{basename as Ot,dirname as Tt,join as f,resolve as Ut}from"node:path";function Nt(){return`import {useState, type FormEvent} from 'react'
405
+ Uso: team-cli auth login-with-token --email <email> --token <token> --code <codigo>`}import{spawn as ye}from"node:child_process";import{createServer as Vt}from"node:http";import{existsSync as Zo,mkdirSync as Yo,openSync as Do,readFileSync as zo,rmSync as ko,writeFileSync as Ko}from"node:fs";import{dirname as Vo,join as Ce,resolve as Lt}from"node:path";import{request as Lo}from"node:http";import{request as ea}from"node:https";import{execFileSync as Jo}from"node:child_process";import{existsSync as fe,mkdirSync as Wo,readFileSync as we,readdirSync as _o,rmSync as Oe,writeFileSync as N}from"node:fs";import{basename as Bt,dirname as Mt,join as f,resolve as Pt}from"node:path";var de="iUzDOAFCUx33tmT6OCea",k="VITE_JUSTO_MAP_TILER_TOKEN";function Qt(){return`import {useState, type FormEvent} from 'react'
406
406
  import {Badge} from '@/components/ui/badge'
407
407
  import {Button} from '@/components/ui/button'
408
408
  import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@/components/ui/card'
@@ -419,7 +419,9 @@ import {justoCli} from '@/lib/justo'
419
419
 
420
420
  const defaultCommand = 'auth status'
421
421
  const queryExample = "data queries preview <queryId> --params '{\\"limit\\":10}'"
422
- const mapTilerToken = 'Ug1j1WYGl6rn0I7x9Kuw'
422
+ const mapTilerToken =
423
+ (import.meta.env as {${k}?: string}).${k} ||
424
+ '${de}'
423
425
  const chartData = [
424
426
  {day: 'Lun', sessions: 12},
425
427
  {day: 'Mar', sessions: 18},
@@ -622,7 +624,7 @@ export function App() {
622
624
  }
623
625
 
624
626
  export default App
625
- `}function At(){return`type JustoCliFunction = <T = unknown>(command: string) => Promise<T>
627
+ `}function Jt(){return`type JustoCliFunction = <T = unknown>(command: string) => Promise<T>
626
628
  type JustoStreamFunction = <T = unknown>(
627
629
  command: string,
628
630
  onRow: (row: T) => Promise<void> | void,
@@ -724,7 +726,25 @@ async function callLocalPreviewStream<T>(
724
726
  return {rowCount}
725
727
  }
726
728
 
729
+ function ensurePreviewWindowJusto() {
730
+ if (window.justo) return window.justo
731
+
732
+ const env = import.meta.env as ImportMetaEnvWithJusto
733
+ if (!env.VITE_JUSTO_CLI_ENDPOINT || !env.VITE_JUSTO_STREAM_ENDPOINT) {
734
+ return undefined
735
+ }
736
+
737
+ window.justo = {
738
+ cli: callLocalPreviewCli,
739
+ stream: callLocalPreviewStream,
740
+ }
741
+
742
+ return window.justo
743
+ }
744
+
727
745
  export async function justoCli<T = unknown>(command: string) {
746
+ ensurePreviewWindowJusto()
747
+
728
748
  if (window.justo?.cli) {
729
749
  return await window.justo.cli<T>(command)
730
750
  }
@@ -736,13 +756,17 @@ export async function justoStream<T = unknown>(
736
756
  command: string,
737
757
  onRow: (row: T) => Promise<void> | void,
738
758
  ) {
759
+ ensurePreviewWindowJusto()
760
+
739
761
  if (window.justo?.stream) {
740
762
  return await window.justo.stream<T>(command, onRow)
741
763
  }
742
764
 
743
765
  return await callLocalPreviewStream<T>(command, onRow)
744
766
  }
745
- `}function Rt(e){return`# ${e}
767
+
768
+ ensurePreviewWindowJusto()
769
+ `}function Wt(e){return`# ${e}
746
770
 
747
771
  Starter de Justo Spaces generado por \`team-cli spaces init\`.
748
772
 
@@ -769,10 +793,11 @@ Flujo recomendado:
769
793
 
770
794
  Tip:
771
795
  - usa \`spaces preview --open\` para abrir el dashboard en el navegador por defecto y mostrárselo al usuario mientras lo iteras
772
- `}function vt(){return`import {StrictMode} from 'react'
796
+ `}function _t(){return`import {StrictMode} from 'react'
773
797
  import {createRoot} from 'react-dom/client'
774
798
  import App from './App.tsx'
775
799
  import './index.css'
800
+ import './lib/justo'
776
801
  import {ThemeProvider} from '@/components/theme-provider.tsx'
777
802
 
778
803
  createRoot(document.getElementById('root')!).render(
@@ -782,14 +807,14 @@ createRoot(document.getElementById('root')!).render(
782
807
  </ThemeProvider>
783
808
  </StrictMode>,
784
809
  )
785
- `}var Qt=".justo-space.json";function ce(e,t,o){Nr(e,t,{cwd:o,stdio:"inherit",env:{...process.env,CI:"1"}})}function vr(e){if(!e)throw Error("Falta --path. Ejemplo: team-cli spaces init --path ./mi-space-app");let t=Ut(e);if(me(t)){if(Rr(t).length>0)throw Error(`La carpeta ya existe y no está vacía: ${t}`);Ee(t,{recursive:!0,force:!0})}return Ar(Tt(t),{recursive:!0}),t}function Or(e){let t=f(e,"vite.config.ts"),o=ue(t,"utf-8");if(o.includes("base: './'"))return;let r=o.replace("export default defineConfig({",`export default defineConfig({
786
- base: './',`);A(t,r)}function Tr(e){let t=f(e,"tsconfig.app.json"),r=ue(t,"utf-8").replace('"noUnusedLocals": true,','"noUnusedLocals": false,').replace('"noUnusedParameters": true,','"noUnusedParameters": false,');A(t,r)}function Ur(e){let t=f(e,"package.json"),o=JSON.parse(ue(t,"utf-8"));o.dependencies=o.dependencies||{},o.devDependencies=o.devDependencies||{},o.dependencies.leaflet="^1.9.4",o.dependencies["react-leaflet"]="^5.0.0",o.devDependencies["@types/leaflet"]="^1.9.20",o.justoSpaceApp=!0,A(t,`${JSON.stringify(o,null,2)}
787
- `)}function Qr(e){let t=f(e,"src","index.css"),o=ue(t,"utf-8");if(o.includes("leaflet/dist/leaflet.css"))return;A(t,`@import "leaflet/dist/leaflet.css";
788
- ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx"),Nt()),A(f(e,"src","main.tsx"),vt()),A(f(e,"src","lib","justo.ts"),At()),A(f(e,Qt),`${JSON.stringify({template:"react-vite-shadcn",version:1},null,2)}
789
- `),Ee(f(e,".git"),{recursive:!0,force:!0})}function Wr(e){Ee(f(e,"package-lock.json"),{force:!0})}function je(e){let t=Ut(e);if(!me(t))throw Error(`No existe la app del space: ${t}`);if(!me(f(t,Qt)))throw Error("Este publish solo acepta apps creadas con team-cli spaces init. Debes apuntar al root de esa app.");return t}function Jt(e){let t=je(e);ce("yarn",["build"],t);let o=f(t,"dist");if(!me(f(o,"index.html")))throw Error("El build no generó dist/index.html");return o}function Wt(e){let t=vr(e),o=Tt(t),r=Ot(t);return ce("npx",["shadcn@latest","init","-t","vite","-d","-y","-n",r],o),ce("npx",["shadcn@latest","add","-a","-y"],t),Wr(t),Ur(t),ce("yarn",["install"],t),Or(t),Tr(t),Qr(t),Jr(t),{path:t,nextSteps:[`cd ${t}`,"team-cli spaces create --name '...' --description '...' --slug mi-space","team-cli spaces publish <spaceId> --path ."]}}function Mt(e){let t=[],o="",r=null,a=!1;for(let i of e){if(a){o+=i,a=!1;continue}if(i==="\\"){a=!0;continue}if(r){if(i===r)r=null;else o+=i;continue}if(i==='"'||i==="'"){r=i;continue}if(/\s/.test(i)){if(o)t.push(o),o="";continue}o+=i}if(r)throw Error("Comando inválido: falta cerrar una comilla");if(o)t.push(o);return t}var Zr=".justo-space-preview",Dr="preview.json",zr=30000;function ge(e){return pe(e,Zr)}function Zt(e){return pe(ge(e),Dr)}function _t(e){return pe(ge(e),"bridge.log")}function Bt(e){return pe(ge(e),"vite.log")}function Dt(e){_r(ge(e),{recursive:!0})}function le(e){if(!e)return;try{process.kill(e,"SIGTERM")}catch{return}}function kr(e){if(process.platform==="darwin")return{command:"open",args:[e]};if(process.platform==="win32")return{command:"cmd",args:["/c","start","",e]};return{command:"xdg-open",args:[e]}}async function Kr(e,t){if(!t)return{attempted:!1,opened:!1};let o=kr(e);return await new Promise((r)=>{let a=de(o.command,o.args,{stdio:"ignore",detached:!0});a.once("error",()=>{r({attempted:!0,opened:!1,message:"No se pudo abrir el navegador por defecto automáticamente. Abre la URL manualmente."})}),a.once("spawn",()=>{a.unref(),r({attempted:!0,opened:!0})})})}function Vr(e){let t=Zt(e);if(!Mr(t))return;try{let o=JSON.parse(Gr(t,"utf-8"));le(o.appPid),le(o.bridgePid)}catch{}Pr(t,{force:!0})}function Gt(){return new Promise((e,t)=>{let o=Ht();o.listen(0,"127.0.0.1",()=>{let r=o.address();if(!r||typeof r==="string"){o.close(),t(Error("No se pudo obtener un puerto libre"));return}let{port:a}=r;o.close((i)=>{if(i){t(i);return}e(a)})}),o.on("error",t)})}function Pt(e){return new Promise((t)=>setTimeout(t,e))}function Lr(e){return new Promise((t,o)=>{let i=(new URL(e).protocol==="https:"?Yr:Hr)(e,{method:"GET"},(n)=>{t(n.statusCode||0),n.resume()});i.on("error",o),i.end()})}async function Ft(e,t=zr){let o=Date.now();while(Date.now()-o<t){try{if(await Lr(e)>0)return}catch{await Pt(500);continue}await Pt(500)}throw Error(`Timeout esperando que el preview responda en ${e}`)}function ea(e){return Dt(Xr(e)),Br(e,"a")}function Xt(e,t,o,r,a){let i=ea(r),n=de(e,t,{cwd:o,detached:!0,stdio:["ignore",i,i],env:{...process.env,...a}});if(!n.pid)throw Error(`No se pudo iniciar el proceso ${e}`);return n.unref(),n.pid}function zt(){let e=ze("prod");if(!e)throw Error("Debes iniciar sesión en prod antes de usar spaces preview. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>");return e}async function ta(e){let t=[];for await(let o of e)t.push(Buffer.isBuffer(o)?o:Buffer.from(o));return Buffer.concat(t).toString("utf-8")}function D(e,t,o){e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"}),e.end(JSON.stringify(o))}function Ne(e){let t=e.trim(),o=new Set([0]);for(let a=0;a<t.length;a++)if(t[a]==="{"||t[a]==="[")o.add(a);let r=[...o].sort((a,i)=>i-a);for(let a of r)try{return JSON.parse(t.slice(a))}catch{continue}return t}function kt(e){return{...process.env,NODE_OPTIONS:"",__JUSTO_REPL_PORT:"",JUSTO_TEAM_CLI_EMAIL:e.email,JUSTO_TEAM_CLI_TOKEN:e.token,JUSTO_TEAM_CLI_REFRESH_TOKEN:e.refreshToken,JUSTO_TEAM_CLI_INTERACTIVE:"false",JUSTO_TEAM_CLI_DEVICE_ID:"spaces-preview"}}function oa(e,t,o,r){return new Promise((a,i)=>{let n=de("node",[t,"--env","prod",...r,"--format","json"],{cwd:process.cwd(),env:kt(o),stdio:["ignore","pipe","pipe"]}),s="";n.stdout.on("data",(c)=>{if(!e.headersSent)e.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"});e.write(c)}),n.stderr.on("data",(c)=>{s+=Buffer.from(c).toString("utf-8")}),n.on("error",i),n.on("close",(c)=>{if(!c){if(!e.headersSent)e.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"});e.end(),a();return}let u=Ne(s.trim());i(Error(u.error||s.trim()||"justoStream failed"))})})}async function Kt(e){let t=Number(e.port);if(!t)throw Error("Falta --port para el bridge interno de preview");let o=zt(),r=Yt(e["cli-path"]||process.argv[1]||""),a=Ht(async(i,n)=>{if(i.method==="OPTIONS"){D(n,200,{ok:!0});return}if(i.method==="GET"&&i.url==="/__justo/health"){D(n,200,{ok:!0});return}if(i.method!=="POST"||i.url!=="/__justo/cli"&&i.url!=="/__justo/stream"){D(n,404,{ok:!1,error:"Not found"});return}try{let s=await ta(i),u=JSON.parse(s||"{}").command;if(!u)throw Error("Debes indicar un comando");let l=Array.isArray(u)?u:Mt(u);if(i.url==="/__justo/stream"){await oa(n,r,o,l);return}let g=await new Promise((p,C)=>{let w=de("node",[r,"--env","prod",...l,"--format","json"],{cwd:process.cwd(),env:kt(o),stdio:["ignore","pipe","pipe"]}),V=[],Q=[];w.stdout.on("data",(v)=>V.push(Buffer.from(v))),w.stderr.on("data",(v)=>Q.push(Buffer.from(v))),w.on("error",C),w.on("close",(v)=>{let B=Buffer.concat(V).toString("utf-8")||Buffer.concat(Q).toString("utf-8");if(v&&v!==0){let vo=Ne(B);C(Error(vo.error||B||"justoCli failed"));return}p(Ne(B))})});D(n,200,{result:g})}catch(s){let c=s instanceof Error?s.message:"Unexpected error";D(n,400,{error:c})}});await new Promise((i,n)=>{a.listen(t,"127.0.0.1",()=>i()),a.on("error",n)}),y(`Space preview bridge listening on http://127.0.0.1:${t}
790
- `),await new Promise((i,n)=>{a.on("close",()=>i()),a.on("error",n)})}async function Vt(e){let t=e.path;if(!t)throw Error("Falta --path. Ejemplo: team-cli spaces preview --path ./mi-space-app");let o=je(t);zt(),Dt(o),Vr(o);let r=Number(e.port)||await Gt(),a=Number(e["bridge-port"])||await Gt(),i=e.open==="true",n=`http://127.0.0.1:${r}`,s=`http://127.0.0.1:${a}/__justo/cli`,c=`http://127.0.0.1:${a}/__justo/stream`,u=Yt(process.argv[1]||""),l=Xt("node",[u,"__spaces-preview-bridge","--port",String(a),"--cli-path",u],process.cwd(),_t(o),{}),g=Xt("yarn",["dev","--host","127.0.0.1","--port",String(r)],o,Bt(o),{VITE_JUSTO_CLI_ENDPOINT:s,VITE_JUSTO_STREAM_ENDPOINT:c,VITE_JUSTO_CLI_MODE:"preview"});try{await Ft(`http://127.0.0.1:${a}/__justo/health`),await Ft(n)}catch(w){throw le(g),le(l),w}let p={appPid:g,bridgePid:l,previewUrl:n,bridgeUrl:s,streamUrl:c,cliEnv:"prod"};Fr(Zt(o),`${JSON.stringify(p,null,2)}
791
- `);let C=await Kr(n,i);return{ok:!0,path:o,previewUrl:n,bridgeUrl:s,streamUrl:c,cliEnv:"prod",appPid:g,bridgePid:l,logs:{app:Bt(o),bridge:_t(o)},open:C}}import{writeFileSync as pa}from"node:fs";import{mkdtempSync as ra,readFileSync as aa,rmSync as ia,writeFileSync as na}from"node:fs";import{tmpdir as sa}from"node:os";import{join as Lt}from"node:path";import{spawnSync as ca}from"node:child_process";function ma(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function eo(e,t){if(e==null)return;if(!Array.isArray(e)||e.some((o)=>typeof o!=="string"))throw Error(`${t} debe ser un arreglo de strings.`);return e}function ua(e){if(!Array.isArray(e))throw Error("variables debe ser un arreglo.");return e.map((t,o)=>{if(!t||typeof t!=="object"||Array.isArray(t))throw Error(`variables[${o}] debe ser un objeto.`);let r=t;if(typeof r.key!=="string"||!r.key)throw Error(`variables[${o}].key debe ser un string no vacío.`);if(typeof r.fieldType!=="string"||!r.fieldType)throw Error(`variables[${o}].fieldType debe ser un string no vacío.`);if(r.fieldParams!=null&&typeof r.fieldParams!=="string")throw Error(`variables[${o}].fieldParams debe ser un string.`);return{key:r.key,fieldType:r.fieldType,fieldParams:typeof r.fieldParams==="string"?r.fieldParams:void 0}})}function la(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("El archivo editado debe contener un objeto JSON.");let t=e;if(typeof t.name!=="string"||!t.name.trim())throw Error("name debe ser un string no vacío.");if(t.description!=null&&typeof t.description!=="string")throw Error("description debe ser un string.");if(typeof t.collection!=="string"||!t.collection.trim())throw Error("collection debe ser un string no vacío.");if(typeof t.pipeline!=="string")throw Error("pipeline debe ser un string.");return{name:t.name.trim(),description:t.description?.trim()||void 0,collection:t.collection.trim(),allowedUsersIds:eo(t.allowedUsersIds,"allowedUsersIds")??[],tags:eo(t.tags,"tags")??[],pipeline:t.pipeline,variables:ua(t.variables)}}function to(e){let t=process.env.VISUAL||process.env.EDITOR||"vi",o=ra(Lt(sa(),"team-cli-query-")),r=Lt(o,"aggregation-query.json");na(r,`${JSON.stringify(e,null,2)}
792
- `);let a=`${t} ${ma(r)}`,i=ca(a,{shell:!0,stdio:"inherit"});if(i.error)throw Error(`No se pudo abrir el editor "${t}": ${i.error.message}`);if(i.status!==0)throw Error(`El editor terminó con código ${i.status}.`);try{let n=aa(r,"utf-8");if(!n.trim())throw Error("El archivo quedó vacío.");let s;try{s=JSON.parse(n)}catch{throw Error("El archivo editado no contiene JSON válido.")}return la(s)}finally{ia(o,{recursive:!0,force:!0})}}function R(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function T(e,t){let o=e[3];if(!o)throw Error(`Uso: ${t}`);return o}function z(e){if(!e.params)return{};try{return JSON.parse(e.params)}catch{throw Error("--params debe ser un JSON válido.")}}function oo(e){let t=e.limit;if(!t)throw Error("--limit es requerido. Ejemplo: --limit 1000");let o=Number(t);if(!Number.isInteger(o)||o<=0)throw Error("--limit debe ser un entero positivo.");return o}function Ae(e){if(typeof e!=="string")return e;try{return JSON.parse(e)}catch{return{value:e}}}async function k(e){return(await m({service:"data",query:`query ($aggregationQueryId: String) {
810
+ `}function pe(){return process.execPath}function Q(e){if(process.platform==="win32")return`${e}.cmd`;return e}var Gt=".justo-space.json";function ge(e,t,r){Jo(e,t,{cwd:r,stdio:"inherit",env:{...process.env,CI:"1"}})}function Bo(e){if(!e)throw Error("Falta --path. Ejemplo: team-cli spaces init --path ./mi-space-app");let t=Pt(e);if(fe(t)){if(_o(t).length>0)throw Error(`La carpeta ya existe y no está vacía: ${t}`);Oe(t,{recursive:!0,force:!0})}return Wo(Mt(t),{recursive:!0}),t}function Mo(e){let t=f(e,"vite.config.ts"),r=we(t,"utf-8");if(r.includes("base: './'"))return;let o=r.replace("export default defineConfig({",`export default defineConfig({
811
+ base: './',`);N(t,o)}function Po(e){let t=f(e,"tsconfig.app.json"),o=we(t,"utf-8").replace('"noUnusedLocals": true,','"noUnusedLocals": false,').replace('"noUnusedParameters": true,','"noUnusedParameters": false,');N(t,o)}function Go(e){let t=f(e,"package.json"),r=JSON.parse(we(t,"utf-8"));r.dependencies=r.dependencies||{},r.devDependencies=r.devDependencies||{},r.dependencies.leaflet="^1.9.4",r.dependencies["react-leaflet"]="^5.0.0",r.devDependencies["@types/leaflet"]="^1.9.20",r.justoSpaceApp=!0,N(t,`${JSON.stringify(r,null,2)}
812
+ `)}function Fo(e){let t=f(e,"src","index.css"),r=we(t,"utf-8");if(r.includes("leaflet/dist/leaflet.css"))return;N(t,`@import "leaflet/dist/leaflet.css";
813
+ ${r}`)}function Xo(e){let t=Bt(e);N(f(e,"README.md"),Wt(t)),N(f(e,"src","App.tsx"),Qt()),N(f(e,"src","main.tsx"),_t()),N(f(e,"src","lib","justo.ts"),Jt()),N(f(e,Gt),`${JSON.stringify({template:"react-vite-shadcn",version:1},null,2)}
814
+ `),Oe(f(e,".git"),{recursive:!0,force:!0})}function Ho(e){Oe(f(e,"package-lock.json"),{force:!0})}function Ue(e){let t=Pt(e);if(!fe(t))throw Error(`No existe la app del space: ${t}`);if(!fe(f(t,Gt)))throw Error("Este publish solo acepta apps creadas con team-cli spaces init. Debes apuntar al root de esa app.");return t}function Ft(e){let t=Ue(e);ge(Q("yarn"),["build"],t);let r=f(t,"dist");if(!fe(f(r,"index.html")))throw Error("El build no generó dist/index.html");return r}function Xt(e){let t=Bo(e),r=Mt(t),o=Bt(t);return ge(Q("npx"),["shadcn@latest","init","-t","vite","-d","-y","-n",o],r),ge(Q("npx"),["shadcn@latest","add","-a","-y"],t),Ho(t),Go(t),ge(Q("yarn"),["install"],t),Mo(t),Po(t),Fo(t),Xo(t),{path:t,nextSteps:[`cd ${t}`,"team-cli spaces create --name '...' --description '...' --slug mi-space","team-cli spaces publish <spaceId> --path ."]}}function Ht(e){let t=[],r="",o=null,a=!1;for(let n of e){if(a){r+=n,a=!1;continue}if(n==="\\"){a=!0;continue}if(o){if(n===o)o=null;else r+=n;continue}if(n==='"'||n==="'"){o=n;continue}if(/\s/.test(n)){if(r)t.push(r),r="";continue}r+=n}if(o)throw Error("Comando inválido: falta cerrar una comilla");if(r)t.push(r);return t}var ta=".justo-space-preview",ra="preview.json",oa=30000;function qe(e){return Ce(e,ta)}function er(e){return Ce(qe(e),ra)}function Zt(e){return Ce(qe(e),"bridge.log")}function Yt(e){return Ce(qe(e),"vite.log")}function tr(e){Yo(qe(e),{recursive:!0})}function be(e){if(!e)return;try{process.kill(e,"SIGTERM")}catch{return}}function aa(e){if(process.platform==="darwin")return{command:"open",args:[e]};if(process.platform==="win32")return{command:"cmd",args:["/c","start","",e]};return{command:"xdg-open",args:[e]}}async function na(e,t){if(!t)return{attempted:!1,opened:!1};let r=aa(e);return await new Promise((o)=>{let a=ye(r.command,r.args,{stdio:"ignore",detached:!0});a.once("error",()=>{o({attempted:!0,opened:!1,message:"No se pudo abrir el navegador por defecto automáticamente. Abre la URL manualmente."})}),a.once("spawn",()=>{a.unref(),o({attempted:!0,opened:!0})})})}function ia(e){let t=er(e);if(!Zo(t))return;try{let r=JSON.parse(zo(t,"utf-8"));be(r.appPid),be(r.bridgePid)}catch{}ko(t,{force:!0})}function Dt(){return new Promise((e,t)=>{let r=Vt();r.listen(0,"127.0.0.1",()=>{let o=r.address();if(!o||typeof o==="string"){r.close(),t(Error("No se pudo obtener un puerto libre"));return}let{port:a}=o;r.close((n)=>{if(n){t(n);return}e(a)})}),r.on("error",t)})}function zt(e){return new Promise((t)=>setTimeout(t,e))}function sa(e){return new Promise((t,r)=>{let n=(new URL(e).protocol==="https:"?ea:Lo)(e,{method:"GET"},(i)=>{t(i.statusCode||0),i.resume()});n.on("error",r),n.end()})}async function kt(e,t=oa){let r=Date.now();while(Date.now()-r<t){try{if(await sa(e)>0)return}catch{await zt(500);continue}await zt(500)}throw Error(`Timeout esperando que el preview responda en ${e}`)}function ca(e){return tr(Vo(e)),Do(e,"a")}function Kt(e,t,r,o,a){let n=ca(o),i=ye(e,t,{cwd:r,detached:!0,stdio:["ignore",n,n],env:{...process.env,...a}});if(!i.pid)throw Error(`No se pudo iniciar el proceso ${e}`);return i.unref(),i.pid}function rr(){let e=rt("prod");if(!e)throw Error("Debes iniciar sesión en prod antes de usar spaces preview. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>");return e}async function ua(e){let t=[];for await(let r of e)t.push(Buffer.isBuffer(r)?r:Buffer.from(r));return Buffer.concat(t).toString("utf-8")}function K(e,t,r){e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"}),e.end(JSON.stringify(r))}function Qe(e){let t=e.trim(),r=new Set([0]);for(let a=0;a<t.length;a++)if(t[a]==="{"||t[a]==="[")r.add(a);let o=[...r].sort((a,n)=>n-a);for(let a of o)try{return JSON.parse(t.slice(a))}catch{continue}return t}function or(e){return{...process.env,NODE_OPTIONS:"",__JUSTO_REPL_PORT:"",JUSTO_TEAM_CLI_EMAIL:e.email,JUSTO_TEAM_CLI_TOKEN:e.token,JUSTO_TEAM_CLI_REFRESH_TOKEN:e.refreshToken,JUSTO_TEAM_CLI_INTERACTIVE:"false",JUSTO_TEAM_CLI_DEVICE_ID:"spaces-preview"}}function ma(e,t){return{VITE_JUSTO_CLI_ENDPOINT:e,VITE_JUSTO_STREAM_ENDPOINT:t,VITE_JUSTO_CLI_MODE:"preview",[k]:de}}function la(e,t,r,o){return new Promise((a,n)=>{let i=ye(pe(),[t,"--env","prod",...o,"--format","json"],{cwd:process.cwd(),env:or(r),stdio:["ignore","pipe","pipe"]}),s="";i.stdout.on("data",(c)=>{if(!e.headersSent)e.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"});e.write(c)}),i.stderr.on("data",(c)=>{s+=Buffer.from(c).toString("utf-8")}),i.on("error",n),i.on("close",(c)=>{if(!c){if(!e.headersSent)e.writeHead(200,{"Content-Type":"application/x-ndjson; charset=utf-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type","Access-Control-Allow-Methods":"POST,OPTIONS,GET"});e.end(),a();return}let m=Qe(s.trim());n(Error(m.error||s.trim()||"justoStream failed"))})})}async function ar(e){let t=Number(e.port);if(!t)throw Error("Falta --port para el bridge interno de preview");let r=rr(),o=Lt(e["cli-path"]||process.argv[1]||""),a=Vt(async(n,i)=>{if(n.method==="OPTIONS"){K(i,200,{ok:!0});return}if(n.method==="GET"&&n.url==="/__justo/health"){K(i,200,{ok:!0});return}if(n.method!=="POST"||n.url!=="/__justo/cli"&&n.url!=="/__justo/stream"){K(i,404,{ok:!1,error:"Not found"});return}try{let s=await ua(n),m=JSON.parse(s||"{}").command;if(!m)throw Error("Debes indicar un comando");let l=Array.isArray(m)?m:Ht(m);if(n.url==="/__justo/stream"){await la(i,o,r,l);return}let g=await new Promise((p,C)=>{let w=ye(pe(),[o,"--env","prod",...l,"--format","json"],{cwd:process.cwd(),env:or(r),stdio:["ignore","pipe","pipe"]}),re=[],W=[];w.stdout.on("data",(R)=>re.push(Buffer.from(R))),w.stderr.on("data",(R)=>W.push(Buffer.from(R))),w.on("error",C),w.on("close",(R)=>{let G=Buffer.concat(re).toString("utf-8")||Buffer.concat(W).toString("utf-8");if(R&&R!==0){let _r=Qe(G);C(Error(_r.error||G||"justoCli failed"));return}p(Qe(G))})});K(i,200,{result:g})}catch(s){let c=s instanceof Error?s.message:"Unexpected error";K(i,400,{error:c})}});await new Promise((n,i)=>{a.listen(t,"127.0.0.1",()=>n()),a.on("error",i)}),y(`Space preview bridge listening on http://127.0.0.1:${t}
815
+ `),await new Promise((n,i)=>{a.on("close",()=>n()),a.on("error",i)})}async function nr(e){let t=e.path;if(!t)throw Error("Falta --path. Ejemplo: team-cli spaces preview --path ./mi-space-app");let r=Ue(t);rr(),tr(r),ia(r);let o=Number(e.port)||await Dt(),a=Number(e["bridge-port"])||await Dt(),n=e.open==="true",i=`http://127.0.0.1:${o}`,s=`http://127.0.0.1:${a}/__justo/cli`,c=`http://127.0.0.1:${a}/__justo/stream`,m=Lt(process.argv[1]||""),l=Kt(pe(),[m,"__spaces-preview-bridge","--port",String(a),"--cli-path",m],process.cwd(),Zt(r),{}),g=Kt(Q("yarn"),["dev","--host","127.0.0.1","--port",String(o)],r,Yt(r),ma(s,c));try{await kt(`http://127.0.0.1:${a}/__justo/health`),await kt(i)}catch(w){throw be(g),be(l),w}let p={appPid:g,bridgePid:l,previewUrl:i,bridgeUrl:s,streamUrl:c,cliEnv:"prod"};Ko(er(r),`${JSON.stringify(p,null,2)}
816
+ `);let C=await na(i,n);return{ok:!0,path:r,previewUrl:i,bridgeUrl:s,streamUrl:c,cliEnv:"prod",appPid:g,bridgePid:l,logs:{app:Yt(r),bridge:Zt(r)},open:C}}import{writeFileSync as ha}from"node:fs";import{mkdtempSync as da,readFileSync as pa,rmSync as ga,writeFileSync as fa}from"node:fs";import{tmpdir as wa}from"node:os";import{join as ir}from"node:path";import{spawnSync as ba}from"node:child_process";function ya(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function sr(e,t){if(e==null)return;if(!Array.isArray(e)||e.some((r)=>typeof r!=="string"))throw Error(`${t} debe ser un arreglo de strings.`);return e}function Ca(e){if(!Array.isArray(e))throw Error("variables debe ser un arreglo.");return e.map((t,r)=>{if(!t||typeof t!=="object"||Array.isArray(t))throw Error(`variables[${r}] debe ser un objeto.`);let o=t;if(typeof o.key!=="string"||!o.key)throw Error(`variables[${r}].key debe ser un string no vacío.`);if(typeof o.fieldType!=="string"||!o.fieldType)throw Error(`variables[${r}].fieldType debe ser un string no vacío.`);if(o.fieldParams!=null&&typeof o.fieldParams!=="string")throw Error(`variables[${r}].fieldParams debe ser un string.`);return{key:o.key,fieldType:o.fieldType,fieldParams:typeof o.fieldParams==="string"?o.fieldParams:void 0}})}function qa(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("El archivo editado debe contener un objeto JSON.");let t=e;if(typeof t.name!=="string"||!t.name.trim())throw Error("name debe ser un string no vacío.");if(t.description!=null&&typeof t.description!=="string")throw Error("description debe ser un string.");if(typeof t.collection!=="string"||!t.collection.trim())throw Error("collection debe ser un string no vacío.");if(typeof t.pipeline!=="string")throw Error("pipeline debe ser un string.");return{name:t.name.trim(),description:t.description?.trim()||void 0,collection:t.collection.trim(),allowedUsersIds:sr(t.allowedUsersIds,"allowedUsersIds")??[],tags:sr(t.tags,"tags")??[],pipeline:t.pipeline,variables:Ca(t.variables)}}function cr(e){let t=process.env.VISUAL||process.env.EDITOR||"vi",r=da(ir(wa(),"team-cli-query-")),o=ir(r,"aggregation-query.json");fa(o,`${JSON.stringify(e,null,2)}
817
+ `);let a=`${t} ${ya(o)}`,n=ba(a,{shell:!0,stdio:"inherit"});if(n.error)throw Error(`No se pudo abrir el editor "${t}": ${n.error.message}`);if(n.status!==0)throw Error(`El editor terminó con código ${n.status}.`);try{let i=pa(o,"utf-8");if(!i.trim())throw Error("El archivo quedó vacío.");let s;try{s=JSON.parse(i)}catch{throw Error("El archivo editado no contiene JSON válido.")}return qa(s)}finally{ga(r,{recursive:!0,force:!0})}}function v(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function O(e,t){let r=e[3];if(!r)throw Error(`Uso: ${t}`);return r}function V(e){if(!e.params)return{};try{return JSON.parse(e.params)}catch{throw Error("--params debe ser un JSON válido.")}}function ur(e){let t=e.limit;if(!t)throw Error("--limit es requerido. Ejemplo: --limit 1000");let r=Number(t);if(!Number.isInteger(r)||r<=0)throw Error("--limit debe ser un entero positivo.");return r}function Je(e){if(typeof e!=="string")return e;try{return JSON.parse(e)}catch{return{value:e}}}async function L(e){return(await u({service:"data",query:`query ($aggregationQueryId: String) {
793
818
  aggregationQuery(aggregationQueryId: $aggregationQueryId) {
794
819
  _id
795
820
  name
@@ -805,11 +830,11 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
805
830
  fieldParams
806
831
  }
807
832
  }
808
- }`,variables:{aggregationQueryId:e}})).aggregationQuery}function ro(e){return{name:e.name,description:e.description,collection:e.collection,allowedUsersIds:e.allowedUsersIds??[],tags:e.tags??[],pipeline:e.pipeline,variables:e.variables??[]}}async function Re(e,t){let o=await m({service:"data",query:`mutation ($aggregationQueryId: String, $params: JSON) {
833
+ }`,variables:{aggregationQueryId:e}})).aggregationQuery}function mr(e){return{name:e.name,description:e.description,collection:e.collection,allowedUsersIds:e.allowedUsersIds??[],tags:e.tags??[],pipeline:e.pipeline,variables:e.variables??[]}}async function We(e,t){let r=await u({service:"data",query:`mutation ($aggregationQueryId: String, $params: JSON) {
809
834
  testAggregationQuery(aggregationQueryId: $aggregationQueryId, params: $params)
810
- }`,variables:{aggregationQueryId:e,params:t}});return Ae(o.testAggregationQuery)}function da(e){try{return JSON.parse(e).error||e}catch{return e}}async function ao(e,t,o){let r=await fetch(`${$("data")}/aggregation-queries/${e}/run`,{method:"POST",headers:await xe(),body:JSON.stringify({params:t,limit:o}),signal:AbortSignal.timeout(315000)});if(!r.ok){let u=await r.text();throw Error(da(u)||"No se pudo ejecutar el query.")}if(!r.body)throw Error("El servidor no devolvió un stream de datos.");let a=r.body.getReader(),i=new TextDecoder,n="",s=0;while(!0){let{done:u,value:l}=await a.read();if(u)break;let g=i.decode(l,{stream:!0});process.stdout.write(g),n+=g;let p=n.indexOf(`
811
- `);while(p>=0){if(n.slice(0,p).trim())s++;n=n.slice(p+1),p=n.indexOf(`
812
- `)}}let c=i.decode();if(c)process.stdout.write(c),n+=c;if(n.trim())s++;return{ok:!0,queryId:e,limit:o,rows:s}}async function ve(e,t){await m({service:"data",query:`mutation ($aggregationQueryId: String, $aggregationQuery: UpdateAggregationQueryInput) {
835
+ }`,variables:{aggregationQueryId:e,params:t}});return Je(r.testAggregationQuery)}function Ia(e){try{return JSON.parse(e).error||e}catch{return e}}async function lr(e,t,r){let o=await fetch(`${h("data")}/aggregation-queries/${e}/run`,{method:"POST",headers:await ve(),body:JSON.stringify({params:t,limit:r}),signal:AbortSignal.timeout(315000)});if(!o.ok){let m=await o.text();throw Error(Ia(m)||"No se pudo ejecutar el query.")}if(!o.body)throw Error("El servidor no devolvió un stream de datos.");let a=o.body.getReader(),n=new TextDecoder,i="",s=0;while(!0){let{done:m,value:l}=await a.read();if(m)break;let g=n.decode(l,{stream:!0});process.stdout.write(g),i+=g;let p=i.indexOf(`
836
+ `);while(p>=0){if(i.slice(0,p).trim())s++;i=i.slice(p+1),p=i.indexOf(`
837
+ `)}}let c=n.decode();if(c)process.stdout.write(c),i+=c;if(i.trim())s++;return{ok:!0,queryId:e,limit:r,rows:s}}async function _e(e,t){await u({service:"data",query:`mutation ($aggregationQueryId: String, $aggregationQuery: UpdateAggregationQueryInput) {
813
838
  updateAggregationQuery(
814
839
  aggregationQueryId: $aggregationQueryId
815
840
  aggregationQuery: $aggregationQuery
@@ -822,7 +847,7 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
822
847
  tags
823
848
  currentVersionIndex
824
849
  }
825
- }`,variables:{aggregationQueryId:e,aggregationQuery:{name:t.name,description:t.description,collection:t.collection,allowedUsersIds:t.allowedUsersIds,tags:t.tags}}}),await m({service:"data",query:`mutation ($aggregationQueryId: String, $pipeline: String, $variables: [AggregationQueryVariableInput]) {
850
+ }`,variables:{aggregationQueryId:e,aggregationQuery:{name:t.name,description:t.description,collection:t.collection,allowedUsersIds:t.allowedUsersIds,tags:t.tags}}}),await u({service:"data",query:`mutation ($aggregationQueryId: String, $pipeline: String, $variables: [AggregationQueryVariableInput]) {
826
851
  addAggregationQueryVersion(
827
852
  aggregationQueryId: $aggregationQueryId
828
853
  pipeline: $pipeline
@@ -831,7 +856,7 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
831
856
  _id
832
857
  currentVersionIndex
833
858
  }
834
- }`,variables:{aggregationQueryId:e,pipeline:t.pipeline,variables:t.variables}})}async function io(){return(await m({service:"data",query:`mutation {
859
+ }`,variables:{aggregationQueryId:e,pipeline:t.pipeline,variables:t.variables}})}async function dr(){return(await u({service:"data",query:`mutation {
835
860
  createAggregationQuery {
836
861
  _id
837
862
  name
@@ -847,7 +872,7 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
847
872
  fieldParams
848
873
  }
849
874
  }
850
- }`})).createAggregationQuery}function ga(e){if(!Array.isArray(e))throw Error("El preview del query debe devolver un arreglo para usar AI edit.");return e}async function fa(e){let t=await m({service:"messenger",query:`mutation generateAdminQuery(
875
+ }`})).createAggregationQuery}function $a(e){if(!Array.isArray(e))throw Error("El preview del query debe devolver un arreglo para usar AI edit.");return e}async function xa(e){let t=await u({service:"messenger",query:`mutation generateAdminQuery(
851
876
  $prompt: String
852
877
  $name: String
853
878
  $description: String
@@ -873,13 +898,13 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
873
898
  aggregationDescription
874
899
  aggregationName
875
900
  }
876
- }`,variables:e});if(!t.generateAdminQuery?.pipeline||!t.generateAdminQuery.fullCollectionName)throw Error("La IA no devolvió una versión válida del query.");return t.generateAdminQuery}async function no(){return R(),await io()}async function so(e){R();let t=T(e,"team-cli data queries edit <queryId>"),o=await k(t),r=to(ro(o));return await ve(t,r),{ok:!0,queryId:t,name:r.name,collection:r.collection}}async function co(e,t){R();let o=T(e,"team-cli data queries ai-edit <queryId> --prompt '<texto>' [--params '<json>']"),r=await k(o),a=t.prompt||await Z("Describe los cambios para la IA: ");if(!a)throw Error("Debes indicar un prompt para AI edit.");let i=z(t),n;if(t.params){y(`Obteniendo preview del query actual...
877
- `);try{let c=await Re(o,i);n=ga(c)}catch(c){let u=c instanceof Error?c.message:String(c);throw Error(`No se pudo obtener el preview para AI edit: ${u}`)}}y(`Generando propuesta con IA...
878
- `);let s=await fa({prompt:a,fullCollectionName:r.collection,pipeline:r.pipeline,preview:n,description:r.description,name:r.name,variables:r.variables});return await ve(o,{name:r.name==="Nuevo query"?s.aggregationName||r.name:r.name,description:r.description||s.aggregationDescription,collection:s.fullCollectionName,allowedUsersIds:r.allowedUsersIds??[],tags:r.tags??[],pipeline:s.pipeline,variables:s.variables??[]}),{ok:!0,queryId:o,responseText:s.responseText,collection:s.fullCollectionName,name:s.aggregationName,description:s.aggregationDescription}}async function mo(e){R();let t=T(e,"team-cli data queries view <queryId>");return await k(t)}async function uo(e){R();let t=T(e,"team-cli data queries view-pipeline <queryId>"),o=await k(t);return{queryId:t,pipeline:o.pipeline}}async function lo(e,t){R();let o=T(e,"team-cli data queries preview <queryId> --params '<json>'"),r=z(t),a=await Re(o,r);return Ae(a)}async function po(e,t){R();let o=T(e,"team-cli data queries run <queryId> --limit <n> --params '<json>'"),r=z(t),a=oo(t);return await ao(o,r,a),{__streamHandled:!0}}function wa(e){return new Promise((t)=>setTimeout(t,e))}async function go(e,t){R();let o=T(e,"team-cli data queries download <queryId> --params '<json>'"),r=z(t);if(!t.path)throw Error("--path es requerido. Ejemplo: --path resultado.xlsx");y(`Iniciando descarga...
879
- `);let i=(await m({service:"data",query:`mutation ($aggregationQueryId: String, $params: JSON) {
901
+ }`,variables:e});if(!t.generateAdminQuery?.pipeline||!t.generateAdminQuery.fullCollectionName)throw Error("La IA no devolvió una versión válida del query.");return t.generateAdminQuery}async function pr(){return v(),await dr()}async function gr(e){v();let t=O(e,"team-cli data queries edit <queryId>"),r=await L(t),o=cr(mr(r));return await _e(t,o),{ok:!0,queryId:t,name:o.name,collection:o.collection}}async function fr(e,t){v();let r=O(e,"team-cli data queries ai-edit <queryId> --prompt '<texto>' [--params '<json>']"),o=await L(r),a=t.prompt||await z("Describe los cambios para la IA: ");if(!a)throw Error("Debes indicar un prompt para AI edit.");let n=V(t),i;if(t.params){y(`Obteniendo preview del query actual...
902
+ `);try{let c=await We(r,n);i=$a(c)}catch(c){let m=c instanceof Error?c.message:String(c);throw Error(`No se pudo obtener el preview para AI edit: ${m}`)}}y(`Generando propuesta con IA...
903
+ `);let s=await xa({prompt:a,fullCollectionName:o.collection,pipeline:o.pipeline,preview:i,description:o.description,name:o.name,variables:o.variables});return await _e(r,{name:o.name==="Nuevo query"?s.aggregationName||o.name:o.name,description:o.description||s.aggregationDescription,collection:s.fullCollectionName,allowedUsersIds:o.allowedUsersIds??[],tags:o.tags??[],pipeline:s.pipeline,variables:s.variables??[]}),{ok:!0,queryId:r,responseText:s.responseText,collection:s.fullCollectionName,name:s.aggregationName,description:s.aggregationDescription}}async function wr(e){v();let t=O(e,"team-cli data queries view <queryId>");return await L(t)}async function br(e){v();let t=O(e,"team-cli data queries view-pipeline <queryId>"),r=await L(t);return{queryId:t,pipeline:r.pipeline}}async function yr(e,t){v();let r=O(e,"team-cli data queries preview <queryId> --params '<json>'"),o=V(t),a=await We(r,o);return Je(a)}async function Cr(e,t){v();let r=O(e,"team-cli data queries run <queryId> --limit <n> --params '<json>'"),o=V(t),a=ur(t);return await lr(r,o,a),{__streamHandled:!0}}function Sa(e){return new Promise((t)=>setTimeout(t,e))}async function qr(e,t){v();let r=O(e,"team-cli data queries download <queryId> --params '<json>'"),o=V(t);if(!t.path)throw Error("--path es requerido. Ejemplo: --path resultado.xlsx");y(`Iniciando descarga...
904
+ `);let n=(await u({service:"data",query:`mutation ($aggregationQueryId: String, $params: JSON) {
880
905
  downloadAggregationQueryData(aggregationQueryId: $aggregationQueryId, params: $params)
881
- }`,variables:{aggregationQueryId:o,params:r}})).downloadAggregationQueryData;y(`Reporte en proceso (${i})...
882
- `);let n=null;while(!n){await wa(1000);let u=await m({service:"data",query:`query ($id: String) {
906
+ }`,variables:{aggregationQueryId:r,params:o}})).downloadAggregationQueryData;y(`Reporte en proceso (${n})...
907
+ `);let i=null;while(!i){await Sa(1000);let m=await u({service:"data",query:`query ($id: String) {
883
908
  getAsyncReport(id: $id) {
884
909
  _id
885
910
  status
@@ -887,15 +912,17 @@ ${o}`)}function Jr(e){let t=Ot(e);A(f(e,"README.md"),Rt(t)),A(f(e,"src","App.tsx
887
912
  fileUrl
888
913
  }
889
914
  getAsyncReportRecordsCount(id: $id)
890
- }`,variables:{id:i}}),l=u.getAsyncReport,g=u.getAsyncReportRecordsCount;if(l.status==="error")throw Error("El reporte falló al generarse.");if(l.fileUrl)n=l.fileUrl;else{let p=l.estimatedRecordsCount?` (~${l.estimatedRecordsCount} registros)`:"",C=g!=null?` ${g} procesados`:"";y(`\rGenerando...${p}${C}`)}}y(`
915
+ }`,variables:{id:n}}),l=m.getAsyncReport,g=m.getAsyncReportRecordsCount;if(l.status==="error")throw Error("El reporte falló al generarse.");if(l.fileUrl)i=l.fileUrl;else{let p=l.estimatedRecordsCount?` (~${l.estimatedRecordsCount} registros)`:"",C=g!=null?` ${g} procesados`:"";y(`\rGenerando...${p}${C}`)}}y(`
891
916
  Descargando archivo...
892
- `);let s=await fetch(n);if(!s.ok)throw Error(`Error descargando archivo: ${s.status}`);let c=Buffer.from(await s.arrayBuffer());return pa(t.path,c),{ok:!0,queryId:o,asyncReportId:i,outputPath:t.path,fileUrl:n}}function Oe(){return`team-cli data
917
+ `);let s=await fetch(i);if(!s.ok)throw Error(`Error descargando archivo: ${s.status}`);let c=Buffer.from(await s.arrayBuffer());return ha(t.path,c),{ok:!0,queryId:r,asyncReportId:n,outputPath:t.path,fileUrl:i}}function Be(){return`team-cli data
893
918
 
894
919
  Comandos de datos y reportes.
895
920
 
896
921
  Recomendado:
897
922
  Si necesitas obtener data y no existe un query listo, usa create + ai-edit.
898
923
  Flujo sugerido: create -> ai-edit -> preview -> run o download.
924
+ Siempre que puedas, prefiere varias queries simples antes que un solo pipeline con lookup.
925
+ Para dashboards suele ser mejor resolver joins en la UI o con queries separadas.
899
926
 
900
927
  Uso:
901
928
  team-cli data queries <subcomando> [opciones]
@@ -948,7 +975,7 @@ Ejemplos:
948
975
  team-cli data queries ai-edit abc123 --prompt 'Ajusta el pipeline' --params '{"websiteId":"w1"}'
949
976
  team-cli data queries preview abc123 --params '{"startDate": "2026-01-01"}'
950
977
  team-cli data queries run abc123 --limit 1000 --params '{"startDate": "2026-01-01"}'
951
- team-cli data queries download abc123 --params '{"startDate": "2026-01-01"}' --path resultado.xlsx`}var fo=["main","auth","webdata","preferences","buckets","reservations","data","finances","url-shortener","files","tabs","commander","experiments","sales","delivery","payments","addresses","royalty","marketing","api","messenger","invoice","drivers-server"],wo=`
978
+ team-cli data queries download abc123 --params '{"startDate": "2026-01-01"}' --path resultado.xlsx`}var Ir=["main","auth","webdata","preferences","buckets","reservations","data","finances","url-shortener","files","tabs","commander","experiments","sales","delivery","payments","addresses","royalty","marketing","api","messenger","invoice","drivers-server"],hr=`
952
979
  query ResolverInfo($name: ID!, $mutation: Boolean!) {
953
980
  params(name: $name, mutation: $mutation) {
954
981
  name
@@ -957,8 +984,8 @@ Ejemplos:
957
984
  basicResultQuery
958
985
  }
959
986
  }
960
- `;function ba(e){if(!e)throw Error("Uso: team-cli graphql <servicio> '<query>' [--variables '<json>'] [--format toon|json]");if(!fo.includes(e))throw Error(`Servicio "${e}" no válido. Servicios disponibles: ${fo.join(", ")}`)}async function ya(e,t){let o;try{let r=await m({service:e,query:wo,variables:{name:t,mutation:!1}});return{service:e,operationName:t,operationType:"query",info:r.params}}catch(r){o=r}try{let r=await m({service:e,query:wo,variables:{name:t,mutation:!0}});return{service:e,operationName:t,operationType:"mutation",info:r.params}}catch(r){let a=o instanceof Error?o.message:"",i=r instanceof Error?r.message:"";if(a.includes('Cannot query field "params"')||i.includes('Cannot query field "params"'))throw Error(`El servicio "${e}" no expone metadata de resolvers por GraphQL.`);throw o instanceof Error?o:r}}async function bo(e,t){let o=e[1],r=e[2],a=e[2];if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>");if(ba(o),r==="info"){let s=e[3];if(!s)throw Error("Uso: team-cli graphql <servicio> info <queryName|mutationName> [--format toon|json]");return await ya(o,s)}if(!a)throw Error("Uso: team-cli graphql <servicio> '<query>' [--variables '<json>'] [--format toon|json]");let i;if(t.variables)try{i=JSON.parse(t.variables)}catch{throw Error("Las variables deben ser un JSON válido.")}return await m({service:o,query:a,variables:i})}function yo(){return Object.keys(oe)}function Ca(){return yo().map((e)=>{let t=oe[e].prod;return`- \`${e}\`: \`${t}/graphql\``}).join(`
961
- `)}function Co(){let t=yo().join(", "),o=Ca();return`team-cli graphql
987
+ `;function Ea(e){if(!e)throw Error("Uso: team-cli graphql <servicio> '<query>' [--variables '<json>'] [--format toon|json]");if(!Ir.includes(e))throw Error(`Servicio "${e}" no válido. Servicios disponibles: ${Ir.join(", ")}`)}async function ja(e,t){let r;try{let o=await u({service:e,query:hr,variables:{name:t,mutation:!1}});return{service:e,operationName:t,operationType:"query",info:o.params}}catch(o){r=o}try{let o=await u({service:e,query:hr,variables:{name:t,mutation:!0}});return{service:e,operationName:t,operationType:"mutation",info:o.params}}catch(o){let a=r instanceof Error?r.message:"",n=o instanceof Error?o.message:"";if(a.includes('Cannot query field "params"')||n.includes('Cannot query field "params"'))throw Error(`El servicio "${e}" no expone metadata de resolvers por GraphQL.`);throw r instanceof Error?r:o}}async function $r(e,t){let r=e[1],o=e[2],a=e[2];if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>");if(Ea(r),o==="info"){let s=e[3];if(!s)throw Error("Uso: team-cli graphql <servicio> info <queryName|mutationName> [--format toon|json]");return await ja(r,s)}if(!a)throw Error("Uso: team-cli graphql <servicio> '<query>' [--variables '<json>'] [--format toon|json]");let n;if(t.variables)try{n=JSON.parse(t.variables)}catch{throw Error("Las variables deben ser un JSON válido.")}return await u({service:r,query:a,variables:n})}function xr(){return Object.keys(ie)}function Aa(){return xr().map((e)=>{let t=ie[e].prod;return`- \`${e}\`: \`${t}/graphql\``}).join(`
988
+ `)}function Sr(){let t=xr().join(", "),r=Aa();return`team-cli graphql
962
989
 
963
990
  Ejecutar queries y mutations GraphQL.
964
991
 
@@ -1009,7 +1036,7 @@ npx @getjusto/team-cli graphql auth info requestLoginCode --format json
1009
1036
 
1010
1037
  Usa esto para mapear una URL GraphQL al valor correcto de \`team-cli graphql <service>\`.
1011
1038
 
1012
- ${o}`}import{execFileSync as qa}from"node:child_process";import{mkdtempSync as Ia,readFileSync as $a,rmSync as xa}from"node:fs";import{tmpdir as ha}from"node:os";import{join as qo,resolve as Sa}from"node:path";function Te(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function K(e,t,o){let r=e[t];if(!r)throw Error(`Falta --${t}. Ejemplo: ${o}`);return r}function Io(e,t){let o=e[2];if(!o)throw Error(`Uso: ${t}`);return o}function Ue(){let e=re();if(e==="local")return"http://intra.localhost:5173";if(e==="develop")return"https://intra.bejusto.com";return"https://intra.getjusto.com"}async function Ea(e,t){let o=await $e(),r=await fetch(`${$("data")}/spaces/publish/${e}`,{method:"POST",headers:{"Content-Type":"application/gzip",...o?{"X-ORION-JWT":o}:{}},body:t}),a=await r.json();if(!r.ok||a.error)throw Error(a.error||"No se pudo publicar el space.");return a}function Qe(){return`team-cli spaces
1039
+ ${r}`}import{resolve as Pa}from"node:path";import{readdirSync as Na,readFileSync as va,statSync as Ra}from"node:fs";import{gzipSync as Ta}from"node:zlib";import{join as Oa,relative as Ua,resolve as Qa}from"node:path";var Ie=512,Ja=2;function Wa(e){let t=e.replaceAll("\\","/");if(t.startsWith("/")||t.includes("../"))throw Error(`Ruta inválida en el space: ${e}`);return t}function _a(e){let t=Wa(e);if(Buffer.from(t).length<=100)return{name:t,prefix:""};let o=t.lastIndexOf("/");if(o<=0)throw Error(`La ruta es demasiado larga para el paquete del space: ${e}`);let a=t.slice(0,o),n=t.slice(o+1);if(Buffer.from(a).length>155||Buffer.from(n).length>100)throw Error(`La ruta es demasiado larga para el paquete del space: ${e}`);return{name:n,prefix:a}}function J(e,t,r,o){let a=Buffer.from(o);a.copy(e,t,0,Math.min(a.length,r))}function ee(e,t,r,o){let a=Math.max(0,Math.trunc(o)).toString(8).padStart(r-1,"0");J(e,t,r,`${a}\x00`)}function Ba(e){let t=Buffer.alloc(Ie,0),{name:r,prefix:o}=_a(e.path);J(t,0,100,r),ee(t,100,8,e.mode),ee(t,108,8,0),ee(t,116,8,0),ee(t,124,12,e.content.length),ee(t,136,12,e.mtime),t.fill(32,148,156),J(t,156,1,"0"),J(t,257,6,"ustar"),J(t,263,2,"00"),J(t,345,155,o);let a=0;for(let i of t)a+=i;let n=`${a.toString(8).padStart(6,"0")}\x00 `;return J(t,148,8,n),t}function Ma(e){let t=e%Ie;return t===0?0:Ie-t}function Er(e,t=e){return Na(t,{withFileTypes:!0}).sort((o,a)=>o.name.localeCompare(a.name)).flatMap((o)=>{let a=Oa(t,o.name);if(o.isDirectory())return Er(e,a);if(!o.isFile())return[];let n=Ua(e,a),i=Ra(a);return[{path:n,content:va(a),mode:i.mode&511,mtime:Math.floor(i.mtimeMs/1000)}]})}function jr(e){let t=Qa(e),r=Er(t);if(!r.length)throw Error("El build del space no contiene archivos para publicar");let o=[];for(let a of r){o.push(Ba(a)),o.push(a.content);let n=Ma(a.content.length);if(n>0)o.push(Buffer.alloc(n,0))}return o.push(Buffer.alloc(Ie*Ja,0)),Ta(Buffer.concat(o))}function Me(){if(!d())throw Error("Debes iniciar sesión primero. Recomendado: team-cli auth request-code --email <email> y luego team-cli auth login-with-token --email <email> --token <token> --code <CODIGO>")}function te(e,t,r){let o=e[t];if(!o)throw Error(`Falta --${t}. Ejemplo: ${r}`);return o}function Ar(e,t){let r=e[2];if(!r)throw Error(`Uso: ${t}`);return r}function Pe(){let e=se();if(e==="local")return"http://intra.localhost:5173";if(e==="develop")return"https://intra.bejusto.com";return"https://intra.getjusto.com"}async function Ga(e,t){let r=await Ne(),o=await fetch(`${h("data")}/spaces/publish/${e}`,{method:"POST",headers:{"Content-Type":"application/gzip",...r?{"X-ORION-JWT":r}:{}},body:t}),a=await o.json();if(!o.ok||a.error)throw Error(a.error||"No se pudo publicar el space.");return a}function Ge(){return`team-cli spaces
1013
1040
 
1014
1041
  Spaces son aplicaciones internas en React, pensadas para que las construyan agentes.
1015
1042
  El flujo oficial parte con \`spaces init\` y \`spaces publish\` solo acepta apps creadas así.
@@ -1029,6 +1056,7 @@ Cada space:
1029
1056
  - \`window.justo.cli(...)\` devuelve Promises, entrega JSON parseado y hace throw en errores
1030
1057
  - para queries grandes también reciben \`window.justo.stream(command, onRow)\`
1031
1058
  - \`window.justo.stream(...)\` consume NDJSON, parsea cada fila a JSON y llama tu callback
1059
+ - \`spaces init\`, \`spaces preview\` y \`spaces publish\` funcionan en macOS, Linux y Windows sin depender de \`tar\` global
1032
1060
 
1033
1061
  Flujo sugerido para agentes:
1034
1062
  1. \`team-cli spaces init --path ./mi-space-app\`
@@ -1036,7 +1064,7 @@ Flujo sugerido para agentes:
1036
1064
  3. \`team-cli spaces preview --path ./mi-space-app\`
1037
1065
  4. desarrollar la app React dentro de esa carpeta
1038
1066
  5. \`team-cli spaces publish <spaceId> --path ./mi-space-app\`
1039
- 6. abrir \`${Ue()}/spaces/<slug>\`
1067
+ 6. abrir \`${Pe()}/spaces/<slug>\`
1040
1068
 
1041
1069
  Qué crea \`spaces init\`:
1042
1070
  - Vite + React + TypeScript
@@ -1086,7 +1114,8 @@ Comandos:
1086
1114
  - \`spaces create --name '...' --description '...' --slug my-space\`
1087
1115
  - \`spaces preview --path ./mi-space-app [--open]\`
1088
1116
  - \`spaces publish <spaceId> --path ./mi-space-app\`
1089
- - \`spaces archive <spaceId>\``}async function $o(e){let t=K(e,"path","team-cli spaces init --path ./mi-space-app");return Wt(t)}async function xo(e){return await Vt(e)}async function ho(e){Te();let t=K(e,"name","team-cli spaces create --name 'Mi space' --description '...' --slug mi-space"),o=K(e,"description","team-cli spaces create --name 'Mi space' --description 'Sitio interno' --slug mi-space"),r=K(e,"slug","team-cli spaces create --name 'Mi space' --description '...' --slug mi-space"),a=await m({service:"data",query:`mutation ($name: String, $description: String, $slug: String) {
1117
+ - \`spaces archive <spaceId>\`
1118
+ `}async function Nr(e){let t=te(e,"path","team-cli spaces init --path ./mi-space-app");return Xt(t)}async function vr(e){return await nr(e)}async function Rr(e){Me();let t=te(e,"name","team-cli spaces create --name 'Mi space' --description '...' --slug mi-space"),r=te(e,"description","team-cli spaces create --name 'Mi space' --description 'Sitio interno' --slug mi-space"),o=te(e,"slug","team-cli spaces create --name 'Mi space' --description '...' --slug mi-space"),a=await u({service:"data",query:`mutation ($name: String, $description: String, $slug: String) {
1090
1119
  createSpace(name: $name, description: $description, slug: $slug) {
1091
1120
  _id
1092
1121
  name
@@ -1097,7 +1126,7 @@ Comandos:
1097
1126
  createdByEmail
1098
1127
  createdById
1099
1128
  }
1100
- }`,variables:{name:t,description:o,slug:r}});return{...a.createSpace,intraUrl:`${Ue()}/spaces/${a.createSpace.slug}`,serveUrl:`${$("data")}/spaces/${a.createSpace.slug}`}}async function So(e,t){Te();let o=Io(e,"team-cli spaces publish <spaceId> --path ./mi-space-app"),r=K(t,"path","team-cli spaces publish <spaceId> --path ./mi-space-app"),a=Jt(r),i=Ia(qo(ha(),"team-cli-space-")),n=qo(i,"space.tar.gz");try{qa("tar",["-czf",n,"-C",a,"."]);let s=$a(n),c=await Ea(o,s);return{...c,intraUrl:c.slug?`${Ue()}/spaces/${c.slug}`:void 0,serveUrl:c.slug?`${$("data")}/spaces/${c.slug}`:void 0,builtFrom:Sa(r)}}finally{xa(i,{recursive:!0,force:!0})}}async function Eo(e){Te();let t=Io(e,"team-cli spaces archive <spaceId>");return(await m({service:"data",query:`mutation ($spaceId: String) {
1129
+ }`,variables:{name:t,description:r,slug:o}});return{...a.createSpace,intraUrl:`${Pe()}/spaces/${a.createSpace.slug}`,serveUrl:`${h("data")}/spaces/${a.createSpace.slug}`}}async function Tr(e,t){Me();let r=Ar(e,"team-cli spaces publish <spaceId> --path ./mi-space-app"),o=te(t,"path","team-cli spaces publish <spaceId> --path ./mi-space-app"),a=Ft(o),n=jr(a),i=await Ga(r,n);return{...i,intraUrl:i.slug?`${Pe()}/spaces/${i.slug}`:void 0,serveUrl:i.slug?`${h("data")}/spaces/${i.slug}`:void 0,builtFrom:Pa(o)}}async function Or(e){Me();let t=Ar(e,"team-cli spaces archive <spaceId>");return(await u({service:"data",query:`mutation ($spaceId: String) {
1101
1130
  archiveSpace(spaceId: $spaceId) {
1102
1131
  _id
1103
1132
  name
@@ -1109,7 +1138,7 @@ Comandos:
1109
1138
  createdById
1110
1139
  archivedAt
1111
1140
  }
1112
- }`,variables:{spaceId:t}})).archiveSpace}function jo(e){return`team-cli
1141
+ }`,variables:{spaceId:t}})).archiveSpace}function Ur(e){return`team-cli
1113
1142
 
1114
1143
  Herramienta CLI para el equipo Justo.
1115
1144
 
@@ -1157,5 +1186,7 @@ npx @getjusto/team-cli admin search <text> [--limit <n>] [--page <n>] [--only-ac
1157
1186
  Crea queries personalizadas usando \`create\` y \`ai-edit\` para generar consultas a la base de datos y luego crear un dashboard que las use
1158
1187
  para mostrar datos. Usa \`preview\` para iterar rápido, \`run\` para consumir NDJSON en streaming y \`download\` para Excel.
1159
1188
  También puedes usar queries para poblar selectores y otras partes de la interfaz del space.
1189
+ Siempre que puedas, prefiere varias queries simples antes que un solo query con \`lookup\`.
1190
+ Eso suele ser más fácil de iterar, más claro para agentes y menos frágil para dashboards.
1160
1191
 
1161
- `}function No(){let e=d(),t=e?`Sesión: ${e.email}`:"Sesión: no iniciada";return jo(t)}async function Ao(e){let{positional:t,flags:o}=L(e);if(o.env)He(o.env);let r=t[0],a=t[1];if(r==="__spaces-preview-bridge")return await Kt(o);if(o.version)return{version:"0.0.6"};if(o.help&&!r)return No();if(r==="auth"){if(a==="--help"||o.help)return Se();if(a==="login")return await xt();if(a==="login-with-token")return await ht(o);if(a==="request-code")return await St(o);if(a==="logout")return await Et();if(a==="status")return await jt();return Se()}if(r==="admin"){let i=t[1],n=t[2],s=t[3],c=t[4];if(!i||i==="--help")return ne();if(i==="search"&&o.help)return Ct();if(i==="search")return await yt(t,o);if(!n||n==="--help")return ne();if(n==="show")return await tt(i);if(n==="stores"&&s==="list")return await qt(i);if(n==="coupons"&&(!s||s==="--help"))return Y();if(n==="coupons"&&s==="create"&&o.help)return wt();if(n==="coupons"&&s==="update"&&o.help)return bt();if(n==="coupons"&&s==="codes"&&t[4]==="create"&&o.help)return mt();if(n==="coupons"&&o.help)return Y();if(n==="coupons"&&s==="list")return await lt(i,o);if(n==="coupons"&&s==="show"){if(!c)throw Error("Uso: team-cli admin <web> coupons show <couponId>");return await dt(i,c)}if(n==="coupons"&&s==="create")return await pt(i,o);if(n==="coupons"&&s==="update"){if(!c)throw Error("Uso: team-cli admin <web> coupons update <couponId> --input '<json>'");return await gt(i,c,o)}if(n==="coupons"&&s==="delete"){if(!c)throw Error("Uso: team-cli admin <web> coupons delete <couponId>");return await ft(i,c)}if(n==="coupons"&&s==="codes"){let u=t[4],l=t[5];if(!u||u==="--help")return Y();if(u==="list"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes list <couponId>");return await it(i,l,o)}if(u==="create"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes create <couponId> --input '<json>'");return await nt(i,l,o)}if(u==="create-random"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes create-random <couponId> --quantity <n>");return await st(i,l,o)}if(u==="delete"){if(!l)throw Error(`Uso: team-cli admin <web> coupons codes delete <couponId> --ids '["id1"]'`);return await ct(i,l,o)}return Y()}return ne()}if(r==="graphql"){if(a==="--help"||o.help)return Co();return await bo(t,o)}if(r==="data"){let i=t[1],n=t[2];if(o.help||a==="--help")return Oe();if(i==="queries"&&n==="create")return await no();if(i==="queries"&&n==="edit")return await so(t);if(i==="queries"&&n==="ai-edit")return await co(t,o);if(i==="queries"&&n==="view")return await mo(t);if(i==="queries"&&n==="view-pipeline")return await uo(t);if(i==="queries"&&n==="preview")return await lo(t,o);if(i==="queries"&&n==="run")return await po(t,o);if(i==="queries"&&n==="download")return await go(t,o);return Oe()}if(r==="spaces"){let i=t[1];if(!i||i==="--help"||o.help)return Qe();if(i==="init")return await $o(o);if(i==="create")return await ho(o);if(i==="preview")return await xo(o);if(i==="publish")return await So(t,o);if(i==="archive")return await Eo(t);return Qe()}return No()}var{flags:Ro}=L(process.argv.slice(2));async function ja(){try{let e=await Ao(process.argv.slice(2));if(e&&typeof e==="object"&&"__streamHandled"in e&&e.__streamHandled)return;if(typeof e==="string"){Fe(e);return}Pe(e,Ro)}catch(e){Xe(e,Ro),process.exit(1)}}ja();
1192
+ `}function Qr(){let e=d(),t=e?`Sesión: ${e.email}`:"Sesión: no iniciada";return Ur(t)}async function Jr(e){let{positional:t,flags:r}=oe(e);if(r.env)Ve(r.env);let o=t[0],a=t[1];if(o==="__spaces-preview-bridge")return await ar(r);if(r.version)return{version:"0.0.8"};if(r.help&&!o)return Qr();if(o==="auth"){if(a==="--help"||r.help)return Te();if(a==="login")return await vt();if(a==="login-with-token")return await Rt(r);if(a==="request-code")return await Tt(r);if(a==="logout")return await Ot();if(a==="status")return await Ut();return Te()}if(o==="admin"){let n=t[1],i=t[2],s=t[3],c=t[4];if(!n||n==="--help")return me();if(n==="search"&&r.help)return Et();if(n==="search")return await St(t,r);if(!i||i==="--help")return me();if(i==="show")return await ct(n);if(i==="stores"&&s==="list")return await jt(n);if(i==="coupons"&&(!s||s==="--help"))return D();if(i==="coupons"&&s==="create"&&r.help)return $t();if(i==="coupons"&&s==="update"&&r.help)return xt();if(i==="coupons"&&s==="codes"&&t[4]==="create"&&r.help)return wt();if(i==="coupons"&&r.help)return D();if(i==="coupons"&&s==="list")return await yt(n,r);if(i==="coupons"&&s==="show"){if(!c)throw Error("Uso: team-cli admin <web> coupons show <couponId>");return await Ct(n,c)}if(i==="coupons"&&s==="create")return await qt(n,r);if(i==="coupons"&&s==="update"){if(!c)throw Error("Uso: team-cli admin <web> coupons update <couponId> --input '<json>'");return await It(n,c,r)}if(i==="coupons"&&s==="delete"){if(!c)throw Error("Uso: team-cli admin <web> coupons delete <couponId>");return await ht(n,c)}if(i==="coupons"&&s==="codes"){let m=t[4],l=t[5];if(!m||m==="--help")return D();if(m==="list"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes list <couponId>");return await dt(n,l,r)}if(m==="create"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes create <couponId> --input '<json>'");return await pt(n,l,r)}if(m==="create-random"){if(!l)throw Error("Uso: team-cli admin <web> coupons codes create-random <couponId> --quantity <n>");return await gt(n,l,r)}if(m==="delete"){if(!l)throw Error(`Uso: team-cli admin <web> coupons codes delete <couponId> --ids '["id1"]'`);return await ft(n,l,r)}return D()}return me()}if(o==="graphql"){if(a==="--help"||r.help)return Sr();return await $r(t,r)}if(o==="data"){let n=t[1],i=t[2];if(r.help||a==="--help")return Be();if(n==="queries"&&i==="create")return await pr();if(n==="queries"&&i==="edit")return await gr(t);if(n==="queries"&&i==="ai-edit")return await fr(t,r);if(n==="queries"&&i==="view")return await wr(t);if(n==="queries"&&i==="view-pipeline")return await br(t);if(n==="queries"&&i==="preview")return await yr(t,r);if(n==="queries"&&i==="run")return await Cr(t,r);if(n==="queries"&&i==="download")return await qr(t,r);return Be()}if(o==="spaces"){let n=t[1];if(!n||n==="--help"||r.help)return Ge();if(n==="init")return await Nr(r);if(n==="create")return await Rr(r);if(n==="preview")return await vr(r);if(n==="publish")return await Tr(t,r);if(n==="archive")return await Or(t);return Ge()}return Qr()}var{flags:Wr}=oe(process.argv.slice(2));async function Fa(){try{let e=await Jr(process.argv.slice(2));if(e&&typeof e==="object"&&"__streamHandled"in e&&e.__streamHandled)return;if(typeof e==="string"){ke(e);return}ze(e,Wr)}catch(e){Ke(e,Wr),process.exit(1)}}Fa();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getjusto/team-cli",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "CLI tool for Justo team members",
5
5
  "type": "module",
6
6
  "bin": {