sharetribe-cli 1.15.2 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import{Command as jt}from"commander";import{readFileSync as Ft}from"node:fs";import{fileURLToPath as Kt}from"node:url";import{dirname as Ut,join as Vt}from"node:path";import{readFileSync as Ae}from"node:fs";import{fileURLToPath as we}from"node:url";import{dirname as H,join as Ce}from"node:path";function Pe(){let r=we(import.meta.url),t=H(r);for(;t!=="/";)try{let e=Ce(t,"package.json");return Ae(e,"utf-8")}catch{t=H(t)}throw new Error("Could not find package.json")}function J(){let r=JSON.parse(Pe());console.log(r.version)}import Ie from"inquirer";import{writeAuth as Oe}from"sharetribe-flex-build-sdk";async function B(){let r=await Ie.prompt([{type:"password",name:"apiKey",message:"Enter API key:",mask:"*",validate:t=>!t||t.trim().length===0?"API key cannot be empty":!0}]);Oe({apiKey:r.apiKey}),console.log("Successfully logged in.")}import{clearAuth as be}from"sharetribe-flex-build-sdk";async function W(){await be(),console.log("Successfully logged out.")}import{listProcesses as xe,listProcessVersions as Re}from"sharetribe-flex-build-sdk";import x from"chalk";function w(r,t){if(t.length===0)return;let e={};for(let n of r)e[n]=n.length+1;for(let n of t)for(let i of r){let a=n[i]||"";e[i]=Math.max(e[i]||0,a.length)}console.log("");let o=r.map((n,i)=>{let a=e[n]||0,p=n.padEnd(a+1);return i===r.length-1?p:p+" "}).join("");console.log(x.bold.black(o));for(let n of t){let a=r.map((p,l)=>{let m=n[p]||"",f=e[p]||0,h=m.padEnd(f+1);return l===r.length-1?h:h+" "}).join("");console.log(a)}console.log("")}function c(r){console.error(x.red(`Error: ${r}`))}function y(r){console.log(x.green(r))}function qe(r){try{let t=new Date(r),e=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),n=t.toLocaleTimeString("en-US");return`${e}-${s}-${o} ${n}`}catch{return r}}async function R(r,t){try{if(t){let e=await Re(void 0,r,t);if(e.length===0){console.log(`No versions found for process: ${t}`);return}let s=e.map(o=>({Created:qe(o.createdAt),Version:o.version.toString(),Aliases:o.aliases?.join(", ")||"",Transactions:o.transactionCount?.toString()||"0"}));w(["Created","Version","Aliases","Transactions"],s)}else{let e=await xe(void 0,r);if(e.length===0){console.log("No processes found.");return}let s=e.map(o=>({Name:o.name,"Latest version":o.version?.toString()||""}));w(["Name","Latest version"],s)}}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to list processes"),process.exit(1)}}import{createProcess as Te}from"sharetribe-flex-build-sdk";import{readFileSync as Me}from"node:fs";import{join as De}from"node:path";async function q(r,t,e){try{let s=De(e,"process.edn"),o=Me(s,"utf-8"),n=await Te(void 0,r,t,o);y(`Process ${n.name} successfully created with version ${n.version}.`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to create process"),process.exit(1)}}import{pushProcess as _e}from"sharetribe-flex-build-sdk";import{readFileSync as T,readdirSync as Le}from"node:fs";import{join as I}from"node:path";function Ne(r){let t=I(r,"templates"),e=[];try{let s=Le(t);for(let o of s){let n=I(t,o),i=I(n,`${o}-html.html`),a=I(n,`${o}-subject.txt`);try{let p=T(i,"utf-8"),l=T(a,"utf-8");e.push({name:o,html:p,subject:l})}catch{}}}catch{}return e}async function M(r,t,e){try{let s=I(e,"process.edn"),o=T(s,"utf-8"),n=Ne(e),i=await _e(void 0,r,t,o,n);i.noChanges?console.log("No changes"):y(`Version ${i.version} successfully saved for process ${t}.`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to push process"),process.exit(1)}}import{getProcess as $e}from"sharetribe-flex-build-sdk";import{writeFileSync as D,mkdirSync as _}from"node:fs";import{join as O}from"node:path";async function L(r,t,e,s,o){try{let n=await $e(void 0,r,t,{version:s,alias:o});if(!n.definition)throw new Error("No process definition in response");let{existsSync:i}=await import("node:fs"),a=i(e);_(e,{recursive:!0}),a||console.error(`Creating a new directory: ${e}`);let p=O(e,"process.edn");D(p,n.definition,"utf-8");let l=n.emailTemplates||[];if(l&&Array.isArray(l)&&l.length>0){let m=O(e,"templates");_(m,{recursive:!0});for(let f of l){let h=f.name,v=f.html,A=f.subject;if(h){let d=O(m,h);if(_(d,{recursive:!0}),v){let g=O(d,`${h}-html.html`);D(g,v,"utf-8")}if(A){let g=O(d,`${h}-subject.txt`);D(g,A,"utf-8")}}}}console.error(`Saved process to ${e}`)}catch(n){n&&typeof n=="object"&&"message"in n?c(n.message):c("Failed to pull process"),process.exit(1)}}import{createAlias as je,updateAlias as Fe,deleteAlias as Ke}from"sharetribe-flex-build-sdk";async function N(r,t,e,s){try{let o=await je(void 0,r,t,e,s);y(`Alias ${o.alias} successfully created to point to version ${o.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to create alias"),process.exit(1)}}async function $(r,t,e,s){try{let o=await Fe(void 0,r,t,e,s);y(`Alias ${o.alias} successfully updated to point to version ${o.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to update alias"),process.exit(1)}}async function j(r,t,e){try{let s=await Ke(void 0,r,t,e);y(`Alias ${s.alias} successfully deleted.`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to delete alias"),process.exit(1)}}import{deployProcess as Ue,parseProcessFile as Ve}from"sharetribe-flex-build-sdk";import{readFileSync as He}from"node:fs";import{join as Je}from"node:path";async function F(r,t,e,s){try{let o=Je(e,"process.edn"),n=He(o,"utf-8"),i=Ve(n),a=await Ue(void 0,r,{process:t,alias:s,path:o,processDefinition:i});a.processCreated&&y(`Process ${t} successfully created.`),y(`Version ${a.version} successfully saved for process ${t}.`),a.aliasCreated?y(`Alias ${a.alias} successfully created to point to version ${a.version}.`):y(`Alias ${a.alias} successfully updated to point to version ${a.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to create/push process and alias"),process.exit(1)}}function G(r){let t=r.command("process").description("describe a process file").option("--path <PROCESS_DIR>","path to the directory where the process.edn file is").option("--transition <TRANSITION_NAME>","transition name, e.g. transition/request to get more details of it").action(async e=>{e.path?(console.log(`Describing process at: ${e.path}`),e.transition&&console.log(`Transition: ${e.transition}`),console.log("Process description not yet implemented")):t.outputHelp()});t.command("list").description("list all transaction processes").option("--process <PROCESS_NAME>","print version and alias info of a specific process").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await R(s,e.process)}),t.command("create").description("create a new transaction process").requiredOption("--process <PROCESS_NAME>","name for the new process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await q(s,e.process,e.path)}),t.command("push").description("push a process file to the remote").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await M(s,e.process,e.path)}),t.command("pull").description("fetch a process file").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path where to save the process").option("--version <VERSION_NUM>","version number").option("--alias <PROCESS_ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await L(s,e.process,e.path,e.version,e.alias)}),t.command("create-alias").description("create a new alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").allowUnknownOption(!1).action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await N(s,e.process,parseInt(e.version),e.alias)}),t.command("update-alias").description("update an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await $(s,e.process,parseInt(e.version),e.alias)}),t.command("delete-alias").description("delete an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await j(s,e.process,e.alias)}),t.command("deploy").description("deploy a process file with alias (create/push + alias create/update)").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory with the process files").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await F(s,e.process,e.path,e.alias)}),r.command("process-list",{hidden:!0}).description("list all transaction processes").option("--process <PROCESS_NAME>","print version and alias info of a specific process").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await R(s,e.process)}),r.command("process-create",{hidden:!0}).description("create a new transaction process").requiredOption("--process <PROCESS_NAME>","name for the new process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await q(s,e.process,e.path)}),r.command("process-push",{hidden:!0}).description("push a process file to the remote").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await M(s,e.process,e.path)}),r.command("process-pull",{hidden:!0}).description("fetch a process file").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path where to save the process").option("--version <VERSION_NUM>","version number").option("--alias <PROCESS_ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await L(s,e.process,e.path,e.version,e.alias)}),r.command("process-create-alias",{hidden:!0}).description("create a new alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await N(s,e.process,parseInt(e.version),e.alias)}),r.command("process-update-alias",{hidden:!0}).description("update an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await $(s,e.process,parseInt(e.version),e.alias)}),r.command("process-delete-alias",{hidden:!0}).description("delete an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await j(s,e.process,e.alias)}),r.command("process-deploy",{hidden:!0}).description("deploy a process file with alias (create/push + alias create/update)").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory with the process files").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await F(s,e.process,e.path,e.alias)})}import{listSearchSchemas as Be,setSearchSchema as We,unsetSearchSchema as Ge}from"sharetribe-flex-build-sdk";var Q={metadata:"Metadata",private:"Private data",protected:"Protected data",public:"Public data"};async function Qe(r,t){try{await We(void 0,r,{key:t.key,scope:t.scope,type:t.type,doc:t.doc,defaultValue:t.default,schemaFor:t.schemaFor});let e=t.schemaFor||"listing",s=Q[t.scope]||t.scope;console.log(`${s} schema, ${t.key} is successfully set for ${e}.`)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to set search schema"),process.exit(1)}}async function Ye(r,t){try{await Ge(void 0,r,{key:t.key,scope:t.scope,schemaFor:t.schemaFor});let e=t.schemaFor||"listing",s=Q[t.scope]||t.scope;console.log(`${s} schema, ${t.key} is successfully unset for ${e}.`)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to unset search schema"),process.exit(1)}}function Xe(r){return r==null?"":Array.isArray(r)?r.join(", "):String(r)}async function ze(r){try{let t=await Be(void 0,r);if(t.length===0){console.log("No search schemas found.");return}let e=t.map(i=>({"Schema for":i.schemaFor,Scope:i.scope,Key:i.key,Type:i.type,"Default value":Xe(i.defaultValue),Doc:i.doc||""})).sort((i,a)=>i["Schema for"]!==a["Schema for"]?i["Schema for"].localeCompare(a["Schema for"]):i.Scope!==a.Scope?i.Scope.localeCompare(a.Scope):i.Key.localeCompare(a.Key)),s=["Schema for","Scope","Key","Type","Default value","Doc"],o={};for(let i of s)o[i]=i.length+1;for(let i of e)for(let a of s){let p=i[a]||"";o[a]=Math.max(o[a],p.length)}console.log("");let n=s.map((i,a)=>{let p=o[i]||0,l=i.padEnd(p);return a===s.length-1?l+" ":l+" "});console.log(n.join(""));for(let i of e){let a=s.map((p,l)=>{let m=i[p]||"",f=o[p]||0,h=m.padEnd(f);return l===s.length-1?h+" ":h+" "});console.log(a.join(""))}console.log("")}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to list search schemas"),process.exit(1)}}function Y(r){let t=r.command("search").description("list all search schemas").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await ze(s)});t.command("set").description("set search schema").requiredOption("--key <KEY>","schema key").requiredOption("--scope <SCOPE>","schema scope").requiredOption("--type <TYPE>","value type (enum, multi-enum, boolean, long, or text)").option("--doc <DOC>","description of the schema").option("--default <DEFAULT>","default value for search if value is not set").option("--schema-for <SCHEMA_FOR>","subject of the schema (listing, userProfile, or transaction)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await Qe(s,{key:e.key,scope:e.scope,type:e.type,doc:e.doc,default:e.default,schemaFor:e.schemaFor})}),t.command("unset").description("unset search schema").requiredOption("--key <KEY>","schema key").requiredOption("--scope <SCOPE>","schema scope").option("--schema-for <SCHEMA_FOR>","subject of the schema (listing, userProfile, or transaction)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await Ye(s,{key:e.key,scope:e.scope,schemaFor:e.schemaFor})})}import{pullAssets as Ze,pushAssets as et,stageAsset as tt}from"sharetribe-flex-build-sdk";import{readFileSync as z,writeFileSync as Z,existsSync as C,mkdirSync as K,readdirSync as st,statSync as U,unlinkSync as rt}from"node:fs";import{join as k,dirname as ot}from"node:path";import{createHash as nt}from"node:crypto";import X from"chalk";import E from"jsedn";function ee(r){let t=k(r,".flex-cli","asset-meta.edn");if(!C(t))return null;try{let e=z(t,"utf-8"),s=E.parse(e),o=s.at(E.kw(":version")),n=s.at(E.kw(":assets")),i=[];if(n&&n.val)for(let a of n.val)i.push({path:a.at(E.kw(":path")),"content-hash":a.at(E.kw(":content-hash"))});return{version:o,assets:i}}catch{return null}}function te(r,t){let e=k(r,".flex-cli");C(e)||K(e,{recursive:!0});let s=t.assets.map(i=>new E.Map([E.kw(":path"),i.path,E.kw(":content-hash"),i["content-hash"]])),o=new E.Map([E.kw(":version"),t.version,E.kw(":assets"),new E.Vector(s)]),n=k(r,".flex-cli","asset-meta.edn");Z(n,E.encode(o),"utf-8")}function se(r){let t=Buffer.from(`${r.length}|`,"utf-8");return nt("sha1").update(t).update(r).digest("hex")}function it(r){let t=[];function e(s,o=""){let n=st(s);for(let i of n){if(i===".flex-cli"||i===".DS_Store")continue;let a=k(s,i),p=o?k(o,i):i,l=U(a);if(l.isDirectory())e(a,p);else if(l.isFile()){let m=z(a),f=se(m);t.push({path:p,data:m,hash:f})}}}return e(r),t}function at(r){for(let t of r)if(t.path.endsWith(".json"))try{JSON.parse(t.data.toString("utf-8"))}catch(e){throw new Error(`Invalid JSON in ${t.path}: ${e}`)}}async function ct(r,t,e,s){try{if(C(t)||K(t,{recursive:!0}),!U(t).isDirectory())throw new Error(`${t} is not a directory`);let n=await Ze(void 0,r,e?{version:e}:void 0),i=n.version,a=ee(t);if(a&&a.version===i&&n.assets.length===a.assets.length){console.log("Assets are up to date.");return}let p=[];for(let l of n.assets){let m=k(t,l.path),f=ot(m);C(f)||K(f,{recursive:!0});let h=Buffer.from(l.dataRaw,"base64");Z(m,h);let v=se(h);p.push({path:l.path,"content-hash":l.contentHash||v})}if(s&&a){let l=new Set(n.assets.map(m=>m.path));for(let m of a.assets)if(!l.has(m.path)){let f=k(t,m.path);C(f)&&rt(f)}}te(t,{version:i,assets:p}),console.log(`Version ${i} successfully pulled.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to pull assets"),process.exit(1)}}function lt(r,t){let e=new Map(r.map(s=>[s.path,s["content-hash"]]));return t.filter(s=>{let o=e.get(s.path);return!o||o!==s.hash})}async function pt(r,t,e){try{if(!C(t)||!U(t).isDirectory())throw new Error(`${t} is not a valid directory`);let s=ee(t),o=s?.version||"nil",n=it(t);at(n);let i=lt(s?.assets||[],n),a=d=>d.toLowerCase().endsWith(".json"),p=i.filter(d=>!a(d.path)),l=new Map(n.map(d=>[d.path,d])),m=[];if(e&&s)for(let d of s.assets)l.has(d.path)||m.push({path:d.path,op:"delete"});if(i.length===0&&m.length===0){console.log("Assets are up to date.");return}if(i.length>0){let d=i.map(g=>g.path).join(", ");console.log(X.green(`Uploading changed assets: ${d}`))}let h=new Map;if(p.length>0){let d=p.map(g=>g.path).join(", ");console.log(X.green(`Staging assets: ${d}`));for(let g of p)try{let S=await tt(void 0,r,g.data,g.path);h.set(g.path,S.stagingId)}catch(S){if(S&&typeof S=="object"&&"code"in S&&S.code==="asset-invalid-content"){let ve="message"in S?S.message:"The file is missing or uses an unsupported format.";throw new Error(`Failed to stage image ${g.path}: ${ve}
4
- Fix the file and rerun assets push to retry staging.`)}throw S}}let v=i.map(d=>{let g=h.get(d.path);return{path:d.path,op:"upsert",...g?{stagingId:g}:{data:d.data,filename:d.path}}}),A=await et(void 0,r,o,[...v,...m]);te(t,{version:A.version,assets:A.assets.map(d=>({path:d.path,"content-hash":d.contentHash}))}),console.log(`New version ${A.version} successfully created.`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to push assets"),process.exit(1)}}function re(r){let t=r.command("assets").description("manage marketplace assets");t.command("pull").description("pull assets from remote").requiredOption("--path <PATH>","path to directory where assets will be stored").option("--version <VERSION>","version of assets to pull").option("--prune","delete local files no longer present as remote assets").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await ct(s,e.path,e.version,e.prune)}),t.command("push").description("push assets to remote").requiredOption("--path <PATH>","path to directory with assets").option("--prune","delete remote assets no longer present locally").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await pt(s,e.path,e.prune)})}import{sendNotification as mt,previewNotification as dt}from"sharetribe-flex-build-sdk";import{readFileSync as V,existsSync as b,statSync as ft}from"node:fs";import{join as oe}from"node:path";import{createServer as ut}from"node:http";function ne(r){if(!b(r)||!ft(r).isDirectory())throw new Error(`Template directory not found: ${r}`);let t=oe(r,"template.html"),e=oe(r,"template-subject.txt");if(!b(t))throw new Error(`template.html not found in ${r}`);if(!b(e))throw new Error(`template-subject.txt not found in ${r}`);let s=V(t,"utf-8"),o=V(e,"utf-8").trim();return{html:s,subject:o}}function ie(r){if(!r)return;if(!b(r))throw new Error(`Context file not found: ${r}`);let t=V(r,"utf-8");try{return JSON.parse(t)}catch(e){throw new Error(`Invalid JSON in context file: ${e}`)}}async function ht(r,t,e){try{let s=ne(t),o=ie(e),n=await mt(void 0,r,{template:s,context:o});console.log(`Preview successfully sent to ${n.adminEmail}`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to send notification"),process.exit(1)}}async function gt(r,t,e){try{let s=ne(t),o=ie(e);console.log(`Template: ${t}`),console.log(`Subject: ${s.subject}`),console.log(""),console.log("Starting preview server at http://localhost:3535"),console.log("Press Ctrl+C to stop"),console.log("");let n=null,i=async()=>{try{let m=(await dt(void 0,r,{template:s,context:o})).html,f=`<title>${s.subject}</title>`;m.includes("<head>")?n=m.replace("<head>",`<head>
5
- ${f}`):m.includes("<html>")?n=m.replace("<html>",`<html>
6
- <head>${f}</head>`):n=`<html><head>${f}</head><body>${m}</body></html>`}catch(l){n=`
3
+ import{Command as ir}from"commander";import{readFileSync as ar}from"node:fs";import{fileURLToPath as cr}from"node:url";import{dirname as lr,join as pr}from"node:path";import{readFileSync as Ce}from"node:fs";import{fileURLToPath as Ie}from"node:url";import{dirname as V,join as be}from"node:path";function Oe(){let s=Ie(import.meta.url),t=V(s);for(;t!=="/";)try{let e=be(t,"package.json");return Ce(e,"utf-8")}catch{t=V(t)}throw new Error("Could not find package.json")}function H(){let s=JSON.parse(Oe());console.log(s.version)}import Re from"inquirer";import{writeAuth as xe}from"sharetribe-flex-build-sdk";async function J(){let s=await Re.prompt([{type:"password",name:"apiKey",message:"Enter API key:",mask:"*",validate:t=>!t||t.trim().length===0?"API key cannot be empty":!0}]);xe({apiKey:s.apiKey}),console.log("Successfully logged in.")}import{clearAuth as Te}from"sharetribe-flex-build-sdk";async function B(){await Te(),console.log("Successfully logged out.")}import{listProcesses as qe,listProcessVersions as Me}from"sharetribe-flex-build-sdk";import R from"chalk";function P(s,t){if(t.length===0)return;let e={};for(let n of s)e[n]=n.length+1;for(let n of t)for(let i of s){let a=n[i]||"";e[i]=Math.max(e[i]||0,a.length)}console.log("");let o=s.map((n,i)=>{let a=e[n]||0,p=n.padEnd(a+1);return i===s.length-1?p:p+" "}).join("");console.log(R.bold.black(o));for(let n of t){let a=s.map((p,l)=>{let m=n[p]||"",u=e[p]||0,f=m.padEnd(u+1);return l===s.length-1?f:f+" "}).join("");console.log(a)}console.log("")}function c(s){console.error(R.red(`Error: ${s}`))}function E(s){console.log(R.green(s))}function De(s){try{let t=new Date(s),e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),n=t.toLocaleTimeString("en-US");return`${e}-${r}-${o} ${n}`}catch{return s}}async function x(s,t){try{if(t){let e=await Me(void 0,s,t);if(e.length===0){console.log(`No versions found for process: ${t}`);return}let r=e.map(o=>({Created:De(o.createdAt),Version:o.version.toString(),Aliases:o.aliases?.join(", ")||"",Transactions:o.transactionCount?.toString()||"0"}));P(["Created","Version","Aliases","Transactions"],r)}else{let e=await qe(void 0,s);if(e.length===0){console.log("No processes found.");return}let r=e.map(o=>({Name:o.name,"Latest version":o.version?.toString()||""}));P(["Name","Latest version"],r)}}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to list processes"),process.exit(1)}}import{createProcess as _e}from"sharetribe-flex-build-sdk";import{readFileSync as Le}from"node:fs";import{join as Ne}from"node:path";async function T(s,t,e){try{let r=Ne(e,"process.edn"),o=Le(r,"utf-8"),n=await _e(void 0,s,t,o);E(`Process ${n.name} successfully created with version ${n.version}.`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to create process"),process.exit(1)}}import{pushProcess as $e}from"sharetribe-flex-build-sdk";import{readFileSync as q,readdirSync as je}from"node:fs";import{join as C}from"node:path";function Fe(s){let t=C(s,"templates"),e=[];try{let r=je(t);for(let o of r){let n=C(t,o),i=C(n,`${o}-html.html`),a=C(n,`${o}-subject.txt`);try{let p=q(i,"utf-8"),l=q(a,"utf-8");e.push({name:o,html:p,subject:l})}catch{}}}catch{}return e}async function M(s,t,e){try{let r=C(e,"process.edn"),o=q(r,"utf-8"),n=Fe(e),i=await $e(void 0,s,t,o,n);i.noChanges?console.log("No changes"):E(`Version ${i.version} successfully saved for process ${t}.`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to push process"),process.exit(1)}}import{getProcess as Ke}from"sharetribe-flex-build-sdk";import{writeFileSync as D,mkdirSync as _}from"node:fs";import{join as I}from"node:path";async function L(s,t,e,r,o){try{let n=await Ke(void 0,s,t,{version:r,alias:o});if(!n.definition)throw new Error("No process definition in response");let{existsSync:i}=await import("node:fs"),a=i(e);_(e,{recursive:!0}),a||console.error(`Creating a new directory: ${e}`);let p=I(e,"process.edn");D(p,n.definition,"utf-8");let l=n.emailTemplates||[];if(l&&Array.isArray(l)&&l.length>0){let m=I(e,"templates");_(m,{recursive:!0});for(let u of l){let f=u.name,w=u.html,S=u.subject;if(f){let d=I(m,f);if(_(d,{recursive:!0}),w){let g=I(d,`${f}-html.html`);D(g,w,"utf-8")}if(S){let g=I(d,`${f}-subject.txt`);D(g,S,"utf-8")}}}}console.error(`Saved process to ${e}`)}catch(n){n&&typeof n=="object"&&"message"in n?c(n.message):c("Failed to pull process"),process.exit(1)}}import{createAlias as Ue,updateAlias as Ve,deleteAlias as He}from"sharetribe-flex-build-sdk";async function N(s,t,e,r){try{let o=await Ue(void 0,s,t,e,r);E(`Alias ${o.alias} successfully created to point to version ${o.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to create alias"),process.exit(1)}}async function $(s,t,e,r){try{let o=await Ve(void 0,s,t,e,r);E(`Alias ${o.alias} successfully updated to point to version ${o.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to update alias"),process.exit(1)}}async function j(s,t,e){try{let r=await He(void 0,s,t,e);E(`Alias ${r.alias} successfully deleted.`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to delete alias"),process.exit(1)}}import{deployProcess as Je,parseProcessFile as Be}from"sharetribe-flex-build-sdk";import{readFileSync as We}from"node:fs";import{join as Ge}from"node:path";async function F(s,t,e,r){try{let o=Ge(e,"process.edn"),n=We(o,"utf-8"),i=Be(n),a=await Je(void 0,s,{process:t,alias:r,path:o,processDefinition:i});a.processCreated&&E(`Process ${t} successfully created.`),E(`Version ${a.version} successfully saved for process ${t}.`),a.aliasCreated?E(`Alias ${a.alias} successfully created to point to version ${a.version}.`):E(`Alias ${a.alias} successfully updated to point to version ${a.version}.`)}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to create/push process and alias"),process.exit(1)}}function W(s){let t=s.command("process").description("describe a process file").option("--path <PROCESS_DIR>","path to the directory where the process.edn file is").option("--transition <TRANSITION_NAME>","transition name, e.g. transition/request to get more details of it").action(async e=>{e.path?(console.log(`Describing process at: ${e.path}`),e.transition&&console.log(`Transition: ${e.transition}`),console.log("Process description not yet implemented")):t.outputHelp()});t.command("list").description("list all transaction processes").option("--process <PROCESS_NAME>","print version and alias info of a specific process").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await x(r,e.process)}),t.command("create").description("create a new transaction process").requiredOption("--process <PROCESS_NAME>","name for the new process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await T(r,e.process,e.path)}),t.command("push").description("push a process file to the remote").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await M(r,e.process,e.path)}),t.command("pull").description("fetch a process file").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path where to save the process").option("--version <VERSION_NUM>","version number").option("--alias <PROCESS_ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await L(r,e.process,e.path,e.version,e.alias)}),t.command("create-alias").description("create a new alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").allowUnknownOption(!1).action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await N(r,e.process,parseInt(e.version),e.alias)}),t.command("update-alias").description("update an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await $(r,e.process,parseInt(e.version),e.alias)}),t.command("delete-alias").description("delete an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await j(r,e.process,e.alias)}),t.command("deploy").description("deploy a process file with alias (create/push + alias create/update)").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory with the process files").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await F(r,e.process,e.path,e.alias)}),s.command("process-list",{hidden:!0}).description("list all transaction processes").option("--process <PROCESS_NAME>","print version and alias info of a specific process").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await x(r,e.process)}),s.command("process-create",{hidden:!0}).description("create a new transaction process").requiredOption("--process <PROCESS_NAME>","name for the new process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await T(r,e.process,e.path)}),s.command("process-push",{hidden:!0}).description("push a process file to the remote").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory where the process.edn file is").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await M(r,e.process,e.path)}),s.command("process-pull",{hidden:!0}).description("fetch a process file").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path where to save the process").option("--version <VERSION_NUM>","version number").option("--alias <PROCESS_ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await L(r,e.process,e.path,e.version,e.alias)}),s.command("process-create-alias",{hidden:!0}).description("create a new alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await N(r,e.process,parseInt(e.version),e.alias)}),s.command("process-update-alias",{hidden:!0}).description("update an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--version <VERSION_NUM>","version number").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await $(r,e.process,parseInt(e.version),e.alias)}),s.command("process-delete-alias",{hidden:!0}).description("delete an existing alias").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await j(r,e.process,e.alias)}),s.command("process-deploy",{hidden:!0}).description("deploy a process file with alias (create/push + alias create/update)").requiredOption("--process <PROCESS_NAME>","name of the process").requiredOption("--path <LOCAL_PROCESS_DIR>","path to the directory with the process files").requiredOption("--alias <ALIAS>","alias name").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await F(r,e.process,e.path,e.alias)})}import{listSearchSchemas as Qe,setSearchSchema as Ye,unsetSearchSchema as ze}from"sharetribe-flex-build-sdk";var G={metadata:"Metadata",private:"Private data",protected:"Protected data",public:"Public data"};async function Ze(s,t){try{await Ye(void 0,s,{key:t.key,scope:t.scope,type:t.type,doc:t.doc,defaultValue:t.default,schemaFor:t.schemaFor});let e=t.schemaFor||"listing",r=G[t.scope]||t.scope;console.log(`${r} schema, ${t.key} is successfully set for ${e}.`)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to set search schema"),process.exit(1)}}async function Xe(s,t){try{await ze(void 0,s,{key:t.key,scope:t.scope,schemaFor:t.schemaFor});let e=t.schemaFor||"listing",r=G[t.scope]||t.scope;console.log(`${r} schema, ${t.key} is successfully unset for ${e}.`)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to unset search schema"),process.exit(1)}}function et(s){return s==null?"":Array.isArray(s)?s.join(", "):String(s)}async function tt(s){try{let t=await Qe(void 0,s);if(t.length===0){console.log("No search schemas found.");return}let e=t.map(i=>({"Schema for":i.schemaFor,Scope:i.scope,Key:i.key,Type:i.type,"Default value":et(i.defaultValue),Doc:i.doc||""})).sort((i,a)=>i["Schema for"]!==a["Schema for"]?i["Schema for"].localeCompare(a["Schema for"]):i.Scope!==a.Scope?i.Scope.localeCompare(a.Scope):i.Key.localeCompare(a.Key)),r=["Schema for","Scope","Key","Type","Default value","Doc"],o={};for(let i of r)o[i]=i.length+1;for(let i of e)for(let a of r){let p=i[a]||"";o[a]=Math.max(o[a],p.length)}console.log("");let n=r.map((i,a)=>{let p=o[i]||0,l=i.padEnd(p);return a===r.length-1?l+" ":l+" "});console.log(n.join(""));for(let i of e){let a=r.map((p,l)=>{let m=i[p]||"",u=o[p]||0,f=m.padEnd(u);return l===r.length-1?f+" ":f+" "});console.log(a.join(""))}console.log("")}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to list search schemas"),process.exit(1)}}function Q(s){let t=s.command("search").description("list all search schemas").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await tt(r)});t.command("set").description("set search schema").requiredOption("--key <KEY>","key name").requiredOption("--scope <SCOPE>","extended data scope (either metadata or public for listing schema, metadata, private, protected or public for userProfile schema, metadata or protected for transaction schema)").requiredOption("--type <TYPE>","value type (either enum, multi-enum, boolean, long or text)").option("--doc <DOC>","description of the schema").option("--default <DEFAULT>","default value for search if value is not set").option("--schema-for <SCHEMA_FOR>","Subject of the schema (either listing, userProfile or transaction, defaults to listing)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Ze(r,{key:e.key,scope:e.scope,type:e.type,doc:e.doc,default:e.default,schemaFor:e.schemaFor})}),t.command("unset").description("unset search schema").requiredOption("--key <KEY>","key name").requiredOption("--scope <SCOPE>","extended data scope (either metadata or public for listing schema, metadata, private, protected or public for userProfile schema, metadata or protected for transaction schema)").option("--schema-for <SCHEMA_FOR>","Subject of the schema (either listing, userProfile or transaction, defaults to listing)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Xe(r,{key:e.key,scope:e.scope,schemaFor:e.schemaFor})})}import{pushAssets as rt,stageAsset as st,getApiBaseUrl as ot,readAuth as nt}from"sharetribe-flex-build-sdk";import{readFileSync as X,writeFileSync as it,existsSync as v,mkdirSync as K,readdirSync as ee,statSync as b,unlinkSync as Y,createWriteStream as te}from"node:fs";import{join as k,dirname as at}from"node:path";import{createHash as ct}from"node:crypto";import*as lt from"node:http";import*as pt from"node:https";import{tmpdir as mt}from"node:os";import{pipeline as re}from"node:stream/promises";import z from"chalk";import y from"jsedn";import dt from"yauzl";var ut="meta/asset-meta.edn",Z="assets/",ft="\x1B[K",ht="\r";function se(s){try{let t=y.parse(s),e=t.at(y.kw(":version"))||t.at(y.kw(":aliased-version")),r=t.at(y.kw(":assets")),o=[];if(r&&r.val)for(let n of r.val)o.push({path:n.at(y.kw(":path")),"content-hash":n.at(y.kw(":content-hash"))});return e?{version:e,assets:o}:null}catch{return null}}function oe(s){let t=k(s,".flex-cli","asset-meta.edn");if(!v(t))return null;try{let e=X(t,"utf-8");return se(e)}catch{return null}}function ne(s,t){let e=k(s,".flex-cli");v(e)||K(e,{recursive:!0});let r=t.assets.map(i=>new y.Map([y.kw(":path"),i.path,y.kw(":content-hash"),i["content-hash"]])),o=new y.Map([y.kw(":version"),t.version,y.kw(":assets"),new y.Vector(r)]),n=k(s,".flex-cli","asset-meta.edn");it(n,y.encode(o),"utf-8")}function gt(s){let t=Buffer.from(`${s.length}|`,"utf-8");return ct("sha1").update(t).update(s).digest("hex")}function yt(s){let t=[];function e(r,o=""){let n=ee(r);for(let i of n){if(i===".flex-cli"||i===".DS_Store")continue;let a=k(r,i),p=o?k(o,i):i,l=b(a);if(l.isDirectory())e(a,p);else if(l.isFile()){let m=X(a),u=gt(m);t.push({path:p,data:m,hash:u})}}}return e(s),t}function Et(s){let t=[];function e(r,o=""){let n=ee(r);for(let i of n){if(i===".flex-cli"||i===".DS_Store")continue;let a=k(r,i),p=o?k(o,i):i,l=b(a);l.isDirectory()?e(a,p):l.isFile()&&t.push(p)}}return e(s),t}function St(s){for(let t of s)if(t.path.endsWith(".json"))try{JSON.parse(t.data.toString("utf-8"))}catch(e){throw new Error(`Invalid JSON in ${t.path}: ${e}`)}}function kt(s){let t=s/1024/1024;return`${ht}${ft}Downloaded ${t.toFixed(2)}MB`}function At(s){let t=0,e=()=>{process.stderr.write(kt(t))},r=setInterval(e,100);s.on("data",o=>{t+=o.length}),s.on("end",()=>{clearInterval(r),e(),process.stderr.write(`
4
+ Finished downloading assets
5
+ `)})}function vt(){let s=nt();if(!s?.apiKey)throw new Error("Not logged in. Please provide apiKey or run: sharetribe-cli login");return s.apiKey}function wt(s,t){let e=new URL(ot()+"/assets/pull");return e.searchParams.set("marketplace",s),t?e.searchParams.set("version",t):e.searchParams.set("version-alias","latest"),e}function Pt(s,t){try{let r=JSON.parse(s).errors?.[0]?.message;if(r)return r}catch{}return s||`HTTP ${t}`}async function Ct(s,t){let e=wt(s,t),r=vt(),o=e.protocol==="https:",n=o?pt:lt;return new Promise((i,a)=>{let p=n.request({method:"GET",hostname:e.hostname,port:e.port||(o?443:80),path:e.pathname+e.search,headers:{Authorization:`Apikey ${r}`,Accept:"application/zip"}},l=>{let m=l.statusCode||0;if(m<200||m>=300){let u=[];l.on("data",f=>u.push(f)),l.on("end",()=>{let f=Buffer.concat(u).toString("utf-8");a(new Error(Pt(f,m)))});return}i(l)});p.setTimeout(12e4,()=>{p.destroy(new Error("Request timeout"))}),p.on("error",a),p.end()})}function It(){return k(mt(),`assets-${Date.now()}.zip`)}function bt(s){return s.startsWith(Z)?s.slice(Z.length):s}function Ot(s){return new Promise((t,e)=>{let r=[];s.on("data",o=>r.push(o)),s.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),s.on("error",e)})}async function Rt(s,t){return new Promise((e,r)=>{dt.open(s,{lazyEntries:!0},(o,n)=>{if(o||!n){r(o||new Error("Failed to open zip file"));return}let i=null;n.on("error",r),n.on("end",()=>{if(!i){r(new Error("Asset metadata not found in zip"));return}e(i)}),n.readEntry(),n.on("entry",a=>{if(a.fileName.endsWith("/")){n.readEntry();return}n.openReadStream(a,(p,l)=>{if(p||!l){r(p||new Error("Failed to read zip entry"));return}if(a.fileName===ut){Ot(l).then(f=>{if(i=se(f),!i){r(new Error("Invalid asset metadata"));return}n.readEntry()}).catch(r);return}let m=k(t,bt(a.fileName)),u=at(m);v(u)||K(u,{recursive:!0}),re(l,te(m)).then(()=>n.readEntry()).catch(r)})})})})}async function xt(s,t,e,r){try{if(v(t)||K(t,{recursive:!0}),!b(t).isDirectory())throw new Error(`${t} is not a directory`);let n=r?Et(t):[],i=oe(t),a=It();try{let p=await Ct(s,e);At(p),await re(p,te(a));let l=await Rt(a,t),m=l.version,u=r?new Set(n.filter(S=>!l.assets.some(d=>d.path===S))):new Set,w=i?.version!==m||u.size>0;if(u.size>0)for(let S of u){let d=k(t,S);v(d)&&Y(d)}w?(ne(t,{version:m,assets:l.assets}),console.log(`Version ${m} successfully pulled.`)):console.log("Assets are up to date.")}finally{v(a)&&Y(a)}}catch(o){o&&typeof o=="object"&&"message"in o?c(o.message):c("Failed to pull assets"),process.exit(1)}}function Tt(s,t){let e=new Map(s.map(r=>[r.path,r["content-hash"]]));return t.filter(r=>{let o=e.get(r.path);return!o||o!==r.hash})}async function qt(s,t,e){try{if(!v(t)||!b(t).isDirectory())throw new Error(`${t} is not a valid directory`);let r=oe(t),o=r?.version||"nil",n=yt(t);St(n);let i=Tt(r?.assets||[],n),a=d=>d.toLowerCase().endsWith(".json"),p=i.filter(d=>!a(d.path)),l=new Map(n.map(d=>[d.path,d])),m=[];if(e&&r)for(let d of r.assets)l.has(d.path)||m.push({path:d.path,op:"delete"});if(i.length===0&&m.length===0){console.log("Assets are up to date.");return}if(i.length>0){let d=i.map(g=>g.path).join(", ");console.log(z.green(`Uploading changed assets: ${d}`))}let f=new Map;if(p.length>0){let d=p.map(g=>g.path).join(", ");console.log(z.green(`Staging assets: ${d}`));for(let g of p)try{let A=await st(void 0,s,g.data,g.path);f.set(g.path,A.stagingId)}catch(A){if(A&&typeof A=="object"&&"code"in A&&A.code==="asset-invalid-content"){let Pe="message"in A?A.message:"The file is missing or uses an unsupported format.";throw new Error(`Failed to stage image ${g.path}: ${Pe}
6
+ Fix the file and rerun assets push to retry staging.`)}throw A}}let w=i.map(d=>{let g=f.get(d.path);return{path:d.path,op:"upsert",...g?{stagingId:g}:{data:d.data,filename:d.path}}}),S=await rt(void 0,s,o,[...w,...m]);ne(t,{version:S.version,assets:S.assets.map(d=>({path:d.path,"content-hash":d.contentHash}))}),console.log(`New version ${S.version} successfully created.`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to push assets"),process.exit(1)}}function ie(s){let t=s.command("assets").description("manage marketplace assets");t.command("pull").description("pull assets from remote").requiredOption("--path <PATH>","path to directory where assets will be stored").option("--version <VERSION>","version of assets to pull").option("--prune","delete local files no longer present as remote assets").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await xt(r,e.path,e.version,e.prune)}),t.command("push").description("push assets to remote").requiredOption("--path <PATH>","path to directory with assets").option("--prune","delete remote assets no longer present locally").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await qt(r,e.path,e.prune)})}import{sendNotification as Mt,previewNotification as Dt}from"sharetribe-flex-build-sdk";import{readFileSync as U,existsSync as O,statSync as _t}from"node:fs";import{join as ae}from"node:path";import{createServer as Lt}from"node:http";function ce(s){if(!O(s)||!_t(s).isDirectory())throw new Error(`Template directory not found: ${s}`);let t=ae(s,"template.html"),e=ae(s,"template-subject.txt");if(!O(t))throw new Error(`template.html not found in ${s}`);if(!O(e))throw new Error(`template-subject.txt not found in ${s}`);let r=U(t,"utf-8"),o=U(e,"utf-8").trim();return{html:r,subject:o}}function le(s){if(!s)return;if(!O(s))throw new Error(`Context file not found: ${s}`);let t=U(s,"utf-8");try{return JSON.parse(t)}catch(e){throw new Error(`Invalid JSON in context file: ${e}`)}}async function Nt(s,t,e){try{let r=ce(t),o=le(e),n=await Mt(void 0,s,{template:r,context:o});console.log(`Preview successfully sent to ${n.adminEmail}`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to send notification"),process.exit(1)}}async function $t(s,t,e){try{let r=ce(t),o=le(e);console.log(`Template: ${t}`),console.log(`Subject: ${r.subject}`),console.log(""),console.log("Starting preview server at http://localhost:3535"),console.log("Press Ctrl+C to stop"),console.log("");let n=null,i=async()=>{try{let m=(await Dt(void 0,s,{template:r,context:o})).html,u=`<title>${r.subject}</title>`;m.includes("<head>")?n=m.replace("<head>",`<head>
7
+ ${u}`):m.includes("<html>")?n=m.replace("<html>",`<html>
8
+ <head>${u}</head>`):n=`<html><head>${u}</head><body>${m}</body></html>`}catch(l){n=`
7
9
  <html>
8
10
  <head><title>Error</title></head>
9
11
  <body style="font-family: sans-serif; padding: 20px;">
@@ -11,10 +13,10 @@ ${f}`):m.includes("<html>")?n=m.replace("<html>",`<html>
11
13
  <pre style="background: #f5f5f5; padding: 15px; border-radius: 4px;">${l&&typeof l=="object"&&"message"in l?l.message:"Failed to preview notification"}</pre>
12
14
  </body>
13
15
  </html>
14
- `}};await i();let a=ut(async(l,m)=>{l.url==="/"||l.url===""?(await i(),m.writeHead(200,{"Content-Type":"text/html"}),m.end(n)):(m.writeHead(404,{"Content-Type":"text/plain"}),m.end("Not Found"))});a.listen(3535,()=>{console.log("Preview server started. Open http://localhost:3535 in your browser.")});let p=()=>{console.log(`
15
- Shutting down preview server...`),a.close(()=>{process.exit(0)})};process.on("SIGINT",p),process.on("SIGTERM",p)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to preview notification"),process.exit(1)}}function ae(r){let t=r.command("notifications").description("manage email notifications");t.command("preview").description("render a preview of an email template").requiredOption("--template <TEMPLATE_DIR>","path to template directory").option("--context <CONTEXT_FILE>","path to email rendering context JSON file").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await gt(s,e.template,e.context)}),t.command("send").description("send a preview of an email template to the logged in admin").requiredOption("--template <TEMPLATE_DIR>","path to template directory").option("--context <CONTEXT_FILE>","path to email rendering context JSON file").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await ht(s,e.template,e.context)})}import{getListingApprovalStatus as yt,enableListingApproval as Et,disableListingApproval as St}from"sharetribe-flex-build-sdk";async function kt(r){try{(await yt(void 0,r)).enabled?console.log(`Listing approvals are enabled in ${r}`):console.log(`Listing approvals are disabled in ${r}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to get listing approval status"),process.exit(1)}}async function vt(r){try{await Et(void 0,r),console.log(`Successfully enabled listing approvals in ${r}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to enable listing approvals"),process.exit(1)}}async function At(r){try{await St(void 0,r),console.log(`Successfully disabled listing approvals in ${r}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to disable listing approvals"),process.exit(1)}}function ce(r){let t=r.command("listing-approval").description("manage listing approvals (DEPRECATED - use Console instead)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");t.action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await kt(s)}),t.command("enable").description("enable listing approvals").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await vt(s)}),t.command("disable").description("disable listing approvals").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await At(s)})}import{queryEvents as wt,pollEvents as Ct}from"sharetribe-flex-build-sdk";function le(r){if([r.sequenceId!==void 0,r.afterSeqId!==void 0,r.beforeSeqId!==void 0,r.afterTs!==void 0,r.beforeTs!==void 0].filter(Boolean).length>1)throw new Error("Only one of --seqid, --after-seqid, --before-seqid, --after-ts, or --before-ts can be specified");if(r.resourceId&&r.relatedResourceId)throw new Error("Only one of --resource or --related-resource can be specified")}function pe(r){try{let t=new Date(r),e=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),n=t.toLocaleTimeString("en-US");return`${e}-${s}-${o} ${n}`}catch{return r}}async function Pt(r,t){try{le(t);let e=await wt(void 0,r,{resourceId:t.resourceId,relatedResourceId:t.relatedResourceId,eventTypes:t.eventTypes,sequenceId:t.sequenceId,afterSeqId:t.afterSeqId,beforeSeqId:t.beforeSeqId,afterTs:t.afterTs,beforeTs:t.beforeTs,limit:t.limit});if(e.length===0){console.log("No events found.");return}if(t.json)for(let s of e){let{auditEmails:o,...n}=s;console.log(JSON.stringify(n))}else if(t.jsonPretty)for(let s of e){let{auditEmails:o,...n}=s;console.log(JSON.stringify(n,null,2))}else w(["Seq ID","Resource ID","Event type","Created at local time","Source","Actor"],e.map(s=>{let o=s.auditEmails?.userEmail||s.auditEmails?.adminEmail||"",n=s.source?.replace("source/","")||"";return{"Seq ID":s.sequenceId.toString(),"Resource ID":s.resourceId,"Event type":s.eventType,"Created at local time":pe(s.createdAt),Source:n,Actor:o}}))}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to query events"),process.exit(1)}}async function It(r,t){try{le(t),console.log("Tailing events... Press Ctrl+C to stop"),console.log("");let e=Ct(void 0,r,{resourceId:t.resourceId,relatedResourceId:t.relatedResourceId,eventTypes:t.eventTypes,limit:t.limit||10},o=>{if(t.json)for(let n of o){let{auditEmails:i,...a}=n;console.log(JSON.stringify(a))}else if(t.jsonPretty)for(let n of o){let{auditEmails:i,...a}=n;console.log(JSON.stringify(a,null,2))}else w(["Seq ID","Resource ID","Event type","Created at local time","Source","Actor"],o.map(n=>{let i=n.auditEmails?.userEmail||n.auditEmails?.adminEmail||"",a=n.source?.replace("source/","")||"";return{"Seq ID":n.sequenceId.toString(),"Resource ID":n.resourceId,"Event type":n.eventType,"Created at local time":pe(n.createdAt),Source:a,Actor:i}}))},5e3),s=()=>{console.log(`
16
- Stopping tail...`),e(),process.exit(0)};process.on("SIGINT",s),process.on("SIGTERM",s)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to tail events"),process.exit(1)}}function me(r){let t=r.command("events").description("Get a list of events.").option("--resource <RESOURCE_ID>","show events for specific resource ID").option("--related-resource <RELATED_RESOURCE_ID>","show events related to specific resource ID").option("--filter <EVENT_TYPES>","filter by event types (comma-separated)").option("--seqid <SEQUENCE_ID>","get event with specific sequence ID",parseInt).option("--after-seqid <SEQUENCE_ID>","show events after sequence ID (exclusive)",parseInt).option("--before-seqid <SEQUENCE_ID>","show events before sequence ID (exclusive)",parseInt).option("--after-ts <TIMESTAMP>","show events after timestamp").option("--before-ts <TIMESTAMP>","show events before timestamp").option("-l, --limit <NUMBER>","limit results (default: 100, max: 100)",parseInt).option("--json","output as single-line JSON strings").option("--json-pretty","output as indented multi-line JSON").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");t.action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Could not parse arguments:"),console.error("--marketplace is required"),process.exit(1)),await Pt(s,{resourceId:e.resource,relatedResourceId:e.relatedResource,eventTypes:e.filter,sequenceId:e.seqid,afterSeqId:e.afterSeqid,beforeSeqId:e.beforeSeqid,afterTs:e.afterTs,beforeTs:e.beforeTs,limit:e.limit||100,json:e.json,jsonPretty:e.jsonPretty})}),t.command("tail").description("Tail events live as they happen").option("--resource <RESOURCE_ID>","show events for specific resource ID").option("--related-resource <RELATED_RESOURCE_ID>","show events related to specific resource ID").option("--filter <EVENT_TYPES>","filter by event types (comma-separated)").option("-l, --limit <NUMBER>","limit results per poll (default: 10, max: 100)",parseInt).option("--json","output as single-line JSON strings").option("--json-pretty","output as indented multi-line JSON").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Could not parse arguments:"),console.error("--marketplace is required"),process.exit(1)),await It(s,{resourceId:e.resource,relatedResourceId:e.relatedResource,eventTypes:e.filter,limit:e.limit||10,json:e.json,jsonPretty:e.jsonPretty})})}import{updateStripeVersion as Ot,SUPPORTED_STRIPE_VERSIONS as bt}from"sharetribe-flex-build-sdk";import de from"inquirer";async function xt(){return(await de.prompt([{type:"list",name:"version",message:"Select Stripe API version:",choices:[...bt]}])).version}async function Rt(){return console.log(""),console.log("WARNING: Changing Stripe API version may affect your integration."),console.log(""),console.log("After updating the Stripe API version, you may need to:"),console.log("- Handle new Capabilities requirements"),console.log("- Update identity verification settings"),console.log(""),console.log("See Stripe documentation for details:"),console.log("https://stripe.com/docs/connect/capabilities-overview"),console.log("https://stripe.com/docs/connect/identity-verification"),console.log(""),(await de.prompt([{type:"confirm",name:"confirmed",message:"Do you want to continue?",default:!1}])).confirmed}async function qt(r,t,e){try{let s=t;s||(s=await xt()),e||await Rt()||(console.log("Cancelled."),process.exit(0)),await Ot(void 0,r,s),console.log(`Stripe API version successfully changed to ${s}`)}catch(s){s&&typeof s=="object"&&"message"in s?c(s.message):c("Failed to update Stripe API version"),process.exit(1)}}function fe(r){r.command("stripe").description("manage Stripe integration").command("update-version").description("update Stripe API version in use").option("--version <VERSION>","Stripe API version to update to").option("-f, --force","skip confirmation prompt and force update").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let s=e.marketplace||r.opts().marketplace;s||(console.error("Error: --marketplace is required"),process.exit(1)),await qt(s,e.version,e.force)})}import P from"jsedn";import{getConfigMap as Tt,readAuth as Mt}from"sharetribe-flex-build-sdk";function Dt(r){return r.length<=4?`...${r}`:`...${r.slice(-4)}`}function _t(r){let t=[];for(let[e,s]of Object.entries(r))t.push(P.kw(`:${e}`),s);return new P.Map(t)}function ue(){let r=Mt(),t=r?.apiKey?Dt(r.apiKey):"No API key set",e=Tt(),s=new P.Map([P.kw(":api-key"),t,P.kw(":conf-map"),_t(e)]);console.log(P.encode(s))}function Lt(r){let t=[],e=!r.parent,s=r.description();if(s&&(t.push(s),t.push("")),e){let a=r.version();a&&(t.push("VERSION"),t.push(` ${a}`),t.push(""))}t.push("USAGE");let o=Nt(r);t.push(` $ ${o}`),t.push("");let n=ge(r),i=r.options.length>0&&!e;if(n.length>0&&!i){t.push("COMMANDS");let a=Math.max(...n.map(p=>p.name.length));for(let p of n){let l=p.name.padEnd(a+2);t.push(` ${l}${p.description}`)}t.push("")}if(!e){let a=r.options;if(a.length>0){t.push("OPTIONS");let p=Math.max(...a.map(l=>he(l).length));for(let l of a){let f=he(l).padEnd(p+2),h=l.description||"";t.push(` ${f}${h}`)}t.push("")}}if(n.length>0&&!i){t.push("Subcommand help:");let a=ye(r);t.push(` $ ${a} help [COMMAND]`)}return t.push(""),t.join(`
17
- `)}function ge(r){let t=[],e=r.commands.filter(s=>!s._hidden&&s.name()!=="help");for(let s of e){let o=$t(s),n=s.commands.filter(i=>!i._hidden);if(s.description()&&t.push({name:o,description:s.description()||""}),n.length>0){let i=ge(s);for(let a of i)t.push(a)}}return r.parent||t.unshift({name:"help",description:"display help for Flex CLI"}),t.sort((s,o)=>s.name.localeCompare(o.name)),t}function ye(r){let t=[],e=r;for(;e;)e.name()&&t.unshift(e.name()),e=e.parent;return t.length>0&&(t[0]="sharetribe-cli"),t.join(" ")}function Nt(r){let t=ye(r),e=r.commands.filter(n=>!n._hidden),s=r.options.length>0;return!r.parent&&e.length>0?`${t} [COMMAND]`:e.length>0&&!s?`${t} [COMMAND]`:t}function $t(r){let t=[],e=r;for(;e&&e.parent;)e.name()&&t.unshift(e.name()),e=e.parent;return t.join(" ")}function he(r){let e=(r.flags||"").split(/,\s*/),s=[];for(let o of e){let n=o.trim(),i=n.match(/^((?:-{1,2}[\w-]+))\s*[<\[]([^\]>]+)[\]>]/);if(i){let a=i[1],p=i[2];s.push(`${a}=${p}`)}else s.push(n)}return s.join(", ")}function Ee(r){r.configureHelp({formatHelp:(t,e)=>Lt(t)})}function Se(r){let t=r.findIndex(o=>o==="process");if(t===-1)return r;let e=r[t+1];return e&&["list","create","push","pull","create-alias","update-alias","delete-alias","deploy"].includes(e)?[...r.slice(0,t),`process-${e}`,...r.slice(t+2)]:r}var Ht=Kt(import.meta.url),Jt=Ut(Ht),Bt=JSON.parse(Ft(Vt(Jt,"../package.json"),"utf-8")),ke=Se(process.argv),u=new jt;Ee(u);u.configureOutput({writeOut:r=>process.stdout.write(r+`
18
- `),writeErr:r=>process.stderr.write(r+`
19
- `)});u.name("sharetribe-cli").description("CLI to interact with Sharetribe Flex").version(Bt.version,"-V","output the version number").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");u.command("version").description("show version").action(()=>{J()});u.command("login").description("log in with API key").action(async()=>{await B()});u.command("logout").description("logout").action(async()=>{await W()});u.command("debug").description("display debug info").action(()=>{ue()});G(u);Y(u);re(u);ae(u);ce(u);me(u);fe(u);u.command("help [command...]").description("display help for Flex CLI").action(r=>{if(!r||r.length===0){u.outputHelp();return}let t=u;for(let e of r){let s=t.commands.find(o=>o.name()===e);s||(console.error(`Unknown command: ${r.join(" ")}`),process.exit(1)),t=s}t.outputHelp()});ke.slice(2).length?u.parse(ke):u.outputHelp();
16
+ `}};await i();let a=Lt(async(l,m)=>{l.url==="/"||l.url===""?(await i(),m.writeHead(200,{"Content-Type":"text/html"}),m.end(n)):(m.writeHead(404,{"Content-Type":"text/plain"}),m.end("Not Found"))});a.listen(3535,()=>{console.log("Preview server started. Open http://localhost:3535 in your browser.")});let p=()=>{console.log(`
17
+ Shutting down preview server...`),a.close(()=>{process.exit(0)})};process.on("SIGINT",p),process.on("SIGTERM",p)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to preview notification"),process.exit(1)}}function pe(s){let t=s.command("notifications").description("manage email notifications");t.command("preview").description("render a preview of an email template").requiredOption("--template <TEMPLATE_DIR>","path to template directory").option("--context <CONTEXT_FILE>","path to email rendering context JSON file").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await $t(r,e.template,e.context)}),t.command("send").description("send a preview of an email template to the logged in admin").requiredOption("--template <TEMPLATE_DIR>","path to template directory").option("--context <CONTEXT_FILE>","path to email rendering context JSON file").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Nt(r,e.template,e.context)})}import{getListingApprovalStatus as jt,enableListingApproval as Ft,disableListingApproval as Kt}from"sharetribe-flex-build-sdk";async function Ut(s){try{(await jt(void 0,s)).enabled?console.log(`Listing approvals are enabled in ${s}`):console.log(`Listing approvals are disabled in ${s}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to get listing approval status"),process.exit(1)}}async function Vt(s){try{await Ft(void 0,s),console.log(`Successfully enabled listing approvals in ${s}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to enable listing approvals"),process.exit(1)}}async function Ht(s){try{await Kt(void 0,s),console.log(`Successfully disabled listing approvals in ${s}`)}catch(t){t&&typeof t=="object"&&"message"in t?c(t.message):c("Failed to disable listing approvals"),process.exit(1)}}function me(s){let t=s.command("listing-approval").description("manage listing approvals (DEPRECATED - use Console instead)").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");t.action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Ut(r)}),t.command("enable").description("enable listing approvals").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Vt(r)}),t.command("disable").description("disable listing approvals").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{console.warn("Warning: CLI command `listing-approval` is deprecated. Use Console instead.");let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Ht(r)})}import{queryEvents as Jt,pollEvents as Bt}from"sharetribe-flex-build-sdk";function de(s){if([s.sequenceId!==void 0,s.afterSeqId!==void 0,s.beforeSeqId!==void 0,s.afterTs!==void 0,s.beforeTs!==void 0].filter(Boolean).length>1)throw new Error("Only one of --seqid, --after-seqid, --before-seqid, --after-ts, or --before-ts can be specified");if(s.resourceId&&s.relatedResourceId)throw new Error("Only one of --resource or --related-resource can be specified")}function ue(s){try{let t=new Date(s),e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0"),n=t.toLocaleTimeString("en-US");return`${e}-${r}-${o} ${n}`}catch{return s}}async function Wt(s,t){try{de(t);let e=await Jt(void 0,s,{resourceId:t.resourceId,relatedResourceId:t.relatedResourceId,eventTypes:t.eventTypes,sequenceId:t.sequenceId,afterSeqId:t.afterSeqId,beforeSeqId:t.beforeSeqId,afterTs:t.afterTs,beforeTs:t.beforeTs,limit:t.limit});if(e.length===0){console.log("No events found.");return}if(t.json)for(let r of e){let{auditEmails:o,...n}=r;console.log(JSON.stringify(n))}else if(t.jsonPretty)for(let r of e){let{auditEmails:o,...n}=r;console.log(JSON.stringify(n,null,2))}else P(["Seq ID","Resource ID","Event type","Created at local time","Source","Actor"],e.map(r=>{let o=r.auditEmails?.userEmail||r.auditEmails?.adminEmail||"",n=r.source?.replace("source/","")||"";return{"Seq ID":r.sequenceId.toString(),"Resource ID":r.resourceId,"Event type":r.eventType,"Created at local time":ue(r.createdAt),Source:n,Actor:o}}))}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to query events"),process.exit(1)}}async function Gt(s,t){try{de(t),console.log("Tailing events... Press Ctrl+C to stop"),console.log("");let e=Bt(void 0,s,{resourceId:t.resourceId,relatedResourceId:t.relatedResourceId,eventTypes:t.eventTypes,limit:t.limit||10},o=>{if(t.json)for(let n of o){let{auditEmails:i,...a}=n;console.log(JSON.stringify(a))}else if(t.jsonPretty)for(let n of o){let{auditEmails:i,...a}=n;console.log(JSON.stringify(a,null,2))}else P(["Seq ID","Resource ID","Event type","Created at local time","Source","Actor"],o.map(n=>{let i=n.auditEmails?.userEmail||n.auditEmails?.adminEmail||"",a=n.source?.replace("source/","")||"";return{"Seq ID":n.sequenceId.toString(),"Resource ID":n.resourceId,"Event type":n.eventType,"Created at local time":ue(n.createdAt),Source:a,Actor:i}}))},5e3),r=()=>{console.log(`
18
+ Stopping tail...`),e(),process.exit(0)};process.on("SIGINT",r),process.on("SIGTERM",r)}catch(e){e&&typeof e=="object"&&"message"in e?c(e.message):c("Failed to tail events"),process.exit(1)}}function fe(s){let t=s.command("events").description("Get a list of events.").option("--resource <RESOURCE_ID>","show events for specific resource ID").option("--related-resource <RELATED_RESOURCE_ID>","show events related to specific resource ID").option("--filter <EVENT_TYPES>","filter by event types (comma-separated)").option("--seqid <SEQUENCE_ID>","get event with specific sequence ID",parseInt).option("--after-seqid <SEQUENCE_ID>","show events after sequence ID (exclusive)",parseInt).option("--before-seqid <SEQUENCE_ID>","show events before sequence ID (exclusive)",parseInt).option("--after-ts <TIMESTAMP>","show events after timestamp").option("--before-ts <TIMESTAMP>","show events before timestamp").option("-l, --limit <NUMBER>","limit results (default: 100, max: 100)",parseInt).option("--json","output as single-line JSON strings").option("--json-pretty","output as indented multi-line JSON").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");t.action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Could not parse arguments:"),console.error("--marketplace is required"),process.exit(1)),await Wt(r,{resourceId:e.resource,relatedResourceId:e.relatedResource,eventTypes:e.filter,sequenceId:e.seqid,afterSeqId:e.afterSeqid,beforeSeqId:e.beforeSeqid,afterTs:e.afterTs,beforeTs:e.beforeTs,limit:e.limit||100,json:e.json,jsonPretty:e.jsonPretty})}),t.command("tail").description("Tail events live as they happen").option("--resource <RESOURCE_ID>","show events for specific resource ID").option("--related-resource <RELATED_RESOURCE_ID>","show events related to specific resource ID").option("--filter <EVENT_TYPES>","filter by event types (comma-separated)").option("-l, --limit <NUMBER>","limit results per poll (default: 10, max: 100)",parseInt).option("--json","output as single-line JSON strings").option("--json-pretty","output as indented multi-line JSON").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Could not parse arguments:"),console.error("--marketplace is required"),process.exit(1)),await Gt(r,{resourceId:e.resource,relatedResourceId:e.relatedResource,eventTypes:e.filter,limit:e.limit||10,json:e.json,jsonPretty:e.jsonPretty})})}import{updateStripeVersion as Qt,SUPPORTED_STRIPE_VERSIONS as Yt}from"sharetribe-flex-build-sdk";import he from"inquirer";async function zt(){return(await he.prompt([{type:"list",name:"version",message:"Select Stripe API version:",choices:[...Yt]}])).version}async function Zt(){return console.log(""),console.log("WARNING: Changing Stripe API version may affect your integration."),console.log(""),console.log("After updating the Stripe API version, you may need to:"),console.log("- Handle new Capabilities requirements"),console.log("- Update identity verification settings"),console.log(""),console.log("See Stripe documentation for details:"),console.log("https://stripe.com/docs/connect/capabilities-overview"),console.log("https://stripe.com/docs/connect/identity-verification"),console.log(""),(await he.prompt([{type:"confirm",name:"confirmed",message:"Do you want to continue?",default:!1}])).confirmed}async function Xt(s,t,e){try{let r=t;r||(r=await zt()),e||await Zt()||(console.log("Cancelled."),process.exit(0)),await Qt(void 0,s,r),console.log(`Stripe API version successfully changed to ${r}`)}catch(r){r&&typeof r=="object"&&"message"in r?c(r.message):c("Failed to update Stripe API version"),process.exit(1)}}function ge(s){s.command("stripe").description("manage Stripe integration").command("update-version").description("update Stripe API version in use").option("--version <VERSION>","Stripe API version to update to").option("-f, --force","skip confirmation prompt and force update").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier").action(async e=>{let r=e.marketplace||s.opts().marketplace;r||(console.error("Error: --marketplace is required"),process.exit(1)),await Xt(r,e.version,e.force)})}import{getConfigMap as er,readAuth as tr}from"sharetribe-flex-build-sdk";function rr(s){return s.length<=4?`...${s}`:`...${s.slice(-4)}`}function ye(){let s=tr(),t=s?.apiKey?rr(s.apiKey):"No API key set",e=er(),r=Object.keys(e).sort().map(n=>`:${n} ${e[n]}`).join(" "),o=r?`{${r}}`:"{}";console.log(`{:api-key ${t}, :conf-map ${o}}`)}function sr(s){let t=[],e=!s.parent,r=s.description();if(r&&(t.push(r),t.push("")),e){let a=s.version();a&&(t.push("VERSION"),t.push(` ${a}`),t.push(""))}t.push("USAGE");let o=or(s);t.push(` $ ${o}`),t.push("");let n=Se(s),i=s.options.length>0&&!e;if(n.length>0&&!i){t.push("COMMANDS");let a=Math.max(...n.map(p=>p.name.length));for(let p of n){let l=p.name.padEnd(a+2);t.push(` ${l}${p.description}`)}t.push("")}if(!e){let a=s.options;if(a.length>0){t.push("OPTIONS");let p=Math.max(...a.map(l=>Ee(l).length));for(let l of a){let u=Ee(l).padEnd(p+2),f=l.description||"";t.push(` ${u}${f}`)}t.push("")}}if(n.length>0&&!i){t.push("Subcommand help:");let a=ke(s);t.push(` $ ${a} help [COMMAND]`)}return t.push(""),t.join(`
19
+ `)}function Se(s){let t=[],e=s.commands.filter(r=>!r._hidden&&r.name()!=="help");for(let r of e){let o=nr(r),n=r.commands.filter(i=>!i._hidden);if(r.description()&&t.push({name:o,description:r.description()||""}),n.length>0){let i=Se(r);for(let a of i)t.push(a)}}return s.parent||t.unshift({name:"help",description:"display help for Flex CLI"}),t.sort((r,o)=>r.name.localeCompare(o.name)),t}function ke(s){let t=[],e=s;for(;e;)e.name()&&t.unshift(e.name()),e=e.parent;return t.length>0&&(t[0]="sharetribe-cli"),t.join(" ")}function or(s){let t=ke(s),e=s.commands.filter(n=>!n._hidden),r=s.options.length>0;return!s.parent&&e.length>0?`${t} [COMMAND]`:e.length>0&&!r?`${t} [COMMAND]`:t}function nr(s){let t=[],e=s;for(;e&&e.parent;)e.name()&&t.unshift(e.name()),e=e.parent;return t.join(" ")}function Ee(s){let e=(s.flags||"").split(/,\s*/),r=[];for(let o of e){let n=o.trim(),i=n.match(/^((?:-{1,2}[\w-]+))\s*[<\[]([^\]>]+)[\]>]/);if(i){let a=i[1],p=i[2];r.push(`${a}=${p}`)}else r.push(n)}return r.join(", ")}function Ae(s){s.configureHelp({formatHelp:(t,e)=>sr(t)})}function ve(s){let t=s.findIndex(o=>o==="process");if(t===-1)return s;let e=s[t+1];return e&&["list","create","push","pull","create-alias","update-alias","delete-alias","deploy"].includes(e)?[...s.slice(0,t),`process-${e}`,...s.slice(t+2)]:s}var mr=cr(import.meta.url),dr=lr(mr),ur=JSON.parse(ar(pr(dr,"../package.json"),"utf-8")),we=ve(process.argv),h=new ir;Ae(h);h.configureOutput({writeOut:s=>process.stdout.write(s+`
20
+ `),writeErr:s=>process.stderr.write(s+`
21
+ `)});h.name("sharetribe-cli").description("CLI to interact with Sharetribe Flex").version(ur.version,"-V","output the version number").option("-m, --marketplace <MARKETPLACE_ID>","marketplace identifier");h.command("version").description("show version").action(()=>{H()});h.command("login").description("log in with API key").action(async()=>{await J()});h.command("logout").description("logout").action(async()=>{await B()});h.command("debug").description("display debug info").action(()=>{ye()});W(h);Q(h);ie(h);pe(h);me(h);fe(h);ge(h);h.command("help [command...]").description("display help for Flex CLI").action(s=>{if(!s||s.length===0){h.outputHelp();return}let t=h;for(let e of s){let r=t.commands.find(o=>o.name()===e);r||(console.error(`Unknown command: ${s.join(" ")}`),process.exit(1)),t=r}t.outputHelp()});we.slice(2).length?h.parse(we):h.outputHelp();
20
22
  //# sourceMappingURL=index.js.map