@stacksjs/ts-cloud 0.2.18 → 0.2.19

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/bin/cli.js CHANGED
@@ -6900,10 +6900,10 @@ async function sendFallbackSms(to, message) {
6900
6900
  `)){let B=K.trim();if(!B||B.startsWith("#")||B.startsWith(";"))continue;let j=B.match(/^\[([^\]]+)\]$/);if(j){if(z===$&&G&&H)return{accessKeyId:G,secretAccessKey:H,sessionToken:A};z=j[1],G=void 0,H=void 0,A=void 0;continue}if(z===$){let[X,...O]=B.split("="),_=O.join("=").trim();switch(X.trim().toLowerCase()){case"aws_access_key_id":G=_;break;case"aws_secret_access_key":H=_;break;case"aws_session_token":A=_;break}}}if(z===$&&G&&H)return{accessKeyId:G,secretAccessKey:H,sessionToken:A};return null}var G5={};Z1(G5,{S3Client:()=>F0});import*as a from"node:crypto";import{readdir as UB}from"node:fs/promises";import{join as WB}from"node:path";import{readFileSync as kZ}from"node:fs";function hZ($){let{buffer:J,byteOffset:Y,byteLength:Q}=$;if(J instanceof ArrayBuffer)return J.slice(Y,Y+Q);let Z=new ArrayBuffer(Q);return new Uint8Array(Z).set(new Uint8Array($)),Z}class F0{client;region;explicitProfile;endpoint;forcePathStyle;explicitCredentials;constructor($="us-east-1",J,Y){this.region=$,this.explicitProfile=J,this.endpoint=Y?.endpoint,this.forcePathStyle=Y?.forcePathStyle,this.explicitCredentials=Y?.credentials,this.client=new t(Y?.credentials??E$(J),{endpoint:Y?.endpoint,forcePathStyle:Y?.forcePathStyle})}getCredentials(){if(this.explicitCredentials?.accessKeyId&&this.explicitCredentials.secretAccessKey)return this.explicitCredentials;let $=E$(this.explicitProfile);if($.accessKeyId&&$.secretAccessKey)return $;throw Error("S3 credentials not found. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY (or pass explicit credentials/profile), or configure ~/.aws/credentials.")}s3BaseHost(){return this.endpoint||`s3.${this.region}.amazonaws.com`}s3VirtualHost($){return this.forcePathStyle?this.s3BaseHost():`${$}.${this.s3BaseHost()}`}async listBuckets(){let $=await this.client.request({service:"s3",region:this.region,method:"GET",path:"/"}),J=[],Q=($?.ListAllMyBucketsResult??$)?.Buckets?.Bucket;if(Q){let Z=Array.isArray(Q)?Q:[Q];for(let U of Z)J.push({Name:U.Name,CreationDate:U.CreationDate})}return{Buckets:J}}async createBucket($,J){let Y={};if(J?.acl)Y["x-amz-acl"]=J.acl;let Q;if(this.region!=="us-east-1"&&!this.endpoint)Q=`<?xml version="1.0" encoding="UTF-8"?>
6901
6901
  <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
6902
6902
  <LocationConstraint>${this.region}</LocationConstraint>
6903
- </CreateBucketConfiguration>`,Y["Content-Type"]="application/xml";await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${$}`,headers:Y,body:Q})}async deleteBucket($){await this.client.request({service:"s3",region:this.region,method:"DELETE",path:`/${$}`})}async emptyAndDeleteBucket($){let J=!0;while(J){let Y=await this.listAllObjects({bucket:$});if(Y.length===0){J=!1;break}let Q=Y.map((Z)=>Z.Key);for(let Z=0;Z<Q.length;Z+=1000){let U=Q.slice(Z,Z+1000);await this.deleteObjects($,U)}}await this.deleteBucket($)}async listAllObjects($){let J=[],Y;do{let Q={"list-type":"2","max-keys":"1000"};if($.prefix)Q.prefix=$.prefix;if(Y)Q["continuation-token"]=Y;let Z=await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$.bucket}`,queryParams:Q}),U=Z?.ListBucketResult??Z,W=U?.Contents;if(W){let G=Array.isArray(W)?W:[W];for(let H of G)J.push({Key:H.Key,LastModified:H.LastModified||"",Size:Number.parseInt(H.Size||"0"),ETag:H.ETag})}let z=U?.IsTruncated;Y=z==="true"||z===!0?U?.NextContinuationToken:void 0}while(Y);return J}async list($){let J=await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$.bucket}`}),Y=[],Z=(J?.ListBucketResult??J)?.Contents;if(Z){let U=Array.isArray(Z)?Z:[Z];for(let W of U){if($.prefix&&!W.Key?.startsWith($.prefix))continue;if(Y.push({Key:W.Key||"",LastModified:W.LastModified||"",Size:Number.parseInt(W.Size||"0"),ETag:W.ETag}),$.maxKeys&&Y.length>=$.maxKeys)break}}return Y}async putObject($){let J={};if($.acl)J["x-amz-acl"]=$.acl;if($.cacheControl)J["Cache-Control"]=$.cacheControl;if($.contentType)J["Content-Type"]=$.contentType;if($.metadata)for(let[Q,Z]of Object.entries($.metadata))J[`x-amz-meta-${Q}`]=Z;let Y=$.body instanceof Uint8Array&&!Buffer.isBuffer($.body)?Buffer.from($.body):$.body;if(Buffer.isBuffer(Y)||Y instanceof Uint8Array){let Q=Buffer.isBuffer(Y)?Y:Buffer.from(Y),{accessKeyId:Z,secretAccessKey:U,sessionToken:W}=this.getCredentials(),z=this.s3VirtualHost($.bucket),G=$.key.split("/").map((y)=>encodeURIComponent(y)).join("/"),H=`https://${z}/${G}`,A=new Date,K=A.toISOString().replace(/[:-]|\.\d{3}/g,""),B=A.toISOString().slice(0,10).replace(/-/g,""),j=a.createHash("sha256").update(Q).digest("hex"),X={host:z,"x-amz-date":K,"x-amz-content-sha256":j,...J};if(W)X["x-amz-security-token"]=W;let O=Object.keys(X).sort().map((y)=>`${y.toLowerCase()}:${X[y].trim()}
6904
- `).join(""),_=Object.keys(X).sort().map((y)=>y.toLowerCase()).join(";"),w=["PUT",`/${G}`,"",O,_,j].join(`
6903
+ </CreateBucketConfiguration>`,Y["Content-Type"]="application/xml";await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${$}`,headers:Y,body:Q})}async deleteBucket($){await this.client.request({service:"s3",region:this.region,method:"DELETE",path:`/${$}`})}async emptyAndDeleteBucket($){let J=!0;while(J){let Y=await this.listAllObjects({bucket:$});if(Y.length===0){J=!1;break}let Q=Y.map((Z)=>Z.Key);for(let Z=0;Z<Q.length;Z+=1000){let U=Q.slice(Z,Z+1000);await this.deleteObjects($,U)}}await this.deleteBucket($)}async listAllObjects($){let J=[],Y;do{let Q={"list-type":"2","max-keys":"1000"};if($.prefix)Q.prefix=$.prefix;if(Y)Q["continuation-token"]=Y;let Z=await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$.bucket}`,queryParams:Q}),U=Z?.ListBucketResult??Z,W=U?.Contents;if(W){let G=Array.isArray(W)?W:[W];for(let H of G)J.push({Key:H.Key,LastModified:H.LastModified||"",Size:Number.parseInt(H.Size||"0"),ETag:H.ETag})}let z=U?.IsTruncated;Y=z==="true"||z===!0?U?.NextContinuationToken:void 0}while(Y);return J}async list($){let J=await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$.bucket}`}),Y=[],Z=(J?.ListBucketResult??J)?.Contents;if(Z){let U=Array.isArray(Z)?Z:[Z];for(let W of U){if($.prefix&&!W.Key?.startsWith($.prefix))continue;if(Y.push({Key:W.Key||"",LastModified:W.LastModified||"",Size:Number.parseInt(W.Size||"0"),ETag:W.ETag}),$.maxKeys&&Y.length>=$.maxKeys)break}}return Y}async putObject($){let J={};if($.acl)J["x-amz-acl"]=$.acl;if($.cacheControl)J["Cache-Control"]=$.cacheControl;if($.contentType)J["Content-Type"]=$.contentType;if($.metadata)for(let[Z,U]of Object.entries($.metadata))J[`x-amz-meta-${Z}`]=U;let Y=$.key.split("/").map((Z)=>encodeURIComponent(Z)).join("/"),Q=$.body instanceof Uint8Array&&!Buffer.isBuffer($.body)?Buffer.from($.body):$.body;if(Buffer.isBuffer(Q)||Q instanceof Uint8Array){let Z=Buffer.isBuffer(Q)?Q:Buffer.from(Q),{accessKeyId:U,secretAccessKey:W,sessionToken:z}=this.getCredentials(),G=this.s3VirtualHost($.bucket),H=`https://${G}/${Y}`,A=new Date,K=A.toISOString().replace(/[:-]|\.\d{3}/g,""),B=A.toISOString().slice(0,10).replace(/-/g,""),j=a.createHash("sha256").update(Z).digest("hex"),X={host:G,"x-amz-date":K,"x-amz-content-sha256":j,...J};if(z)X["x-amz-security-token"]=z;let O=Object.keys(X).sort().map((y)=>`${y.toLowerCase()}:${X[y].trim()}
6904
+ `).join(""),_=Object.keys(X).sort().map((y)=>y.toLowerCase()).join(";"),w=["PUT",`/${Y}`,"",O,_,j].join(`
6905
6905
  `),E="AWS4-HMAC-SHA256",M=`${B}/${this.region}/s3/aws4_request`,T=[E,K,M,a.createHash("sha256").update(w).digest("hex")].join(`
6906
- `),D=a.createHmac("sha256",`AWS4${U}`).update(B).digest(),N=a.createHmac("sha256",D).update(this.region).digest(),x=a.createHmac("sha256",N).update("s3").digest(),h=a.createHmac("sha256",x).update("aws4_request").digest(),I=a.createHmac("sha256",h).update(T).digest("hex"),b=`${E} Credential=${Z}/${M}, SignedHeaders=${_}, Signature=${I}`,k=await fetch(H,{method:"PUT",headers:{...X,Authorization:b},body:hZ(Q)});if(!k.ok){let y=await k.text();throw Error(`S3 PUT failed: ${k.status} ${y}`)}return}await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${$.key}`,bucket:$.bucket,headers:J,body:$.body})}async getObject($,J){return await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$}/${J}`,rawResponse:!0})}async copyObject($){let J={"x-amz-copy-source":`/${$.sourceBucket}/${$.sourceKey}`};if($.metadataDirective)J["x-amz-metadata-directive"]=$.metadataDirective;if($.contentType)J["Content-Type"]=$.contentType;if($.metadata)for(let[Y,Q]of Object.entries($.metadata))J[`x-amz-meta-${Y}`]=Q;await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${$.destinationBucket}/${$.destinationKey}`,headers:J})}async deleteObject($,J){await this.client.request({service:"s3",region:this.region,method:"DELETE",path:`/${$}/${J}`})}async deleteObjects($,J){let Y=`<?xml version="1.0" encoding="UTF-8"?>
6906
+ `),D=a.createHmac("sha256",`AWS4${W}`).update(B).digest(),N=a.createHmac("sha256",D).update(this.region).digest(),x=a.createHmac("sha256",N).update("s3").digest(),h=a.createHmac("sha256",x).update("aws4_request").digest(),I=a.createHmac("sha256",h).update(T).digest("hex"),b=`${E} Credential=${U}/${M}, SignedHeaders=${_}, Signature=${I}`,k=await fetch(H,{method:"PUT",headers:{...X,Authorization:b},body:hZ(Z)});if(!k.ok){let y=await k.text();throw Error(`S3 PUT failed: ${k.status} ${y}`)}return}await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${Y}`,bucket:$.bucket,headers:J,body:$.body})}async getObject($,J){let Y=J.split("/").map((Z)=>encodeURIComponent(Z)).join("/");return await this.client.request({service:"s3",region:this.region,method:"GET",path:`/${$}/${Y}`,rawResponse:!0})}async copyObject($){let J={"x-amz-copy-source":`/${$.sourceBucket}/${$.sourceKey}`};if($.metadataDirective)J["x-amz-metadata-directive"]=$.metadataDirective;if($.contentType)J["Content-Type"]=$.contentType;if($.metadata)for(let[Y,Q]of Object.entries($.metadata))J[`x-amz-meta-${Y}`]=Q;await this.client.request({service:"s3",region:this.region,method:"PUT",path:`/${$.destinationBucket}/${$.destinationKey}`,headers:J})}async deleteObject($,J){let Y=J.split("/").map((Q)=>encodeURIComponent(Q)).join("/");await this.client.request({service:"s3",region:this.region,method:"DELETE",path:`/${$}/${Y}`})}async deleteObjects($,J){let Y=`<?xml version="1.0" encoding="UTF-8"?>
6907
6907
  <Delete>
6908
6908
  ${J.map((Z)=>`<Object><Key>${Z}</Key></Object>`).join(`
6909
6909
  `)}
@@ -7215,7 +7215,7 @@ Run \`${this.name??"cli"} --help\` for usage.`;r1.stderr.write(`${U}${Z}${W}
7215
7215
  `).length-1;this.output.write(h1.move(-999,$*-1))}render(){let $=BJ(this._render(this)??"",KJ.stdout.columns,{hard:!0,trim:!1});if($===this._prevFrame)return;if(this.state==="initial")this.output.write(h1.hide);else{let J=ZW(this._prevFrame,$);if(this.restoreCursor(),J&&J?.length===1){let Y=J[0];this.output.write(h1.move(0,Y)),this.output.write(o9.lines(1));let Q=$.split(`
7216
7216
  `);this.output.write(Q[Y]),this._prevFrame=$,this.output.write(h1.move(0,Q.length-Y-1));return}if(J&&J?.length>1){let Y=J[0];this.output.write(h1.move(0,Y)),this.output.write(o9.down());let Z=$.split(`
7217
7217
  `).slice(Y);this.output.write(Z.join(`
7218
- `)),this._prevFrame=$;return}this.output.write(o9.down())}if(this.output.write($),this.state==="initial")this.state="active";this._prevFrame=$}}function FW($,J){if($===void 0)return 0;if(J.length===0)return 0;let Q=J.findIndex((Z)=>Z.value===$);return Q!==-1?Q:0}function AW($,J){return(J.label??String(J.value)).toLowerCase().includes($.toLowerCase())}function KW($,J){if(!J)return;if($)return J;return J[0]}class BW extends Z8{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#$=0;#Y="";#Q;#J;get cursor(){return this.#$}get userInputWithCursor(){if(!this.userInput)return T$.inverse(T$.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let $=this.userInput.slice(0,this._cursor),[J,...Y]=this.userInput.slice(this._cursor);return`${$}${T$.inverse(J)}${Y.join("")}`}get options(){if(typeof this.#J==="function")return this.#J();return this.#J}constructor($){super($);this.#J=$.options;let J=this.options;this.filteredOptions=[...J],this.multiple=$.multiple===!0,this.#Q=$.filter??AW;let Y;if($.initialValue&&Array.isArray($.initialValue))if(this.multiple)Y=$.initialValue;else Y=$.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let Q of Y){let Z=J.findIndex((U)=>U.value===Q);if(Z!==-1)this.toggleSelected(Q),this.#$=Z}this.focusedValue=this.options[this.#$]?.value,this.on("key",(Q,Z)=>this.#Z(Q,Z)),this.on("userInput",(Q)=>this.#U(Q))}_isActionKey($,J){return $==="\t"||this.multiple&&this.isNavigating&&J.name==="space"&&$!==void 0&&$!==""}#Z($,J){let Y=J.name==="up",Q=J.name==="down",Z=J.name==="return";if(Y||Q){if(this.#$=Math.max(0,Math.min(this.#$+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(Z)this.value=KW(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&(J.name==="tab"||this.isNavigating&&J.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected($){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes($))this.selectedValues=this.selectedValues.filter((J)=>J!==$);else this.selectedValues=[...this.selectedValues,$];else this.selectedValues=[$]}#U($){if($!==this.#Y){this.#Y=$;let J=this.options;if($)this.filteredOptions=J.filter((Y)=>this.#Q($,Y));else this.filteredOptions=[...J];if(this.#$=FW(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class jW extends Z8{options;cursor=0;#$;getGroupItems($){return this.options.filter((J)=>J.group===$)}isGroupSelected($){let J=this.getGroupItems($),Y=this.value;if(Y===void 0)return!1;return J.every((Q)=>Y.includes(Q.value))}toggleValue(){let $=this.options[this.cursor];if(this.value===void 0)this.value=[];if($.group===!0){let J=$.value,Y=this.getGroupItems(J);if(this.isGroupSelected(J))this.value=this.value.filter((Q)=>Y.findIndex((Z)=>Z.value===Q)===-1);else this.value=[...this.value,...Y.map((Q)=>Q.value)];this.value=Array.from(new Set(this.value))}else{let J=this.value.includes($.value);this.value=J?this.value.filter((Y)=>Y!==$.value):[...this.value,$.value]}}constructor($){super($,!1);let{options:J}=$;this.#$=$.selectableGroups!==!1,this.options=Object.entries(J).flatMap(([Y,Q])=>[{value:Y,group:!0,label:Y},...Q.map((Z)=>({...Z,group:Y}))]),this.value=[...$.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===$.cursorAt),this.#$?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var XW=MU();var j0=($,J)=>XW?$:J,Vj=j0("◆","*"),Lj=j0("■","x"),Mj=j0("▲","x"),Tj=j0("◇","o"),Rj=j0("┌","T"),OW=j0("│","|"),Dj=j0("└","—"),Nj=j0("●",">"),Sj=j0("○"," "),Pj=j0("◻","[•]"),xj=j0("◼","[+]"),Cj=j0("◻","[ ]"),Ij=j0("▪","•"),kj=j0("─","-"),hj=j0("╮","+"),bj=j0("├","+"),yj=j0("╯","+"),vj=j0("●","•"),fj=j0("◆","*"),gj=j0("▲","!"),uj=j0("■","x");var dj={light:j0("─","-"),heavy:j0("━","="),block:j0("█","#")};function _W(){return`${T$.gray(OW)} `}var mj=_W();var U8="0.2.18";import{existsSync as K8}from"node:fs";import{mkdir as NW,writeFile as hJ}from"node:fs/promises";var Y0={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"};function A2($,J){return`${Y0[J]}${$}${Y0.reset}`}function C($){console.log(`${Y0.green}✓${Y0.reset} ${$}`)}function R($){console.error(`${Y0.red}✗${Y0.reset} ${$}`)}function g($){console.warn(`${Y0.yellow}⚠${Y0.reset} ${$}`)}var L1=g;function F($){console.log(`${Y0.blue}ℹ${Y0.reset} ${$}`)}function i($){console.log(`${Y0.cyan}→${Y0.reset} ${$}`)}function V($){console.log(`
7218
+ `)),this._prevFrame=$;return}this.output.write(o9.down())}if(this.output.write($),this.state==="initial")this.state="active";this._prevFrame=$}}function FW($,J){if($===void 0)return 0;if(J.length===0)return 0;let Q=J.findIndex((Z)=>Z.value===$);return Q!==-1?Q:0}function AW($,J){return(J.label??String(J.value)).toLowerCase().includes($.toLowerCase())}function KW($,J){if(!J)return;if($)return J;return J[0]}class BW extends Z8{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#$=0;#Y="";#Q;#J;get cursor(){return this.#$}get userInputWithCursor(){if(!this.userInput)return T$.inverse(T$.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}█`;let $=this.userInput.slice(0,this._cursor),[J,...Y]=this.userInput.slice(this._cursor);return`${$}${T$.inverse(J)}${Y.join("")}`}get options(){if(typeof this.#J==="function")return this.#J();return this.#J}constructor($){super($);this.#J=$.options;let J=this.options;this.filteredOptions=[...J],this.multiple=$.multiple===!0,this.#Q=$.filter??AW;let Y;if($.initialValue&&Array.isArray($.initialValue))if(this.multiple)Y=$.initialValue;else Y=$.initialValue.slice(0,1);else if(!this.multiple&&this.options.length>0)Y=[this.options[0].value];if(Y)for(let Q of Y){let Z=J.findIndex((U)=>U.value===Q);if(Z!==-1)this.toggleSelected(Q),this.#$=Z}this.focusedValue=this.options[this.#$]?.value,this.on("key",(Q,Z)=>this.#Z(Q,Z)),this.on("userInput",(Q)=>this.#U(Q))}_isActionKey($,J){return $==="\t"||this.multiple&&this.isNavigating&&J.name==="space"&&$!==void 0&&$!==""}#Z($,J){let Y=J.name==="up",Q=J.name==="down",Z=J.name==="return";if(Y||Q){if(this.#$=Math.max(0,Math.min(this.#$+(Y?-1:1),this.filteredOptions.length-1)),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)this.selectedValues=[this.focusedValue];this.isNavigating=!0}else if(Z)this.value=KW(this.multiple,this.selectedValues);else if(this.multiple)if(this.focusedValue!==void 0&&(J.name==="tab"||this.isNavigating&&J.name==="space"))this.toggleSelected(this.focusedValue);else this.isNavigating=!1;else{if(this.focusedValue)this.selectedValues=[this.focusedValue];this.isNavigating=!1}}deselectAll(){this.selectedValues=[]}toggleSelected($){if(this.filteredOptions.length===0)return;if(this.multiple)if(this.selectedValues.includes($))this.selectedValues=this.selectedValues.filter((J)=>J!==$);else this.selectedValues=[...this.selectedValues,$];else this.selectedValues=[$]}#U($){if($!==this.#Y){this.#Y=$;let J=this.options;if($)this.filteredOptions=J.filter((Y)=>this.#Q($,Y));else this.filteredOptions=[...J];if(this.#$=FW(this.focusedValue,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#$]?.value,!this.multiple)if(this.focusedValue!==void 0)this.toggleSelected(this.focusedValue);else this.deselectAll()}}}class jW extends Z8{options;cursor=0;#$;getGroupItems($){return this.options.filter((J)=>J.group===$)}isGroupSelected($){let J=this.getGroupItems($),Y=this.value;if(Y===void 0)return!1;return J.every((Q)=>Y.includes(Q.value))}toggleValue(){let $=this.options[this.cursor];if(this.value===void 0)this.value=[];if($.group===!0){let J=$.value,Y=this.getGroupItems(J);if(this.isGroupSelected(J))this.value=this.value.filter((Q)=>Y.findIndex((Z)=>Z.value===Q)===-1);else this.value=[...this.value,...Y.map((Q)=>Q.value)];this.value=Array.from(new Set(this.value))}else{let J=this.value.includes($.value);this.value=J?this.value.filter((Y)=>Y!==$.value):[...this.value,$.value]}}constructor($){super($,!1);let{options:J}=$;this.#$=$.selectableGroups!==!1,this.options=Object.entries(J).flatMap(([Y,Q])=>[{value:Y,group:!0,label:Y},...Q.map((Z)=>({...Z,group:Y}))]),this.value=[...$.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:Y})=>Y===$.cursorAt),this.#$?0:1),this.on("cursor",(Y)=>{switch(Y){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let Q=this.options[this.cursor]?.group===!0;if(!this.#$&&Q)this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}case"space":this.toggleValue();break}})}}var XW=MU();var j0=($,J)=>XW?$:J,Vj=j0("◆","*"),Lj=j0("■","x"),Mj=j0("▲","x"),Tj=j0("◇","o"),Rj=j0("┌","T"),OW=j0("│","|"),Dj=j0("└","—"),Nj=j0("●",">"),Sj=j0("○"," "),Pj=j0("◻","[•]"),xj=j0("◼","[+]"),Cj=j0("◻","[ ]"),Ij=j0("▪","•"),kj=j0("─","-"),hj=j0("╮","+"),bj=j0("├","+"),yj=j0("╯","+"),vj=j0("●","•"),fj=j0("◆","*"),gj=j0("▲","!"),uj=j0("■","x");var dj={light:j0("─","-"),heavy:j0("━","="),block:j0("█","#")};function _W(){return`${T$.gray(OW)} `}var mj=_W();var U8="0.2.19";import{existsSync as K8}from"node:fs";import{mkdir as NW,writeFile as hJ}from"node:fs/promises";var Y0={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"};function A2($,J){return`${Y0[J]}${$}${Y0.reset}`}function C($){console.log(`${Y0.green}✓${Y0.reset} ${$}`)}function R($){console.error(`${Y0.red}✗${Y0.reset} ${$}`)}function g($){console.warn(`${Y0.yellow}⚠${Y0.reset} ${$}`)}var L1=g;function F($){console.log(`${Y0.blue}ℹ${Y0.reset} ${$}`)}function i($){console.log(`${Y0.cyan}→${Y0.reset} ${$}`)}function V($){console.log(`
7219
7219
  ${Y0.bright}${Y0.cyan}${$}${Y0.reset}
7220
7220
  `)}var F8=!!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.BUILDKITE||process.env.CIRCLECI||process.env.GITLAB_CI);class L{frames=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];interval=null;currentFrame=0;message;constructor($){this.message=$}get text(){return this.message}set text($){if(this.message=$,F8&&this.interval)console.log(` ${$}`)}start(){if(F8){console.log(` ${this.message}`),this.interval=!0;return}this.interval=setInterval(()=>{process.stdout.write(`\r${Y0.cyan}${this.frames[this.currentFrame]}${Y0.reset} ${this.message}`),this.currentFrame=(this.currentFrame+1)%this.frames.length},80)}succeed($){this.stop(),C($||this.message)}fail($){this.stop(),R($||this.message)}warn($){this.stop(),L1($||this.message)}stop(){if(this.interval){if(!F8)process.stdout.write("\r");if(typeof this.interval==="object")clearInterval(this.interval);this.interval=null}}}async function A0($,J){let Q=(await import("node:readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise((Z)=>{let U=J?`${Y0.cyan}?${Y0.reset} ${$} ${Y0.gray}(${J})${Y0.reset}: `:`${Y0.cyan}?${Y0.reset} ${$}: `;Q.question(U,(W)=>{Q.close(),Z(W||J||"")})})}async function v($,J=!1){let Y=await A0(`${$} (y/n)`,J?"y":"n");return Y.toLowerCase()==="y"||Y.toLowerCase()==="yes"}async function A8($,J){console.log(`${Y0.cyan}?${Y0.reset} ${$}`),J.forEach((Z,U)=>{console.log(` ${Y0.gray}${U+1}.${Y0.reset} ${Z}`)});let Y=await A0("Select","1"),Q=Number.parseInt(Y)-1;if(Q>=0&&Q<J.length)return J[Q];return J[0]}function d($,J){let Y=$.map((Z,U)=>{let W=Math.max(...J.map((z)=>(z[U]||"").length));return Math.max(Z.length,W)}),Q=$.map((Z,U)=>Z.padEnd(Y[U])).join(" ");console.log(A2(Q,"bright")),console.log(A2("─".repeat(Q.length),"gray")),J.forEach((Z)=>{let U=Z.map((W,z)=>(W||"").padEnd(Y[z])).join(" ");console.log(U)})}function M2($,J="cyan"){let Y=$.split(`
7221
7221
  `),Q=Math.max(...Y.map((U)=>U.length)),Z="─".repeat(Q+2);console.log(A2(`┌${Z}┐`,J)),Y.forEach((U)=>{console.log(A2(`│ ${U.padEnd(Q)} │`,J))}),console.log(A2(`└${Z}┘`,J))}async function xJ(){return!0}async function CJ(){try{let{AWSClient:$}=await Promise.resolve().then(() => (z0(),F2));return await new $().request({service:"sts",region:"us-east-1",method:"POST",path:"/",body:new URLSearchParams({Action:"GetCallerIdentity",Version:"2011-06-15"}).toString()}),!0}catch{return!1}}async function IJ(){try{let{AWSClient:$}=await Promise.resolve().then(() => (z0(),F2)),Y=await new $().request({service:"sts",region:"us-east-1",method:"POST",path:"/",body:new URLSearchParams({Action:"GetCallerIdentity",Version:"2011-06-15"}).toString()});return Y.Account||Y.GetCallerIdentityResult?.Account||null}catch{return null}}async function kJ(){try{let{AWSClient:$}=await Promise.resolve().then(() => (z0(),F2)),Y=await new $().request({service:"ec2",region:"us-east-1",method:"POST",path:"/",body:new URLSearchParams({Action:"DescribeRegions",Version:"2016-11-15"}).toString()}),Q=[];if(Y.regionInfo){let Z=Array.isArray(Y.regionInfo)?Y.regionInfo:[Y.regionInfo];Q.push(...Z.map((U)=>U.regionName))}return Q.length>0?Q:PJ()}catch{return PJ()}}function PJ(){return["us-east-1","us-east-2","us-west-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1","ap-northeast-1"]}function B8($){$.command("init","Initialize a new ts-cloud project").option("--mode <mode>","Deployment mode: server, serverless, or hybrid").option("--name <name>","Project name").option("--region <region>","AWS Region").action(async(J)=>{if(V("Initializing ts-cloud Project"),K8("cloud.config.ts")){if(!await v("cloud.config.ts already exists. Overwrite?",!1)){F("Initialization cancelled");return}}let Y=J?.name||await A0("Project name","my-app"),Q=J?.mode||await A8("Select deployment mode",["serverless","server","hybrid"]),Z=J?.region||await A8("Select AWS region",["us-east-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1"]),U=new L("Creating configuration file...");U.start();let W=`import { defineConfig } from '@ts-cloud/core'
package/dist/index.js CHANGED
@@ -2041,12 +2041,12 @@ class S3Client2 {
2041
2041
  headers[`x-amz-meta-${key}`] = value;
2042
2042
  }
2043
2043
  }
2044
+ const encodedKey = options.key.split("/").map((seg) => encodeURIComponent(seg)).join("/");
2044
2045
  const normalizedBody = options.body instanceof Uint8Array && !Buffer.isBuffer(options.body) ? Buffer.from(options.body) : options.body;
2045
2046
  if (Buffer.isBuffer(normalizedBody) || normalizedBody instanceof Uint8Array) {
2046
2047
  const binaryBody = Buffer.isBuffer(normalizedBody) ? normalizedBody : Buffer.from(normalizedBody);
2047
2048
  const { accessKeyId, secretAccessKey, sessionToken } = this.getCredentials();
2048
2049
  const host = this.s3VirtualHost(options.bucket);
2049
- const encodedKey = options.key.split("/").map((seg) => encodeURIComponent(seg)).join("/");
2050
2050
  const url = `https://${host}/${encodedKey}`;
2051
2051
  const now = new Date;
2052
2052
  const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, "");
@@ -2106,18 +2106,19 @@ class S3Client2 {
2106
2106
  service: "s3",
2107
2107
  region: this.region,
2108
2108
  method: "PUT",
2109
- path: `/${options.key}`,
2109
+ path: `/${encodedKey}`,
2110
2110
  bucket: options.bucket,
2111
2111
  headers,
2112
2112
  body: options.body
2113
2113
  });
2114
2114
  }
2115
2115
  async getObject(bucket, key) {
2116
+ const encodedKey = key.split("/").map((seg) => encodeURIComponent(seg)).join("/");
2116
2117
  const result = await this.client.request({
2117
2118
  service: "s3",
2118
2119
  region: this.region,
2119
2120
  method: "GET",
2120
- path: `/${bucket}/${key}`,
2121
+ path: `/${bucket}/${encodedKey}`,
2121
2122
  rawResponse: true
2122
2123
  });
2123
2124
  return result;
@@ -2146,11 +2147,12 @@ class S3Client2 {
2146
2147
  });
2147
2148
  }
2148
2149
  async deleteObject(bucket, key) {
2150
+ const encodedKey = key.split("/").map((seg) => encodeURIComponent(seg)).join("/");
2149
2151
  await this.client.request({
2150
2152
  service: "s3",
2151
2153
  region: this.region,
2152
2154
  method: "DELETE",
2153
- path: `/${bucket}/${key}`
2155
+ path: `/${bucket}/${encodedKey}`
2154
2156
  });
2155
2157
  }
2156
2158
  async deleteObjects(bucket, keys) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/ts-cloud",
3
3
  "type": "module",
4
- "version": "0.2.18",
4
+ "version": "0.2.19",
5
5
  "description": "A lightweight, performant infrastructure-as-code library and CLI for deploying both server-based (EC2) and serverless applications.",
6
6
  "author": "Chris Breuer <chris@stacksjs.com>",
7
7
  "license": "MIT",
@@ -89,8 +89,8 @@
89
89
  "test": "bun test"
90
90
  },
91
91
  "dependencies": {
92
- "@ts-cloud/aws-types": "0.2.18",
93
- "@ts-cloud/core": "0.2.18",
92
+ "@ts-cloud/aws-types": "0.2.19",
93
+ "@ts-cloud/core": "0.2.19",
94
94
  "@stacksjs/ts-xml": "^0.1.0"
95
95
  },
96
96
  "devDependencies": {